0

我的项目中有一个 PNG 文件,我想在运行时更改一些值。

    ByteArrayOutputStream output = new ByteArrayOutputStream();

    try {
        InputStream input = getIntro().getAssets().open("image.png");
        byte[] tmp = new byte[1024];
        int ret = 0;
        while ((ret = input.read(tmp, 0, 1024)) >= 0) {
            output.write(tmp, 0, ret);
        }
    } catch (IOException ex) {
        System.out.print(ex);
    }

    byte[] imgArray = output.toByteArray();

    imgArray[1000] = (byte) Color.red(Const.SOMEVALUE);

    return BitmapFactory.decodeByteArray(imgArray, 0, imgArray.length);

无论我做什么imgArray[1000] = (byte) Color.red(MyApplication.COLOR_BOARD_BG),我都会得到一个空图像。如果我不使用该行并手动修改字节数组就可以了,但是我更改的任何内容(在标题或正文中)都没有不同 = 空白图像。

实际上,我尝试修改调色板信息,但作为示例,我更改了第 1000 个元素,它是图像数据中的某个值。

4

1 回答 1

0

PNG 文件格式以压缩形式存储图像数据。仅在某处更改一个字节可能会使内部校验和无效,从而导致图像无效,因此您不能这样做。除此之外,每个 PNG 块都受到 32 位 CRC 校验和的保护,因此对文件任何部分的任何修改都需要至少更新您修改的块的校验和

如果您想修改图像的像素,首先使用可用的库(如 Android 上的 BitmapFactory 和 Bitmap)解码 PNG 数据会更容易。

Bitmap png = BitmapFactory.decodeFile(selectedImagePath);
png.setPixel(34,43,0xFFFF0000);
于 2013-07-21T09:22:58.810 回答