Переупаковка TIFF с помощью LibTiff.Net в Silverlight

Все, что мне нужно, это взять файл TIFF, открыть его и скопировать в новый файл при использовании сжатия G4.

Итак, я взял LibTiff.Net и утилиту TiffCP. Я сделал все возможное, чтобы преобразовать код из TIffCP, и вот функция, которая у меня есть:

public static byte[] ConvertToG4Tiff(byte[] input)
{
    var c = new Copier();

    // Set compression to g4
    if (!c.ProcessCompressOptions("g4")) return null;

    // Open output tiff
    var memoryStream = new MemoryStream();
    var tiffStream = new TiffStream();
    using (var outImage = Tiff.ClientOpen(string.Empty, "w", memoryStream, tiffStream))
    {
        using (var inImage = Tiff.ClientOpen(string.Empty, "read", new MemoryStream(input), new TiffStream()))
        {
            if (inImage == null) return null;

            int totalPages = inImage.NumberOfDirectories();
            for (var i = 0; i < totalPages;)
            {
                c.m_config = PlanarConfig.UNKNOWN;
                c.m_compression = c.m_defcompression;
                c.m_predictor = c.m_defpredictor;
                c.m_fillorder = 0;
                c.m_rowsperstrip = 0;
                c.m_tilewidth = -1;
                c.m_tilelength = -1;
                c.m_g3opts = c.m_defg3opts;

                if (!inImage.SetDirectory((short)i)) return null;
                if (!c.Copy(inImage, outImage) || !outImage.WriteDirectory()) return null;

                i++;
            }
        }

        var retVal = new byte[tiffStream.Size(memoryStream)];
        tiffStream.Read(memoryStream, retVal, 0, retVal.Length);
        return retVal;
    }
}

Я думаю, что в последних 3 строчках я напортачил. Я получаю обратно действительный байтовый массив (есть данные, и это около 10% от исходного несжатого TIFF)

Когда я снова пытаюсь открыть его с помощью кода - он не открывается. Передача этого нового массива через ту же функцию не сработает. Открытый объект - ПУСТО.

Что я сделал не так?


person katit    schedule 23.10.2012    source источник


Ответы (1)


Вы должны использовать memoryStream для извлечения сжатых данных. Не используйте tiffStream для чего-либо в таком коде.

Так что

var retVal = new byte[tiffStream.Size(memoryStream)];
tiffStream.Read(memoryStream, retVal, 0, retVal.Length);
return retVal;

вероятно, следует изменить на

var retVal = memoryStream.ToArray();
return retVal;

Также обратите внимание, что ваш код не будет преобразовывать данные, поэтому, если входные байты не являются растром 1bpp, код завершится ошибкой.

Непонятно, зачем вам передавать сжатые данные в один и тот же код.

person Bobrovsky    schedule 23.10.2012
comment
Да, такое изменение кода работает! Я передавал сжатые данные в тот же код, чтобы проверить, есть ли у меня правильный вывод, этого нет в окончательном коде. Спасибо за замечание о преобразовании. Мне нужно подробнее изучить спецификации TIFF, но я думаю, что это будет нормально. Я работаю с клиентами, у которых есть огромная база документов, и все они отсканированы без сжатия ... Это то, с чем я тестирую. - person katit; 23.10.2012