我有一个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;
}
答案 0 :(得分:0)
看起来你正在对文件进行不必要的处理。调用 ReadScanline 的整个循环似乎毫无意义,因为您稍后通过调用 ReadRGBAImage 来阅读整个文件。我不确定哪个类支持 img 变量,但看起来它有重复的数据(像素属性和 bytearray 变量)。我会看看你是否可以重构你的代码以删除其中一个项目。
最好将循环更改为转换为RGB以使 i (高度)成为内部循环,以便按顺序访问栅格数组(这样可以节省大量的记忆提取)。
另请注意,由于双边界检查,二维数组访问速度明显慢于1d。根据我自己的经验,手动计算1d阵列的偏移量比使用C#2d阵列更快。将像素重构为1d可能是值得的。
编辑:如果您无法重构代码以删除像素或 bytearray ,那么我建议您创建 bytearray 变量内容栅格的内容,而不是重新读取文件。