繁体   English   中英

ZBar Android扫描本地QR或条形码图像

[英]ZBar Android scan local QR or bar code image

我正在尝试通过ZBar扫描本地图像,但是由于ZBar没有提供任何有关Android的文档,而是仅提供了iPhone的详细文档,因此我自定义的相机测试活动过多。 但是我没有成功。

在ZBar cameratest活动中

PreviewCallback previewCb = new PreviewCallback() {
    public void onPreviewFrame(byte[] data, Camera camera) {
        Camera.Parameters parameters = camera.getParameters();
        Size size = parameters.getPreviewSize();

        Image barcode = new Image(size.width, size.height, "Y800");
        barcode.setData(data);

        int result = scanner.scanImage(barcode);

        if (result != 0) {
            previewing = false;
            mCamera.setPreviewCallback(null);
            mCamera.stopPreview();

            SymbolSet syms = scanner.getResults();
            for (Symbol sym : syms) {
                scanText.setText("barcode result " + sym.getData());
                barcodeScanned = true;
            }
        }
    }
};

我想自定义此代码,以便它使用图库中的本地图像并为我提供结果。 如何自定义此代码以提供来自画廊的本地图像并扫描该图像?

试试看:

Bitmap barcodeBmp = BitmapFactory.decodeResource(getResources(),
                                                 R.drawable.barcode);
int width = barcodeBmp.getWidth();
int height = barcodeBmp.getHeight();
int pixels = new int;
barcodeBmp.getPixels(pixels, 0, width, 0, 0, width, height);
Image barcode = new Image(width, height, "RGB4");
barcode.setData(pixels);
int result = scanner.scanImage(barcode.convert("Y800"));

或使用API​​,请参阅HOWTO:使用API​​扫描图像

Zbar扫描仪的Java端口仅接受Y800和GREY像素格式( https://github.com/ZBar/ZBar/blob/master/java/net/sourceforge/zbar/ImageScanner.java ),对于从相机预览。 但是Androis画廊中的图像通常采用JPEG修饰,其像素不在Y800中,因此您可以通过将图像的像素转换为Y800格式来使扫描仪正常工作。 请参阅官方支持论坛的主题以获取示例代码。 要计算像素数组的长度,只需使用imageWidth * imageHeight公式即可。

@shujatAli您的示例图像调色板的格式为灰度,将其转换为RGB可以使您的代码段对我有用。 您可以使用某些图像处理程序来更改托盘的格式。 我用了GIMP。

对于Android,我不清楚,但在iOS上,方法如下:

//Action when user tap on button to call ZBarReaderController

- (IBAction)brownQRImageFromAlbum:(id)sender {
    ZBarReaderController *reader = [ZBarReaderController new];
    reader.readerDelegate = self;
    reader.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; // Set ZbarReaderController point to the local album
    ZBarImageScanner *scanner = reader.scanner;
    [scanner setSymbology: ZBAR_QRCODE
                   config: ZBAR_CFG_ENABLE
                       to: 1];
    [self presentModalViewController: reader animated: YES];

}


- (void) imagePickerController: (UIImagePickerController *) picker
                  didFinishPickingMediaWithInfo: (NSDictionary *) info {

    UIImage *imageCurrent = (UIImage*)[info objectForKey:UIImagePickerControllerOriginalImage];
    self.imageViewQR.image = imageCurrent;
    imageCurrent = nil;

    // ADD: get the decode results
    id<NSFastEnumeration> results =
    [info objectForKey: ZBarReaderControllerResults];
    ZBarSymbol *symbol = nil;
    for (symbol in results)
        break;

    NSLog(@"Content: %@", symbol.data);

    [picker dismissModalViewControllerAnimated: NO];
}

参考以获取更多详细信息:http: //zbar.sourceforge.net/iphone/sdkdoc/optimizing.html

HOWTO的想法:使用API​​扫描图像

#include <iostream>
#include <Magick++.h>
#include <zbar.h>

using namespace std;
using namespace zbar;

int main (int argc, char **argv)
{
    if(argc < 2)
        return(1);

    // Create a reader
    ImageScanner scanner;

    // Configure the reader
    scanner.set_config(ZBAR_NONE, ZBAR_CFG_ENABLE, 1);

    // Obtain image data
    Magick::Image magick(argv[1]);  // Read an image file
    int width = magick.columns();   // Extract dimensions
    int height = magick.rows();
    Magick::Blob blob;              // Extract the raw data
    magick.modifyImage();
    magick.write(&blob, "GRAY", 8);
    const void *raw = blob.data();

    // Wrap image data
    Image image(width, height, "Y800", raw, width * height);

    // Scan the image for barcodes
    int n = scanner.scan(image);

    // Extract results
    for (Image::SymbolIterator symbol = image.symbol_begin();
        symbol != image.symbol_end();
        ++symbol) {

        // Do something useful with results
        cout << "decoded " << symbol->get_type_name()
             << " symbol \"" << symbol->get_data() << '"' << endl;
    }

    // Clean up
    image.set_data(NULL, 0);

    return(0);
}

请遵循上面的代码并进行更改,以使其与您的语言编程相关。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM