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

ZBar Android扫描本地QR或条形码图像,android,zbar-sdk,zbar,Android,Zbar Sdk,Zbar,我正在尝试扫描本地图像,但由于ZBar没有提供任何Android文档,只是提供了太多定制的摄像头测试活动。但我没有取得任何成功 在ZBar cameratest活动中 PreviewCallback previewCb = new PreviewCallback() { public void onPreviewFrame(byte[] data, Camera camera) { Camera.Parameters parameters = camera.getPara

我正在尝试扫描本地图像,但由于ZBar没有提供任何Android文档,只是提供了太多定制的摄像头测试活动。但我没有取得任何成功

在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;
            }
        }
    }
};

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

Zbar扫描仪的Java端口仅接受Y800和灰色像素格式,这对于从相机预览捕获的原始字节是合适的。但是Androis画廊的图像通常是JPEG压缩的,它们的像素不是Y800格式,所以你可以通过将图像的像素转换成Y800格式来让扫描仪工作。有关示例代码,请参阅官方支持论坛的线程。要计算像素数组长度,只需使用imageWidth*imageHeight公式


@shujatAli您的示例图像调色板的格式是灰度,将其转换为RGB使您的代码片段适合我。您可以使用一些图像处理程序更改pallete的格式。我使用了GIMP。

Zbar扫描仪的Java端口只接受Y800和灰色像素格式,这对于从相机预览中捕获的原始字节是合适的。但是Androis画廊的图像通常是JPEG压缩的,它们的像素不是Y800格式,所以你可以通过将图像的像素转换成Y800格式来让扫描仪工作。有关示例代码,请参阅官方支持论坛的线程。要计算像素数组长度,只需使用imageWidth*imageHeight公式


@shujatAli您的示例图像调色板的格式是灰度,将其转换为RGB使您的代码片段适合我。您可以使用一些图像处理程序更改pallete的格式。我使用了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];
}

参考了解更多详细信息:

我不清楚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];
}
参考了解更多详细信息:

尝试以下方法:

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,请参阅。

尝试以下操作:

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,请参阅以下内容中的创意:

按照上述代码进行更改,使其与您的语言编程相关。

创意来源:


按照上面的代码进行更改,使其与您的语言编程相关。

适用于Android使用-这里的教程:Zxing是一款外部应用程序。如果移动用户中未安装Zxing应用程序,则用户必须从playstore下载Zxing应用程序。在我的项目中,As Zbar作为库包含在我需要的地方。对于Android使用-这里的教程:Zxing是一个外部应用程序。如果移动用户中未安装Zxing应用程序,则用户必须从playstore下载Zxing应用程序。在我的项目中,As Zbar作为库包含在我需要的地方。Zbar有非常详细的文档。我在ios上没有问题。但是没有android zbar sdk的文档。所以我需要android zbar方面的帮助sdkzbar有非常详细的文档。我在ios上没有问题。但是没有android zbar sdk的文档。所以我需要安卓系统的帮助zbar sdki早就尝试过了。但它给出了令牌int的语法错误,这一行中该令牌后面的维度应该是。我在sourceforge android开发者论坛上找到了与您相同的答案。对于将来的读卡器,像素应初始化为int[]像素=新int[width*height];我很久以前就试过了。但它给出了令牌int的语法错误,这一行中该令牌后面的维度应该是。我在sourceforge android开发者论坛上找到了与您相同的答案。对于将来的读卡器,像素应初始化为int[]像素=新int[width*height];