c# - 使用 1bpp 图像

标签 c# bitmap

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

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

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

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

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

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

最佳答案

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

关于c# - 使用 1bpp 图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7629108/

相关文章:

android - 位图转换为 webp 给出信号 11

c# - 尝试在 DynamicParameter 中传递 null 时,Dapper 在参数名称附近报告无效语法

c# - 商业 .NET CSV 解析器/库

c# - linq-to-sql:存储过程不能在查询中使用

c# - 强类型的 ASP.NET MVC ViewData 扩展 - 标识符放在哪里?

c# - 拒绝访问!?我无法从 C 驱动器上的安装文件夹中打开文件

android - 如何在 Espresso 测试中点击位图?

c - 具有 300x300 分辨率的 jpeg 到 bmp 输出失真的灰度图像

java - 灰度图像显示红色 - android

Android Camera Intent - 内存不足错误和旋转错误