Чтение 32-битного Tiff в оттенках серого с помощью Libtiff.Net

Я попытался прочитать 32-битный файл TIFF в оттенках серого, в котором каждый пиксель изображения содержит число с плавающей запятой. Но в процессе чтения буферный массив содержит 4 значения для каждого пикселя. Например [значение пикселя = 43,0 -> байтовые значения для пикселя = {0, 0, 44, 66}]. Я не могу понять связь между значением пикселя с плавающей запятой и байтовым значением. Я также написал изображение, используя буфер, но значения пикселей для выходного изображения - это значения типа int, например 1073872896. Любое предложение будет оценено.

using (Tiff input = Tiff.Open(@"E:\Sample_04.tif", "r"))
        {
            // get properties to use in writing output image file
            int width = input.GetField(TiffTag.IMAGEWIDTH)[0].ToInt();
            int height = input.GetField(TiffTag.IMAGELENGTH)[0].ToInt();
            int samplesPerPixel = input.GetField(TiffTag.SAMPLESPERPIXEL)[0].ToInt();
            int bitsPerSample = input.GetField(TiffTag.BITSPERSAMPLE)[0].ToInt();
            int photo = input.GetField(TiffTag.PHOTOMETRIC)[0].ToInt();

            int scanlineSize = input.ScanlineSize();  
            byte[][] buffer = new byte[height][]; 

            for (int i = 0; i < height; i++)
            {
                buffer[i] = new byte[scanlineSize];
                input.ReadScanline(buffer[i], i);
            }

        using (Tiff output = Tiff.Open("output.tif", "w"))
                {
                    output.SetField(TiffTag.SAMPLESPERPIXEL, samplesPerPixel);
                    output.SetField(TiffTag.IMAGEWIDTH, width);
                    output.SetField(TiffTag.IMAGELENGTH, height);
                    output.SetField(TiffTag.BITSPERSAMPLE, bitsPerSample);
                    output.SetField(TiffTag.ROWSPERSTRIP, output.DefaultStripSize(0));
                    output.SetField(TiffTag.PHOTOMETRIC, photo);
                    output.SetField(TiffTag.PLANARCONFIG, PlanarConfig.CONTIG);
                    output.SetField(TiffTag.COMPRESSION, compression);

                    int j = 0;
                    for (int i = 0; i < h; i++)
                    {

                        output.WriteScanline(buffer[i], j);
                        j++;
                    }
                }
        }

Обновление 1:

Я выяснил связь между четырьмя байтами и значением пикселя с помощью класса BitConverter в C #, который выглядит следующим образом: byte [] a = {0, 0, 44, 66} -> 43 = BitConverter.ToSingle (a, 0) и 1110179840 = BitConverter.ToInt32 (а, 0). Кажется, байты преобразуются в int32, и теперь вопрос в том, как преобразовать байтовые значения в float?

Обновление 2: исходный файл TIFF и сообщение TIFF после написания кода фрагмента были прикреплены. Почему выходной файл TIFF испорчен?

Введите tiff  Выходной tiff


person Nasser Tahani    schedule 14.05.2017    source источник
comment
Как узнать, что каждый пиксель изображения содержит число с плавающей запятой? Откуда взялось значение пикселя = 43,0?   -  person Mike Nakis    schedule 14.05.2017
comment
и что заставляет вас поверить, что значения пикселей для выходного изображения - это значения типа int, такие как 1073872896?   -  person Mike Nakis    schedule 14.05.2017
comment
Чтобы ответить на ваши вопросы, я импортировал в ArcMap файл tiff для отображения значений пикселей и их типа данных.   -  person Nasser Tahani    schedule 14.05.2017


Ответы (1)


Я добавил эту строку кода для преобразования значений пикселей в плавающее число, и она отлично работает.

output.SetField(TiffTag.SAMPLEFORMAT, SampleFormat.IEEEFP);
person Nasser Tahani    schedule 17.05.2017