使用1bpp图像

时间:2011-10-02 20:44:48

标签: c# bitmap

我有一个“性能关键”操作,我需要使用1bpp图像。 实际上我正在使用Bitmap类,我正在做,图形更新周期的每次迭代,字节数组内的位图副本。

看着我的任务管理器,这不是我可以继续做的事:它一直使用2%的cpu,我认为这对于像实用程序这样的东西来说非常多。

我需要尽可能少浪费内存和几乎0 cpu。图像是160x43,非常小。

为什么我不直接使用字节数组?简单:我想写一下,做一些我不想自己重写的常用操作。

我可以使用obviusly一个不同的图像类(例如,来自wpf,我不知道)。我需要有可能使用1bpp图像。

Offtopic: 我有一个32bpp图像的“问题”,我需要一种方法来处理它作为一个图像,而它是一个字节数组,我不能每次复制我的字节!我正以这种方式浪费cpu。

1 个答案:

答案 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的表现,衡量和配置文件,以找到你的瓶颈。