[英]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
#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.