优化 C# 中的位图字符绘制算法



有没有办法优化它:字符存储在字节的"矩阵"中,尺寸为 9x16,为了示例,我们称之为 character .字节可以是10的值,分别表示绘制前景和绘制背景。XY 变量是整数,表示用于SetPixel()函数的 X 和 Y 坐标。 BGFG分别表示背景色和前景色,这两种类型的Color

算法本身的绘图部分如下所示:

for(int i=0;i<16;i++)
{
    for(int j=0;j<9;j++)
    {
        if(character[i][j] == 1)
        {
            SetPixel(X,Y,BG);
        }
        else
        {
            SetPixel(X,Y,FG);
        }
        X++;
    }
    X=0;
    Y++;
}

稍后,X 递增 9,Y 设置回 0。这个算法的问题是,当它被调用来绘制一个字符串(许多字符顺序(时,它非常慢。

但是

,我不太确定字符是什么意思。

  • GetPixel内部调用LockBits以固定内存
  • 尔格 最好使用一次LockBits并完成它
  • 总是打电话给UnlockBits
  • 使用 unsafe 直接指针访问也可以为您提供少量性能
  • 此外(在这种情况下(可以优化for循环(代码明智(以包含其他索引。

示例

protected unsafe void DoStuff(string path)
{
   ...
   using (var b = new Bitmap(path))
   {
      var r = new Rectangle(Point.Empty, b.Size);
      var data = b.LockBits(r, ImageLockMode.ReadOnly, PixelFormat.Format32bppPArgb); 
      var p = (int*)data.Scan0;
      try
      {
         for (int i = 0; i < 16; i++, Y++)
            for (int j = 0, X = 0; j < 9; j++, X++)
               *(p + X + Y * r.Width) = character[i][j] == 1 ? BG : FG;
      }
      finally
      {
         b.UnlockBits(data);
      }
   }
}

Bitmap.LockBits

将位图锁定到系统内存中。

Bitmap.UnlockBits

从系统内存中解锁此位图。

unsafe

unsafe 关键字表示不安全的上下文,这是必需的 任何涉及指针的操作。


延伸阅读

不安全的代码和指针

Bitmap.GetPixel

锁位与获取像素集像素 - 性能

最新更新