使用 C# 中的流加载位图的子矩形



我有位图作为bmp文件(没有压缩只是一个简单的位图(。我想从文件的小节(矩形(创建内存流,而无需将整个文件加载到内存中。

目前,我读取整个位图只是为了稍后使用一个矩形进行裁剪,该矩形表示相对于图像大小的点。

using (FileStream fs = new FileStream(ImagePath, FileMode.Open)) 
{
MemoryStream ms = new MemoryStream();
fs.CopyTo(ms);
Image temp = Image.FromStream(ms, false, false);
}

由于位图只是一个以颜色矢量为值的大矩阵,我不能创建一个自定义流来读取,只能在相关行和列之间读取以改善运行时间和内存使用率?处理后的图像永远不会离开内存或保存在任何地方。

编辑:还有没有办法将文件直接加载到内存流而无需使用文件流?

听起来你想创建一个自定义的FileStream,基本上忽略子矩形之外的任何区域的像素数据(我想只是返回零?(,从而减少I/O的总量。是的,这是可能的,但它与编写自己的图像加载器一样棘手。流需要了解所有相关的位图标头信息(压缩(如果适用(、位深度、行顺序、填充(,以便确定子矩形的正确内存偏移。

我不相信它会为您节省很多I/O,除非子矩形与原始图像相比非常小。即使您请求更少的数据,硬盘驱动器也可能会以大约 4k 字节的块读取数据,因此对于屏幕大小的图像,最大的性能影响将是总行数。

如果我要走这条路(也就是说,只加载一个子矩形(,我不会在自定义流中做到这一点。相反,我将从位图文件头加载相关元数据,然后为子矩形创建具有正确大小和像素格式的 GDI+ 位图对象。然后,您可以锁定位图并将像素数据直接读取到位图对象的内存中。

这不是微不足道的,所以除非你真的需要,否则不要这样做。

最新更新