我有一个“性能关键”操作,我需要处理1bpp图像。实际上,我正在使用Bitmap类,并且我正在进行图形更新周期的每一次迭代,在字节数组中复制位图。
看着我的任务管理器,这不是我能一直做的:它一直使用2%的cpu,我认为它对于像实用程序这样的东西是相当多的。
我需要浪费尽可能少的内存和几乎0 cpu。图像是160x43,非常小。
为什么我不直接使用字节数组?简单:我想写下来,做一些我不想自己重写的普通操作。
我可以使用不同的图像类(例如,wpf,我不知道)。我需要一张1bpp图像的可能性。
离题:我和32 copy的图片有同样的“问题”,当它是一个字节数组时,我需要一种方法来处理它,我不能每次都复制我的字节!我这是在浪费cpu。
发布于 2011-10-02 20:49:51
您应该使用Bitmap.LockBits来获取固定位图的底层内存(这样友好的垃圾收集器就不会为您移动它)。
例如,这个小程序加载一个png,设置一个简单的像素模式,并保存生成的图像:
unsafe void Main()
{
Bitmap bm = (Bitmap)Image.FromFile("D:\\word.png");
var locked = bm.LockBits(new Rectangle(0,0,bm.Width, bm.Height), System.Drawing.Imaging.ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format1bppIndexed);
try
{
byte v = 0xaa;
byte* pBuffer = (byte*)locked.Scan0;
for(int r = 0 ; r < locked.Height ; r++)
{
byte* row = pBuffer + r*locked.Stride;
for(int c = 0 ; c < locked.Stride ; c++)
row[c] = v;
}
}
finally
{
bm.UnlockBits(locked);
}
bm.Save("D:\\generated.png");
}LockBits将有一个开销,这取决于它是否需要将内部内存表示转换为您请求的内容(所以您从哪里获得它可能很重要)。对于性能,度量和配置文件,以找到您的瓶颈。
https://stackoverflow.com/questions/7629108
复制相似问题