如何使用新的 Google Vision API 生成条形码并将其转换为位图?

Posted

技术标签:

【中文标题】如何使用新的 Google Vision API 生成条形码并将其转换为位图?【英文标题】:How to generate an Barcode and convert it to Bitmap using new Google Vision API? 【发布时间】:2016-01-31 14:03:09 【问题描述】:

Barcode barcode = new Barcode();
Barcode.Email email = new Barcode.Email();
email.address = "my_email@gmail.com";
email.subject = "My Subject;
email.body = "My body content.";
barcode.email = email;

//实现转换 位图barcodeImage = barcodeToBitmap(barcode);//这部分我知道。

【问题讨论】:

是的,请添加平台标签或在您的问题中描述它将在哪些移动平台上运行。 好的。这是关于 android 的。 我在想如果新的 google play 服务无法进行转换,所以我必须使用像 ZXing 库这样的第三方库,我只是觉得为什么我需要新的带有 Version API 的 Google Play 服务。 查看link。 嗨投降库马尔,谢谢你的回答。 【参考方案1】:

您可以使用 Google Vision API 检测您的条形码,然后使用 ZXing 生成条形码。 你可以试试这样,它使用 zxing 库:

public static Bitmap getBitmap(String barcode, int barcodeType, int width, int height)

    Bitmap barcodeBitmap = null;
    BarcodeFormat barcodeFormat = convertToZXingFormat(barcodeType);
    try
    
        barcodeBitmap = encodeAsBitmap(barcode, barcodeFormat, width, height);
    
    catch (WriterException e)
    
        e.printStackTrace();
    
    return barcodeBitmap;


private static BarcodeFormat convertToZXingFormat(int format)

    switch (format)
    
        case 8:
            return BarcodeFormat.CODABAR;
        case 1:
            return BarcodeFormat.CODE_128;
        case 2:
            return BarcodeFormat.CODE_39;
        case 4:
            return BarcodeFormat.CODE_93;
        case 32:
            return BarcodeFormat.EAN_13;
        case 64:
            return BarcodeFormat.EAN_8;
        case 128:
            return BarcodeFormat.ITF;
        case 512:
            return BarcodeFormat.UPC_A;
        case 1024:
            return BarcodeFormat.UPC_E;
        //default 128?
        default:
            return BarcodeFormat.CODE_128;
    



/**************************************************************
 * getting from com.google.zxing.client.android.encode.QRCodeEncoder
 *
 * See the sites below
 * http://code.google.com/p/zxing/
 * http://code.google.com/p/zxing/source/browse/trunk/android/src/com/google/zxing/client/android/encode/EncodeActivity.java
 * http://code.google.com/p/zxing/source/browse/trunk/android/src/com/google/zxing/client/android/encode/QRCodeEncoder.java
 */

private static final int WHITE = 0xFFFFFFFF;
private static final int BLACK = 0xFF000000;

private static Bitmap encodeAsBitmap(String contents, BarcodeFormat format, int img_width, int img_height) throws WriterException

    if (contents == null) 
        return null;
    
    Map<EncodeHintType, Object> hints = null;
    String encoding = guessAppropriateEncoding(contents);
    if (encoding != null) 
        hints = new EnumMap<>(EncodeHintType.class);
        hints.put(EncodeHintType.CHARACTER_SET, encoding);
    
    MultiFormatWriter writer = new MultiFormatWriter();
    BitMatrix result;
    try 
        result = writer.encode(contents, format, img_width, img_height, hints);
     catch (IllegalArgumentException iae) 
        // Unsupported format
        return null;
    
    int width = result.getWidth();
    int height = result.getHeight();
    int[] pixels = new int[width * height];
    for (int y = 0; y < height; y++) 
        int offset = y * width;
        for (int x = 0; x < width; x++) 
            pixels[offset + x] = result.get(x, y) ? BLACK : WHITE;
        
    

    Bitmap bitmap = Bitmap.createBitmap(width, height,
            Bitmap.Config.ARGB_8888);
    bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
    return bitmap;


private static String guessAppropriateEncoding(CharSequence contents) 
    // Very crude at the moment
    for (int i = 0; i < contents.length(); i++) 
        if (contents.charAt(i) > 0xFF) 
            return "UTF-8";
        
    
    return null;

【讨论】:

上面的代码没问题,但是要小心使用高的宽度和高度值(创建位图会花费太长时间),最好保持这个值较低,而不是像here解释的那样调整位图大小/跨度> 【参考方案2】:

您可以使用 zxing 库从字符串条形码生成位图

public static Bitmap getBitmapFromBarcode(String barcode) 
        Bitmap barcodeBitmap = null;
        try 
            BarcodeEncoder barcodeEncoder = new BarcodeEncoder();

            barcodeBitmap = barcodeEncoder.encodeBitmap(barcode, BarcodeFormat.CODE_128, 240, 80);
         catch (Exception e) 
            e.printStackTrace();
        
        return barcodeBitmap;
    

要将 zxing 添加到您的项目中,请转到 https://github.com/journeyapps/zxing-android-embedded

【讨论】:

以上是关于如何使用新的 Google Vision API 生成条形码并将其转换为位图?的主要内容,如果未能解决你的问题,请参考以下文章

如何提高google cloud vision api的处理速度?

如何使用 google vision api 从图像中进行文本检测?

如何使用 Google Cloud Vision API 读取一列文本

如何使用 Google Vision Api 检测块内的所有文本

如何通过HTTP请求验证Google Cloud Vision

如何使用 Google Cloud Vision API 确认图像(包含手写和打印文本)是不是包含手写文本?