6

我需要在 C# 中处理大图像(20,000x20,000 像素)。由于内存限制,直接打开这些图像不是可行的方法,但我想要做的是将图像分割成更小的部分(裁剪)。我一直在寻找可以解决问题的第 3 方库,但到目前为止还没有结果。我尝试了 FreeImage 和 ImageMagick,但它们无法打开 20,000x20x000 像素的图像。我怎样才能做到这一点?

4

5 回答 5

3

我目前的工作项目包括一个能够加载超过 16 GB 的图像的图像查看器/分析程序。您必须使用手动文件 IO,提取标题信息并按需创建子图像(或者如果您正在处理图像,则可以创建单个图块并就地处理它)。很少有库能够让您加载/修改 20k x 20k 图像(24bpp 时为 1.2gb),而那些这样做的库很少会以类似性能的方式这样做(如果这是一个问题)。

于 2009-06-19T15:23:24.183 回答
1

不知道这是否有帮助,但这里有一篇关于使用 C# lambda 表达式进行图像处理的文章。

于 2009-06-19T15:14:34.217 回答
1

您可以使用内置的 .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 的整个大小,也可以是较小的区域。

于 2017-11-22T00:22:50.273 回答
0

我不知道有任何现有的图书馆可以做到这一点。

您可能必须打开图像文件流,寻找颜色和像素数据存在的位置,并将像素数据的一部分读入数组,然后从中创建图像。

例如,对于BMP 文件格式,您需要查找颜色表,加载颜色表,然后查找像素阵列部分,将您希望的任意数量的像素加载到一个数组中,然后制作一个新的位图那些像素。

于 2012-12-05T19:53:11.260 回答
0

我会用 ImageMagick 来做。有一个非常可靠的 .NET API 可用,它通常是进行此类图像处理的最佳方式。

在 .NET 下查看,在页面下方。

http://www.imagemagick.org/script/api.php

以下是有关 ImageMagick 中的裁剪内容如何工作的信息,适用于命令行版本。

http://www.imagemagick.org/Usage/crop/#crop

于 2012-12-06T06:25:04.573 回答