我有一个“性能关键”操作,我需要使用1bpp图像。 实际上我正在使用Bitmap类,我正在做,图形更新周期的每次迭代,字节数组内的位图副本。
看着我的任务管理器,这不是我可以继续做的事:它一直使用2%的cpu,我认为这对于像实用程序这样的东西来说非常多。
我需要尽可能少浪费内存和几乎0 cpu。图像是160x43,非常小。
为什么我不直接使用字节数组?简单:我想写一下,做一些我不想自己重写的常用操作。
我可以使用obviusly一个不同的图像类(例如,来自wpf,我不知道)。我需要有可能使用1bpp图像。
Offtopic: 我有一个32bpp图像的“问题”,我需要一种方法来处理它作为一个图像,而它是一个字节数组,我不能每次复制我的字节!我正以这种方式浪费cpu。
答案 0 :(得分:4)
您应该使用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会有一些开销,具体取决于它是否需要将内部存储器表示转换为您请求的内容(因此从哪里获取它可能很重要)。作为alwyas的表现,衡量和配置文件,以找到你的瓶颈。