Извлечение растрового изображения из файла PostScript (CIP3)

Я задал аналогичный вопрос несколько месяцев назад по следующей ссылке: ">Создание кода для распаковки байтового RLE-изображения

И я также прочитал этот вопрос (был ближе к моему): Извлечь растровое изображение из PostScript

Я имею дело с файлами CIP3, которые в основном представляют собой файлы PostScript с несколькими дополнительными элементами. Важными здесь являются: Матрица изображения Ширина/высота изображения Данные изображения

Данные изображения представляют собой данные, закодированные RLE, и у меня есть код для декодирования RLE из вопроса, который я задал несколько месяцев назад. Код работает, я проверил его на некоторых файлах примеров, которые у меня есть.

Однако взгляните на эту таблицу: CIP3 Image Orientation Reference

У меня все работает только в случаях 1 и 2. Однако, когда дело доходит до чтения «справа налево» или «снизу вверх», я не могу заставить его работать.

Я пробовал: Функция LINQ Reverse() - по-прежнему создает недопустимое изображение. Переверните массив байтов с помощью обычного цикла for - недопустимое изображение также. Переверните файл после его декодирования - недопустимое изображение.

Это код для декодирования изображения RLE:

class RLEDecompressor
{
    public byte[] rleDecompressed { get; private set; }
    public RLEDecompressor(byte[] byteFile)
    {
        List<byte> final = new List<byte>();
        int i = 0;
        while (i < byteFile.Length)
        {
            try
            {
                var lengthByte = byteFile[i++]; //First run, position 1
                if (lengthByte <= 127)
                {
                    int currLen = lengthByte + 1;
                    for (int j = 0; j < currLen; j++)
                        final.Add(byteFile[i++]);
                }
                else
                {
                    int currLen = 257 - lengthByte;
                    byte byteToCopy = byteFile[i++];
                    for (int j = 0; j < currLen; j++)
                        final.Add(byteToCopy);
                }
            }
            catch (Exception ex)
            {
                rleDecompressed = final.ToArray();
                break;
            }
        }
        rleDecompressed = final.ToArray();

    }

Я ожидал, что вывод будет допустимым изображением. Однако все результаты, которые я получил, были размытыми изображениями или «чем-то еще» (недействительным изображением).

Я предоставляю образец файла, который я пытаюсь декодировать. Ссылка: https://drive.google.com/open?id=1iTSyCKTzXGPyONejXnw28KEDacjIpBUl&fbclid=IwAR2DujV_eYBA8Ees6LRWUVcQio0cJ5EIpb4ck1BT6xmcRdpXGVubf57BHh4

Ширина изображения: 2061

Высота изображения: 1571

Каналы: 1

Если все расшифровано правильно, изображение можно просмотреть в Photoshop (просто сохраните его с расширением .raw).

Спасибо заранее за любые данные.


person paboobhzx    schedule 06.08.2019    source источник


Ответы (1)


Кажется, вы поменяли местами значения ширины изображения и высоты изображения. Декодированные данные можно прочитать в Gimp как «необработанные данные изображения», используя следующие настройки:

  • Тип изображения: Индексированное
  • Смещение: 0
  • Ширина: 1571
  • Высота: 2016 г.
  • Тип палитры: R, G, B (обычный)
  • Смещение палитры: 0
  • Файл палитры: Нет
person AlwaysLearning    schedule 06.08.2019
comment
Вы совершенно правы ! Честно говоря, я боролся с этой проблемой несколько дней. Теперь я должен проанализировать все свои файлы CIP3, чтобы понять, когда он действительно меняет местами ширину\высоту (это означает, что если он должен быть заменен, я должен поменять его также при создании изображения). Большое спасибо ! - person paboobhzx; 06.08.2019