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

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

当前,我阅读了整个位图,以供稍后使用代表与图像大小相关的点的矩形进行裁剪。

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

由于位图只是一个带有颜色矢量的大矩阵,因为值不能创建仅在相关行和列之间读取的自定义流以提高运行时间和内存使用率,所以我无法创建该值被操纵的图像永远不会离开内存或保存在任何地方。

编辑:还有没有一种方法可以直接将文件直接加载到内存流中而不使用文件流?

wwjj789456 回答:使用C#中的流加载位图的子矩形

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

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

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

这不是小事,因此除非您确实需要,否则不要这样做。

本文链接:https://www.f2er.com/3035501.html

大家都在问