Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C中使用streams加载位图的子矩形#_C#_Io_Bitmap_Filestream - Fatal编程技术网

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

C# 在C中使用streams加载位图的子矩形#,c#,io,bitmap,filestream,C#,Io,Bitmap,Filestream,我有位图作为bmp文件(没有压缩只是一个简单的位图)。我想从文件的子部分(矩形)创建内存流,而不将整个文件加载到内存中 目前,我读取了整个位图,稍后将使用一个矩形进行裁剪,该矩形表示相对于图像大小的点 using (FileStream fs = new FileStream(ImagePath, FileMode.Open)) { MemoryStream ms = new MemoryStream();

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

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

using (FileStream fs = new FileStream(ImagePath, FileMode.Open)) 
{
                        MemoryStream ms = new MemoryStream();
                        fs.CopyTo(ms);
                        Image temp = Image.FromStream(ms, false, false);
}
由于位图只是一个以颜色向量作为值的大矩阵,我不能创建一个自定义流来读取,只在相关行和列之间读取,以提高运行时间和内存使用率吗?被操纵的图像不会离开内存或保存在任何地方


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

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

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

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


这不是一件小事,除非你真的需要,否则不要这样做。

你是否尝试过直接从文件流加载图像?最后一个问题对我来说意义不大。您想读取一个文件,所以FileStream是最好的选择。如果实施良好,它将只读取必要的部分。您对性能的考虑是什么?这段代码的用途是什么?只是一个简单的位图实际上有很多子表单。@Taw根据维基百科,所有位图bmp文件都将其图像数据存储在像素数组中,唯一改变的是像素格式,我不关心这些,我关心的只是访问阵列的相关部分,忽略我不需要的部分。@blackforest tom我做了。如果我完全忽略MemoryStream并执行Image.FromStream(fs),在我的例子中,它会将运行时间增加两倍。显然,内存流对于内存中的对象更为有效,使用CopyTo(ms)的这一技巧可以提高内存中对象的运行时间。根据I/O子系统、映像大小和裁剪区域,这实际上可能不会比读取整个映像快。磁盘非常擅长快速传输大量数据。尝试跳过其中的一部分只在大的可预测块中有用。