1

我有一个在java中读取条形码的代码,如果图像只包含条形码,它工作得很好,但是如果我尝试以图像形式读取条形码,它就不起作用。但是,如果我将条形码图像合并并粘贴并创建新图像,它就可以工作。

从上面的场景中,我发现如果图像只包含条形码,则代码工作正常,但如果它也包含其他数据,那么它就会失败。

请在下面找到我用来读取条形码的代码。

package com.life;

import java.awt.image.BufferedImage;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import com.google.zxing.Reader;
import javax.imageio.ImageIO;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.ChecksumException;
import com.google.zxing.FormatException;
import com.google.zxing.LuminanceSource;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.NotFoundException;
import com.google.zxing.Result;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.common.HybridBinarizer;

public class BarcodeGeneration {

public static void main(String[] args) throws IOException {
    InputStream barCodeInputStream = new FileInputStream("C:\\Destination\\AE973220_P01.TIF");  
    BufferedImage barCodeBufferedImage = ImageIO.read(barCodeInputStream);  

    LuminanceSource source = new BufferedImageLuminanceSource(barCodeBufferedImage);  
    BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));  
    Reader reader = new MultiFormatReader();  
    Result result;
    try {
        result = reader.decode(bitmap);
        Systemwhi.out.println("Barcode text is " + result.getText());
    } catch (NotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (ChecksumException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (FormatException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }  


}

}

有什么方法可以读取确切的图像位置,例如:仅使用 x 和 y 轴的图像中的条形码。

下面是我试图读取特定图像位置但没有工作的代码。

public static void main(String[] args) throws IOException {
    try {
    /*InputStream barCodeInputStream = new FileInputStream("C:/RinDestination/2012/12/2012-12-05/700466296/AE973220_P01.TIF");  
    BufferedImage barCodeBufferedImage = ImageIO.read(barCodeInputStream);
    LuminanceSource source = new BufferedImageLuminanceSource(barCodeBufferedImage);*/
    File imageFile=new File("C:/RinDestination/2012/12/2012-12-05/700466296/AD449293_P01.TIF" +
            "");
        BufferedImage image;
         image = ImageIO.read(imageFile);
         int height=image.getHeight();
         System.out.println("height---"+height);
         int width=image.getWidth();
         System.out.println("width---"+width);
         int minx=image.getTileHeight();
         System.out.println("minx---"+minx);
         int miny=image.getTileWidth();
         System.out.println("miny---"+miny);
         BufferedImage cropedImage = image.getSubimage(1654,-800,width,height );
         LuminanceSource source = new BufferedImageLuminanceSource(cropedImage);
    BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));  
    Reader reader = new MultiFormatReader();  
    Result result;

        result = reader.decode(bitmap);
        System.out.println("Barcode text is " + result.getText());
    //  byte[] b = result.getRawBytes();
    //  System.out.println(ByteHelper.convertUnsignedBytesToHexString(result.getText().getBytes("UTF8")));
        //System.out.println(ByteHelper.convertUnsignedBytesToHexString(b));
    } catch (NotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (ChecksumException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (FormatException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }  
}

但是上面的代码不起作用。请告知如何以图像形式读取条形码。

问候, 皮斯

4

2 回答 2

0

根据此错误,您传递的值超出了裁剪图像的范围

java.awt.image.RasterFormatException: y 位于 com 的 java.awt.image.BufferedImage.getSubimage(BufferedImage.java:1156) 处的 sun.awt.image.BytePackedRaster.createWritableChild(BytePackedRaster.java:1283) 处的光栅之外。 life.BarcodeGeneration.main(BarcodeGeneration.java:67)

所以我认为你的错误在这一行:

BufferedImage cropedImage = image.getSubimage(1654,-800,width,height);

因为它会抛出您的代码引发的错误getSubimage javadoc。您确定可以使用 y 的负值进行裁剪吗?

于 2013-07-22T07:54:05.843 回答
0

您的异常现在与您的图像有关。正如您在以下链接中看到的那样,它可以有多个来源,但我猜您的大小是 ;)

Zxing NotfoundException 线程

于 2013-07-22T11:51:11.317 回答