Android Bitmap.getPixels()从BufferedImage.getRGB()返回不同的数据

时间:2011-10-19 20:26:16

标签: android bitmap bufferedimage

我已经生成了测试条形码图片,

barcode

http://generator.onbarcode.com/linear.aspx?TYPE=7&DATA=ID%3ao0123456789&UOM=0&X=1&Y=60&LEFT-MARGIN=0&RIGHT-MARGIN=0&TOP-MARGIN=0&BOTTOM-MARGIN=0&RESOLUTION=0&ROTATE=0&BARCODE-WIDTH=0&BARCODE-HEIGHT=0&SHOW-TEXT=true&TEXT-FONT=Arial|9|Regular&TextMargin=6&FORMAT=png&PROCESS-TILDE=false

我在本地保存并尝试使用简单的java程序加载它并打印出第一个扫描行,如下所示:

File bmpFile = new File("barcode.bmp");
BufferedImage img;
try {
    img = ImageIO.read(bmpFile);
    int[] pixels = img.getRGB(0, 0, img.getWidth(), img.getHeight(), null, 0, img.getWidth());
    int w = img.getWidth();
    for (int i = 0; i< w; i++) {
        System.out.print(pixels[i]+", ");
    }
    System.out.println();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

然后我尝试使用以下代码

在模拟器上的Android应用中加载位图
Bitmap barcode = BitmapFactory.decodeResource(context.getResources(), R.raw.barcode);
Config cfg = globe.getConfig();
int w = barcode.getWidth();

for (int i = 0; i < w; i++) {
    int color = barcode.getPixel(i, 0);
    System.out.print(color+", ");
}
System.out.println();

令人难以置信的是,这两个简单的应用程序必须完全不同的扫描线数据。

来自Java程序的

扫描线数据:

-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-16777216,-16777216,-1,-16777216,-1,-1 ,-16777216,-1,-1,-1,-1,-16777216,-16777216,-1,-1,-1,-16777216,-1,-1,-1,-16777216,-1, - 16777216,-1,-16777216,-16777216,-1,-1,-1,-16777216,-1,-1,-1,-16777216,-16777216,-16777216,-1,-1,-16777216, -1,-1,-16777216,-16777216,-1,-16777216,-1,-1,-1,-16777216,-16777216,-16777216,-16777216,-1,-16777216,-1,-16777216 ,-1,-16777216,-16777216,-16777216,-1,-16777216,-16777216,-16777216,-16777216,-1,-16777216,-16777216,-1,-1,-16777216,-16777216, - 1,-16777216,-16777216,-1,-1,-16777216,-16777216,-16777216,-1,-16777216,-16777216,-1,-16777216,-16777216,-16777216,-1,-16777216, -1,-16777216,-16777216,-16777216,-1,-16777216,-16777216,-1,-1,-1,-16777216,-1,-1,-1,-1,-16777216,-1 ,-16777216,-16777216,-1,-1,-16777216,-16777216,-1,-16777216,-16777216,-1,-16777216,-16777216,-16777216,-16777216,-1,-16777216, - 1,-16777216, -16777216,-1,-1,-1,-16777216,-1,-1,-1,-16777216,-16777216,-1,-1,-1,-16777216,-16777216,-16777216,-1 ,-16777216,-1,-16777216,-16777216,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,


来自Android应用的扫描线数据

-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2170914,-13026247 ,-16777216,-15197160,-4342083,-7565684,-15197160,-4342083,-1,-2170914,-13026247,-9736853,-1,-1,-1,-1,-1,-7565684, - 16777216,-16777216,-9736853,-1,-1,-1,-1052689,-13026247,-9736853,-1,-1,-1,-1052689,-13026247,-10855078,-1052689,-13026247, -10855078,-1052689,-13026247,-16777216,-16249848,-4342083,-1,-1,-1,-6512996,-16249848,-4342083,-1,-1,-1,-6512996,-16777216 ,-16777216,-16777216,-16249848,-5394771,-1,-1052689,-11907766,-10855078,-1,-1,-6512996,-16777216,-16777216,-10855078,-1,-11907766, - 10855078,-1,-1,-1,-1,-11907766,-16777216,-16777216,-16777216,-16777216,-16777216,-5394771,-5394771,-16777216,-5394771,-5394771,-16777216, -5394771,-5394771,-16777216,-16777216,-16777216,-16777216,-5394771,-5394771,-16777216,-16777216,-16777216,-16777216,-16777216,-11907766,-1,-10855078,-16777216 ,-16777216,-6512996,-1,-1,-108550 78,-16777216,-16777216,-6512996,-5394771,-16249848,-16777216,-11907766,-1052689,-1,-5394771,-16249848,-16777216,-16777216,-16777216,-6512996,-5394771, -16249848,-16777216,-13026247,-1052689,-10855078,-16777216,-16777216,-16777216,-13026247,-1052689,-10855078,-13026247,-1052689,-10855078,-16777216,-16777216,-16777216 ,-13026247,-1052689,-9736853,-16777216,-16777216,-7565684,-1,-1,-1,-4342083,-16249848,-7565684,-1,-1,-1,-1, - 1,-9736853,-13026247,-2170914,-9736853,-16777216,-16777216,-7565684,-1,-1,-9736853,-16777216,-16777216,-7565684,-4342083,-15197160,-16777216, -14078935,-2170914,-9736853,-16777216,-16777216,-16777216,-16777216,-16777216,-7565684,-3223602,-15197160,-7565684,-3223602,-15197160,-16777216,-14078935,-2170914 ,-1,-1,-1,-8684165,-14078935,-2170914,-1,-1,-1,-8684165,-16777216,-16777216,-8684165,-1,-1,-1, - 3223602,-14078935,-16777216,-16777216,-16777216,-8684165,-3223602,-1407 8935,-8684165,-3223602,-14078935,-16777216,-15197160,-3223602,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,

在我看来,java程序的扫描线数据更合理。在Android应用中,我尝试将位图放在 res / drawable / res / raw / 下,但是,返回相同的扫描线数据。有人可以告诉我这是怎么发生的吗?

3 个答案:

答案 0 :(得分:1)

要更改图像类型,可以使用以下代码。代码经过测试。

BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inPreferredConfig = Bitmap.Config.ARGB_8888;
Bitmap mBitmap = BitmapFactory.decodeFile(imagePath, opt); 

但这没有用。我在JDK和Android上有不同数字(来自getPixel和getRGB)的类似问题。

但是,我的代码是在客户端(android)和服务器(JDK)上计算直方图。然后他们必须进行比较。

问题解决了吗?

UPD。当时的问题是JPG格式。

答案 1 :(得分:1)

您是否从drawables文件夹中加载位图?我有一个问题,在某些设备上,在这种情况下位图会稍微改变。我通过将位图资源放在原始文件夹

中解决了这个问题

答案 2 :(得分:0)

看起来你正在565中加载位图。将一个BitmapFactory.Options传递给decode()并在ARGB_8888中强制解码。