2

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

在 ZBar 相机测试活动中

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

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

4

4 回答 4

4

试试这个:

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 扫描图像

于 2014-01-06T03:44:20.210 回答
1

Zbar 扫描仪的 Java 端口仅接受 Y800 和灰色像素格式(https://github.com/ZBar/ZBar/blob/master/java/net/sourceforge/zbar/ImageScanner.java),这对于从相机预览。但是来自 Androis's Gallery 的图像通常是 JPEG 压缩的,并且它们的像素不在 Y800 中,因此您可以通过将图像的像素转换为 Y800 格式来使扫描仪工作。有关示例代码,请参阅官方支持论坛的主题。要计算像素数组长度,只需使用 imageWidth*imageHeight 公式。

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

于 2013-08-08T13:48:17.373 回答
1

我不清楚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

于 2013-12-23T10:53:27.673 回答
-2

来自 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);
}

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

于 2014-01-07T07:27:13.220 回答