我需要在C#中处理大图像(20,000x20,000像素)。由于内存限制,直接打开这些图像不是可行的方法,但我想要做的是将图像分割成更小的部分(裁剪)。我一直在寻找可以解决问题的第三方库,但到目前为止还没有结果。我尝试过FreeImage和ImageMagick,但他们无法打开20,000x20x000像素的图像。我怎样才能做到这一点?
答案 0 :(得分:3)
我目前的工作项目包括一个图像查看器/分析程序,能够加载超过16 GB的图像。您必须使用手动文件IO,拉出标题信息并按需创建子图像(或者如果您正在处理图像,则可以创建单个图块并就地处理它)。很少有库能够让你能够加载/修改一个20k×20k的图像(1.2gb,24bpp),并且那些很少会有类似性能的东西(如果这是一个问题)。
答案 1 :(得分:1)
不知道这是否会有所帮助,但这里有一篇关于image processing with C# lambda expressions的文章。
答案 2 :(得分:0)
我不知道有任何现有的库可以做到这一点。
你可能不得不破解图像文件流,寻找存在颜色和像素数据的位置,并将像素数据的一部分读入数组,并从中创建图像。
例如,对于BMP file format,你需要寻找颜色表,加载颜色表,然后寻找像素数组部分,将你希望的许多像素加载到数组中,然后制作只有那些像素的新位图。
答案 3 :(得分:0)
我会用ImageMagick做的。有一个非常可靠的.NET API,它通常是像这样进行图像处理的最佳方式。
在.NET下查看,这是页面下方的一部分。
http://www.imagemagick.org/script/api.php
以下是有关ImageMagick中裁剪内容的信息,以及命令行版本。
答案 4 :(得分:0)
您可以使用内置的.Net库。
使用
sourceBitmap = (Bitmap)Image.FromStream(sourceFileStream, false, false);
这将阻止图像数据缓存在内存中。您可以创建一个新的目标位图,以将该海量图像的子部分绘制为:
var output = new Bitmap(outputWidth, outputHeight);
var outputGraphics = Graphics.FromImage(output);
outputGraphics.DrawImage(sourceBitmap, destRect, srcRect, GraphicsUnit.Pixel);
using (var fs = File.OpenWrite(outputFilePath))
{
output.Save(fs, System.Drawing.Imaging.ImageFormat.Png);
}
其中destRect可以是outputImage的整个大小,也可以是更小的区域。