Android изменить необработанные данные PNG

У меня есть файл 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-й элемент, который является некоторым значением в данных изображения.


person paul simmons    schedule 21.07.2013    source источник


Ответы (1)


Формат файла PNG хранит данные изображения в сжатой форме. Изменение только одного байта где-то, вероятно, делает недействительной внутреннюю контрольную сумму, что приводит к недопустимому изображению, поэтому вы не можете этого сделать. Кроме того, каждый фрагмент PNG защищен 32-битной контрольной суммой CRC., поэтому любая модификация любой части файла требует обновления по крайней мере контрольной суммы фрагмента, который вы изменяете.

Если вы хотите изменить пиксели изображения, будет проще сначала декодировать данные PNG, используя доступные вам библиотеки, такие как BitmapFactory и Bitmap на Android.

Bitmap png = BitmapFactory.decodeFile(selectedImagePath);
png.setPixel(34,43,0xFFFF0000);
person Joni    schedule 21.07.2013
comment
на самом деле моя основная задача - изменить информацию о палитре. это также сжато (я могу понять данные о пикселях изображения, но заголовок)? где контрольная сумма? я не могу найти такую ​​информацию в спецификациях png. - person paul simmons; 21.07.2013
comment
Информация о палитре появляется в фрагменте PLTE и не сжимается. Но это появляется только в изображениях на основе палитры. - person Lee Daniel Crocker; 21.07.2013
comment
Каждый фрагмент имеет контрольную сумму CRC: libpng.org/pub/png/spec /1.1/PNG-Структура.html - person Joni; 21.07.2013