Android更改原始PNG数据

时间:2013-07-21 09:13:37

标签: android png color-palette

我的项目中有一个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个元素,这是图像数据中的某个值。

1 个答案:

答案 0 :(得分:0)

PNG文件格式以压缩格式存储图像数据。在某处更改一个字节可能会使内部校验和无效,从而导致图像无效,因此您无法执行此操作。除此之外,each PNG chunk is protected by a 32-bit CRC checksum,因此对文件任何部分的任何修改都需要至少更新你修改的块的校验和

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

Bitmap png = BitmapFactory.decodeFile(selectedImagePath);
png.setPixel(34,43,0xFFFF0000);