【问题标题】:Android change raw PNG dataAndroid 更改原始 PNG 数据
【发布时间】:2013-07-20 04:42:15
【问题描述】:

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

【问题讨论】:

    标签: android png color-palette


    【解决方案1】:

    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);
    

    【讨论】:

    • 实际上我主要关心的是更改调色板信息。那也是压缩的(我可以理解图像像素数据,但标题)?校验和在哪里?我在 png 规范中找不到此类信息。
    • 调色板信息出现在 PLTE 块中,并且未压缩。但这仅出现在基于调色板的图像中。
    • 每个块都有一个CRC校验和:libpng.org/pub/png/spec/1.1/PNG-Structure.html
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-06
    • 1970-01-01
    • 2014-06-14
    • 2012-07-06
    • 2010-09-25
    • 1970-01-01
    相关资源
    最近更新 更多