Почему редактирование PNG файла приводит к тому, что текст исчезает? - PullRequest
0 голосов
/ 20 ноября 2018

Мне действительно нужны некоторые предложения здесь.

Я пытаюсь вручную добавить блок tEXt в существующий файл PNG только для учебных целей.

Несмотря на то, что он оказался успешным, после обсужденияредактируя изображение, например удаляя небольшую часть с изображения или поворачивая его и сохраняя, мой текстовый блок исчез.Может быть, какая-то часть моего кода пошла не так, некоторые обзоры были бы оценены.

byte[] RAWFILEBYTES = new byte[(int) pngFile.length()];
            FileInputStream ins = new FileInputStream(pngFile);

        for (int i = 0; i < RAWFILEBYTES.length; i++) {
            RAWFILEBYTES[i] = (byte) ins.read();
        }

        byte[] size = {(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x0e};
        byte[] crc32 = new byte[4];
        String chunkNameAndKey = "tEXtGreeting";
        String value = "hello";

        //Declaring size equal to the length of chunk name + key value pair
        byte[] tEXtAndValue = new byte[chunkNameAndKey.getBytes().length + 1 + value.getBytes().length];

        //Forming byte array of chunk name and key value pair
        System.arraycopy(chunkNameAndKey.getBytes(), 0, tEXtAndValue, 0, chunkNameAndKey.getBytes().length);
        tEXtAndValue[chunkNameAndKey.getBytes().length] = (byte) 0x00; //Follow specification key pair value separate by null
        System.arraycopy(value.getBytes(), 0, tEXtAndValue, chunkNameAndKey.getBytes().length + 1, value.getBytes().length);

        //Calculating checksum comprise of chunk name and value
        //E.g. tEXtGreeting[null]hello
        Checksum checksum = new CRC32();
        checksum.update(tEXtAndValue, 0, tEXtAndValue.length);

        //Convert checksum result to 4 bytes according to PNG.
        ByteBuffer buffer = ByteBuffer.allocate(Long.BYTES);
        buffer.putLong(checksum.getValue());   
        System.arraycopy(buffer.array(), buffer.array().length - 4, crc32, 0, 4);

        //Entire tEXt chunk comprise of size, chunk name, key-value pair and CRC in order.
        byte[] textChunkArr = new byte[4 + tEXtAndValue.length + 4];
        System.arraycopy(size, 0, textChunkArr, 0, size.length);
        System.arraycopy(tEXtAndValue, 0, textChunkArr, size.length, tEXtAndValue.length);
        System.arraycopy(crc32, 0, textChunkArr, size.length + tEXtAndValue.length, crc32.length);

        byte[] byte_array = new byte[RAWFILEBYTES.length + textChunkArr.length];

        //Place the text chunk directly before IEND chunk.
        System.arraycopy(RAWFILEBYTES, 0, byte_array, 0, RAWFILEBYTES.length - 12);
        System.arraycopy(textChunkArr, 0, byte_array, RAWFILEBYTES.length - 12, textChunkArr.length);
        System.arraycopy(RAWFILEBYTES, RAWFILEBYTES.length - 12, byte_array, RAWFILEBYTES.length - 12 + textChunkArr.length, 12);

        try (FileOutputStream fos = new FileOutputStream("final2_file.png")) {
            fos.write(byte_array);
        }

В заключение, что я пытаюсь сделать, я создаю и вставляю блок tEXt вручную непосредственно перед блоком IEND.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...