gpt4 book ai didi

c# - 使用 1bpp 图像

转载 作者:太空宇宙 更新时间:2023-11-03 22:08:17 24 4
gpt4 key购买 nike

我有一个“性能关键”操作,我需要处理 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com