Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用1bpp图像_C#_Bitmap - Fatal编程技术网

C# 使用1bpp图像

C# 使用1bpp图像,c#,bitmap,C#,Bitmap,我有一个“性能关键型”操作,需要处理1bpp图像。 实际上,我使用的是位图类,在图形更新周期的每次迭代中,我都在字节数组中复制位图 看着我的任务管理器,这并不是我可以继续做的:它一直在使用2%的cpu,我认为这对于像实用程序这样的东西来说是相当多的 我需要尽可能少地浪费内存和几乎0个cpu。图像是160x43,非常小 为什么我不直接使用字节数组?简单:我想写下来,做一些我不想自己重写的普通操作 我可以使用明显不同的图像类(例如wpf,我不知道)。我需要一个1bpp图像的可能性 离题: 我有同样的

我有一个“性能关键型”操作,需要处理1bpp图像。 实际上,我使用的是位图类,在图形更新周期的每次迭代中,我都在字节数组中复制位图

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

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

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

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

离题: 我有同样的“问题”与32bpp图像,我需要一种方法来处理它作为一个图像,而它是一个字节数组,我不能使我的字节每次副本!!!我这样是在浪费cpu。

您应该使用它来固定位图的底层内存(这样友好的垃圾收集器就不会为您移动它)

例如,此小程序加载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");
}
不安全的void Main()
{
位图bm=(位图)Image.FromFile(“D:\\word.png”);
var locked=bm.LockBits(新矩形(0,0,bm.Width,bm.Height),System.Drawing.ImageLockMode.ReadWrite,System.Drawing.Imaging.PixelFormat.Format1Bppined);
尝试
{
字节v=0xaa;
字节*pBuffer=(字节*)已锁定。扫描0;
对于(int r=0;r
锁位将有一个开销,这取决于它是否需要将内部内存表示转换为您所请求的内容(因此从何处获取锁位可能很重要)。与性能一样,测量和配置文件以找到瓶颈。

您应该使用它来固定位图的底层内存(这样友好的垃圾收集器就不会为您移动它)

例如,此小程序加载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");
}
不安全的void Main()
{
位图bm=(位图)Image.FromFile(“D:\\word.png”);
var locked=bm.LockBits(新矩形(0,0,bm.Width,bm.Height),System.Drawing.ImageLockMode.ReadWrite,System.Drawing.Imaging.PixelFormat.Format1Bppined);
尝试
{
字节v=0xaa;
字节*pBuffer=(字节*)已锁定。扫描0;
对于(int r=0;r

锁位将有一个开销,这取决于它是否需要将内部内存表示转换为您所请求的内容(因此从何处获取锁位可能很重要)。与性能、测量和配置文件一样,找到瓶颈。

2%相当多?我觉得很轻。为什么它不能100%运行?你是故意放慢速度吗?我正在考虑放慢速度,但正如我所说的,这是一个实用程序,在后台工作,它应该尽可能少地使用cpu。使用这个库的其他程序不使用CPU(几乎没有),显然它们是用C++编写的,所以你有更好的内存管理。我不需要很好地控制内存(我们有很多空闲),但我需要控制cpu的使用,因为这个工具应该在游戏期间也能工作execution@spender,如果这应该是一个后台应用程序,2%的恒定CPU将足以让我恼火。@driis:我绝对同意你的观点,让它快5倍或少5倍,这样它就保持在0.5%以下。您没有给出任何提示来帮助您将速度提高5倍。将其设为1bpp当然没有帮助,这只会节省空间,而不是时间。32bppPArgb像素格式比其他格式快一个数量级。2%是相当多的?我觉得很轻。为什么它不能100%运行?你是故意放慢速度吗?我正在考虑放慢速度,但正如我所说的,这是一个实用程序,在后台工作,它应该尽可能少地使用cpu。使用这个库的其他程序不使用CPU(几乎没有),显然它们是用C++编写的,所以你有更好的内存管理。我不需要很好地控制内存(我们有很多空闲),但我需要控制cpu的使用,因为这个工具应该在游戏期间也能工作execution@spender,如果这应该是一个后台应用程序,2%的恒定CPU将足以让我恼火。@driis:我绝对同意你的观点,让它快5倍或少5倍,这样它就保持在0.5%以下。您没有给出任何提示来帮助您将速度提高5倍。将其设为1bpp当然没有帮助,这只会节省空间,而不是时间。32 BPPARGB的像素格式比其他所有的格式要快一点。嗯,我需要一个字节[]数组,一个C数组,我的意思是,不是一个C++字节数组(因为我想使用MalSal.StuttPoTopIn方法)…如果将其作为指针,则无论如何都不需要
Marshal.StructToPointer
。封送处理方法将为您提供一个
字节[]
,用于复制数据,这是您声明不需要的数据。Ok LockBits绝对是我访问这些位图的更快方法。我不高兴,但没问题,答案是,我需要一个字节[]数组,一个C数组,我的意思是,不是C++字节数组(因为我想使用MalSal.StultOpTIn方法)…如果将其作为指针,则无论如何都不需要
Marshal.StructToPointer
。这个