Чтение значений RGB пикселя с помощью LibTiff - C#

Я хочу прочитать значения RGB пикселя в C#, я попытался использовать следующий код, найденный здесь.

             int[] raster = new int[height*width];
             var b =  tiffreader.ReadRGBAImage(width, height, raster);

             for (int i = 0; i < width; ++i)
                for (int j = 0; j < height; ++j)
                {
                    int offset = (height - j - 1) * width + i;
                    color.R = Tiff.GetR(raster[offset]);
                    color.G = Tiff.GetG(raster[offset]);
                    color.B = Tiff.GetB(raster[offset]);
             }

Но я не понимаю, что это за смещение и почему растр в 1D, когда изображение 2D. Может ли кто-нибудь помочь мне понять смещение и растровые вещи в приведенном выше коде.

1 ответ

Решение

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

Пример:

  0123456789
0 ##########
1 **********
2 XXXXXXXXXX
3 YYYYYYYYYY

#,*,X,Y обозначить байты в каждой записи

на самом деле (в памяти)

##########**********XXXXXXXXXXYYYYYYYYYY

Таким образом, эта формула для сопоставления индексов

int offset = i * width + j

с i быть рядом и j индекс столбца.


В случае этого изображения TIFF это немного отличается, потому что предполагается, что источник находится в нижнем левом углу:

  0123456789
3 ####OO####
2 ##OO##OO##
1 ##OOOOOO##
0 ##OO##OO##

Таким образом,

int offset = (height - j - 1) * width + i;

это формула, которая отображает два двумерных индекса в одномерный индекс растрового массива.

Другие вопросы по тегам