3

我想在 C# 中读取像素的 RGB 值,我尝试使用此处找到的以下代码。

             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]);
             }

但是我不知道这个偏移量是什么以及为什么当图像是 2D 时光栅是 1D 的。有人可以帮助我理解上面代码中的偏移和栅格吗?

4

1 回答 1

3

一个 2D 字节数组(在这种情况下是位图)基本上仍然是一个“正常”的 1D 数组,为了方便起见,它允许通过两个单独的索引进行访问。

例子:

  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;

是将两个 2D 索引映射到栅格数组的 1D 索引的公式。

于 2016-10-04T20:04:49.413 回答