Чтение значений 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;
это формула, которая отображает два двумерных индекса в одномерный индекс растрового массива.