【问题标题】:Working with 1bpp images使用 1bpp 图像
【发布时间】:2011-10-03 05:09:34
【问题描述】:

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

看着我的任务管理器,这不是我可以继续做的:它一直使用 2% 的 cpu,我认为这对于一个实用程序之类的东西来说已经很多了。

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

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

我显然可以使用不同的图像类(例如,来自 wpf,我不知道)。我需要使用 1bpp 图像的可能性。

题外话: 我对 32bpp 图像有同样的“问题”,我需要一种方法将它作为图像处理,而它是一个字节数组,我不能每次都复制我的字节!!!我就是这样浪费cpu的。

【问题讨论】:

  • 2% 是不是很多?对我来说似乎很轻。为什么不是 100% 运行?你是故意放慢速度吗?
  • 我正在考虑减慢它的速度,但正如我所说,这是一个实用程序并且在后台工作,它应该尽可能少使用 CPU。使用这个库的其他程序不使用 cpu(几乎没有),显然它们是用 C++ 编写的,所以你有更好的内存管理。我不需要很好地控制内存(我们有很多空闲),但我需要控制 cpu 的使用,因为这个实用程序即使在游戏执行期间也应该可以工作
  • @spender,如果这应该是一个后台应用程序,2% 的恒定 CPU 足以让我恼火。
  • @driis:我完全同意你的看法
  • 使其速度提高 5 倍或频率降低 5 倍,使其保持在 0.5% 以下。您没有给出任何提示来帮助您使其速度提高 5 倍。将其设为 1bpp 肯定无济于事,这只会节省空间,而不是时间。 32bppPArgb 像素格式比所有其他格式快一个数量级。

标签: c# bitmap


【解决方案1】:

您应该使用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 会产生开销,具体取决于它是否需要将内部内存表示转换为您请求的内容(因此您从哪里获取它可能很重要)。一如既往地使用性能、测量和配置文件来找到您的瓶颈。

【讨论】:

  • 嗯,我需要一个 byte[] 数组,我的意思是一个 C# 数组,而不是 C++ 字节数组(因为我想使用 Marshal.StructToPointer 方法)
  • ... 如果您将其作为指针,则无论如何都不需要Marshal.StructToPointer。 Marshal 方法会给你一个byte[],复制数据,这是你说你不想要的。
  • Ok LockBits 绝对是我真正可以访问这些位图的更快方法。我不高兴,但没关系,这就是答案
猜你喜欢
  • 1970-01-01
  • 2011-06-09
  • 2010-09-21
  • 1970-01-01
  • 2013-06-16
  • 2011-12-24
  • 2013-08-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多