【问题标题】:Reading PNG file: BitmapFactory vs ImageIO读取 PNG 文件:BitmapFactory 与 ImageIO
【发布时间】:2014-08-06 01:43:02
【问题描述】:

我正在尝试使用 ImageIO 读取和修改 png 图像,并将其作为 Android 中的可绘制资源读取。

现在java代码如下:

BufferedImage im = ImageIO.read(new File(inFilePath));
WritableRaster raster = image.getRaster();
DataBufferByte buffer = (DataBufferByte) raster.getDataBuffer();
byte imBytes[] = buffer.getData();

这给了我一个大小约为 140k 的字节数组,用于示例文件。 接下来我尝试使用 BitmapFactory 读取它:

Drawable drawable = context.getResources().getDrawable(getImageResourceIdWithKeys());
Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 200, stream);
byte[] imBytes = stream.toByteArray();

这给了我一个大小约为 52k 的字节数组,接下来将其作为原始资源读取会得到大约 24k,这是磁盘上的大小。现在我知道PNG文件在磁盘上是压缩的,但是我不明白为什么在获取未压缩版本时会得到不同的字节数组。有什么方法可以在 Android 上以相同的方式读取图像并使用标准 Java API 吗?

【问题讨论】:

    标签: java android javax.imageio bitmapfactory


    【解决方案1】:

    你在这里比较苹果和橘子。

    在您的第一个 (ImageIO/BufferedImage) 示例中,imBytes 是未压缩的像素数据(可能是 RGB 或 ARGB 格式,但取决于输入)。

    在您的第二个(Android/位图)示例中,imBytes 是 PNG 压缩数据,由 Android 压缩并使用默认设置。在 Android 上读取/解码后,图像数据可能会扩展为 ARGB,因此您的输出将是 (A)RGB PNG。这可能需要比您的原始输入更多的字节,特别是如果磁盘上的原始文件是调色板格式。

    Java2D 和 Android 平台具有不同的图形基元,因此我不确定您如何满足“以相同方式读取图像”...无论如何,BitmapFactory 可能是您获得的最接近的等价物在 Android 上ImageIO。同理Bitmap大致等价于BufferedImage

    即。 ImageIO/Java2D:

    BufferedImage im = ImageIO.read(new File(inFilePath));
    
    int[] argbPixels = new int[im.getWidth() * im.getHeight()]; // Could also let getRGB allocate this array, but doing it like this to make it more similar to Android
    im.getRGB(0, 0, im.getWidth(), im.getHeight(), argbPixels, 0, im.getWidth());
    

    安卓:

    Bitmap bm = BitmapFactory.decodeFile(inFilePath);
    
    int[] argbPixels = new int[bm.getWidth() * bm.getHeight()];
    bm.getPixels(argbPixels, 0, bm.getWidth(), 0, 0, bm.getWidth(), bm.getHeight();
    

    不确定 Android,但至少 Java2D 会在 sRGB 颜色空间中返回 ARGB 值。如果 Android 也这样做,argbPixels 数组应该是相同的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多