Почему некоторые файлы Tiff не загружаются с помощью TiffLib.NET

У меня проблемы с загрузкой файлов Tiff в C#. Я загрузил несколько образцов tiff-файлов и смог их нормально загрузить, однако, когда я пытаюсь загрузить любые tiff-файлы, сгенерированные из PCI Geomatica или ArcGIS, вызов ReadRGBAImage завершается ошибкой (возвращает false). Кроме IMAGEWIDTH и IMAGELENGTH, все другие теги, которые я пытался получить, вернули значение null (например, XRESOLUTION). У кого-нибудь есть идеи, почему это происходит? Соответствующий код приведен ниже:

using (Tiff tif = Tiff.Open(fileName, "r"))
        {
            // Find the width and height of the image
            FieldValue[] value = tif.GetField(TiffTag.IMAGEWIDTH);
            int width = value[0].ToInt();

            value = tif.GetField(TiffTag.IMAGELENGTH);
            int height = value[0].ToInt();

            // Read the image into the memory buffer
            int[] raster = new int[height * width];

            if (!tif.ReadRGBAImage(width, height, raster))
            {
                System.Windows.Forms.MessageBox.Show("Could not read image");
                return null;
            }

        }

Спасибо!


person BruceDoh    schedule 15.01.2015    source источник
comment
Сам не использовал libtiff.net, но возможно ли, что файлы расположены в виде полос, а не пикселей RGBA? Это довольно часто встречается в типах изображений ГИС. Я вижу, что класс Tiff имеет метод ReadRGBAStrip... (Кроме того, мозаичное размещение является обычным для форматов изображений ГИС.)   -  person adv12    schedule 15.01.2015
comment
Спасибо, adv12. Это звучит как многообещающий ответ. Я попробую и отчитаюсь.   -  person BruceDoh    schedule 15.01.2015
comment
Мне удалось успешно загрузить полосу TIFF с помощью ReadRGBAStrip. Еще раз спасибо за этот ответ, возможно, вы только что избавили меня от большого количества ударов головой о стену! PS. Я новичок на этом сайте и не уверен на 100%, как все это работает, но если вы хотите отправить это как ответ, я могу пометить его как правильный ответ. (это дает вам какие-то очки репутации или что-то в этом роде?)   -  person BruceDoh    schedule 15.01.2015
comment
Превосходно. Рад помочь.   -  person adv12    schedule 15.01.2015
comment
Другой распространенной ошибкой TIFF является порядок следования байтов. Убедитесь, что ваша библиотека правильно открывает файлы TIFF, созданные в MacOS.   -  person Yury Schkatula    schedule 15.01.2015
comment
Если вы можете прочитать изображение с помощью ReadRGBAStrip, то вы сможете прочитать его и с помощью ReadRGBAImage. И LibTiff.Net должен нормально читать изображения с любым порядком байтов. Так что довольно интересно, почему ReadRGBAImage терпит неудачу. Было бы полезно, если бы вы разместили здесь все сообщения об ошибках и предупреждения, выдаваемые библиотекой.   -  person Bobrovsky    schedule 15.01.2015
comment
На самом деле, я оговорился. Именно с помощью ReadEncodedStrip я смог загрузить полосу. У меня все еще возникают проблемы с чтением значений RGBA из файла, поэтому любая помощь в этом отношении будет оценена по достоинству.   -  person BruceDoh    schedule 15.01.2015
comment
Не стесняйтесь снять отметку с моего ответа и продолжать это дальше. Стоит отметить, что @Bobrovsky является (?) разработчиком LibTiff.Net, так что он, вероятно, знает, о чем говорит;)   -  person adv12    schedule 16.01.2015
comment
@Bobrovsky Я не вижу сообщений об ошибках. Когда я запускаю ReadRGBAImage или ReadRGBAStrip, он возвращает false. Я попытался убедиться, что мой вывод находится в формате RGBA, но я все еще не могу его загрузить. Я могу загрузить encodedstrips, но не знаю, как извлечь из них данные RGBA. Например, мои значения RGBA отображаются в ArcGIS как числа с плавающей запятой, но когда я читаю закодированные полосы, я получаю такие значения: 180 ‹ - R ? 152 ‹ - Г? 170‹ - Б? 61 ‹ - А? Но 4-е значение (альфа?) всегда составляет около 59-65, но в ArcGIS значение альфа составляет от 28,0 до 28,9... Значения RGB примерно находятся в диапазоне 0,01-0,8.   -  person BruceDoh    schedule 16.01.2015


Ответы (1)


Без файла для воспроизведения проблемы я могу быть уверен на 100%, но похоже, что ваш файл не может быть преобразован в растр RGBA с помощью LibTiff.Net.

Это не ошибка, просто вы используете какой-то не очень популярный вариант TIFF. Некоторые говорят, что TIFF — это тысяча несовместимых форматов файлов. И в этом утверждении, безусловно, есть доля правды.

Библиотека может прочитать (и декодировать!) ваш файл. Получить декодированный растр можно с помощью методов ReadEncodedStrip и/или ReadScanline. Задача преобразования вашего растра в RGBA остается за вами.

И не забывайте, что не каждое изображение можно преобразовать в RGBA без потери части данных изображения.

person Bobrovsky    schedule 16.01.2015
comment
Я думаю ты прав. Я отказался от попыток загрузить файлы tiff, созданные этими программами, и теперь я просто имею дело с простыми файлами ascii. Спасибо за ответы. - person BruceDoh; 17.01.2015