【发布时间】:2018-02-04 13:51:05
【问题描述】:
我正在编写我的第一个图像编辑程序(c#、winforms),但我在缓冲区和有效存储数据方面非常糟糕。
我有一个包含图片的文件夹,并通过FolderBrowserDialog 将文件加载到string[]:
files = Directory.GetFiles(fbd.SelectedPath);
我总是在图片框中显示其中一张图片。我有各种适用的功能,例如显示图像上的过滤器。我所有的函数都在位图上工作,我所有的函数基本上都是从调用另一个函数开始的:
Bitmap bmp = GetImage();
和:
Image GetImage()
{
FileStream imageStream = new FileStream(Convert.ToString(files[SelIndex]), FileMode.Open);
Image image = Image.FromStream(imageStream);
imageStream.Close();
return image;
}
每当我调用我的一个函数时(例如,因为我想显示不同的图像并查看过滤器如何应用在那里),我都会在显示新图片之前遇到痛苦的延迟。就我而言,每次我调用我的一个函数时,它都会深入到图片所在的原始文件夹并从那里获取数据,我相信这就是滞后的原因。 首先:正确吗?其次:有什么方法可以避免这种情况?我可以想象将数据保存在某种缓冲区中?
我的函数/过滤器非常基本,我不使用SetPixel 方法,但是:
BitmapData data = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadWrite, bmp.PixelFormat);
byte[] bytes = new byte[data.Height * data.Stride];
Marshal.Copy(data.Scan0, bytes, 0, bytes.Length);
//whatever my filter is
Marshal.Copy(bytes, 0, data.Scan0, bytes.Length);
bmp.UnlockBits(data);
因为它的速度更快,所以延迟不应该来自于此。
编辑:另外,我正在处理 .tif 文件,每个文件大约 12 MB,这绝对是问题的一部分。
【问题讨论】:
标签: c# image winforms bitmap buffer