从C#中的TIFF图像读取RGB值

时间:2016-10-05 17:15:50

标签: c# image-processing rgb geotiff

我有一个tiff图像,我正在使用以下代码读取每个像素的RGB值。图像高度:16198宽度:12900。

但代码花费的时间更长(超过20分钟)。尝试了各种方式,如将其转换为位图,但不是它们会带来更好的性能。任何建议

            using (Tiff tiffreader = Tiff.Open(imgpath, "r"))
            {
                img.Width = tiffreader.GetField(TiffTag.IMAGEWIDTH)[0].ToInt();
                img.Height = tiffreader.GetField(TiffTag.IMAGELENGTH)[0].ToInt();
                img.DipX = tiffreader.GetField(TiffTag.XRESOLUTION)[0].ToInt();
                img.DipY = tiffreader.GetField(TiffTag.YRESOLUTION)[0].ToInt();

                // Reading RGB values
                int height = (int)img.Height;
                int width = (int)img.Width;
                int[] raster = new int[height*width];

                var b =  tiffreader.ReadRGBAImage(width, height, raster);

                img.Pixels = new PColor[height, width];
                img.Pixels = Utility.ConvertToRGB(height, width, raster);
            }


     internal static PColor[,] ConvertToRGB(int height, int width, int[] raster)
    {
        PColor[,] pcolor = new PColor[height, width];
        try
        {
            for (int i = 0; i < height; ++i)
                for (int j = 0; j < width; ++j)
                {
                    int offset = (height - j - 1) * width + i;
                    PColor color = new PColor();
                    color.R = Tiff.GetR(raster[offset]);
                    color.G = Tiff.GetG(raster[offset]);
                    color.B = Tiff.GetB(raster[offset]);

                    pcolor[i, j] = color;
                }
        }
        catch(Exception exp)
        {
            throw exp;
        }

        return pcolor;
    }

1 个答案:

答案 0 :(得分:0)

看起来你正在对文件进行不必要的处理。调用 ReadScanline 的整个循环似乎毫无意义,因为您稍后通过调用 ReadRGBAImage 来阅读整个文件。我不确定哪个类支持 img 变量,但看起来它有重复的数据(像素属性和 bytearray 变量)。我会看看你是否可以重构你的代码以删除其中一个项目。

最好将循环更改为转换为RGB以使 i (高度)成为内部循环,以便按顺序访问栅格数组(这样可以节省大量的记忆提取)。

另请注意,由于双边界检查,二维数组访问速度明显慢于1d。根据我自己的经验,手动计算1d阵列的偏移量比使用C#2d阵列更快。将像素重构为1d可能是值得的。

编辑:如果您无法重构代码以删除像素 bytearray ,那么我建议您创建 bytearray 变量内容栅格的内容,而不是重新读取文件。