0

我正在尝试优化我正在编写的 VNC 类型应用程序的性能,但在真正优化它时遇到了一些困难。

给定两个位图,我想返回第三个位图,其尺寸尽可能小,完全包含位图之间的差异。

我能够返回与我的位图 A / 位图 B 大小相同的位图,其中差异有颜色,其余部分是透明的,但这并没有为我节省任何实际数据空间,也没有真正优化任何东西(除非位图对完全透明的像素做了一些特别的事情,但我觉得他们好像没有。)

无论如何,这就是我现在所拥有的,我可能会跟踪找到第一个更改的指针,然后跟踪找到最后一个更改的指针,但是如何将这些指针转换为矩形?我怎样才能将我的全尺寸差异位图裁剪到那个矩形?

这是我到目前为止使用的代码:

var a = previous.Screen;
var b = next.Screen;
Bitmap output = new Bitmap(
Math.Max(a.Width, b.Width),
Math.Max(a.Height, b.Height),
PixelFormat.Format32bppArgb);

Rectangle recta = new Rectangle(Point.Empty, a.Size);
Rectangle rectb = new Rectangle(Point.Empty, b.Size);
Rectangle rectOutput = new Rectangle(Point.Empty, output.Size);

BitmapData aData = a.LockBits(recta, ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
BitmapData bData = b.LockBits(rectb, ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
BitmapData outputData = output.LockBits(rectOutput, ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);

try
{
    unsafe
    {
      byte* aPtr = (byte*) aData.Scan0;
      byte* bPtr = (byte*) bData.Scan0;
      byte* outputPtr = (byte*) outputData.Scan0;

      int h = Math.Min(a.Height, b.Height);
      int w = Math.Min(a.Width, b.Width);

      for (int y = 0; y < h; y++)
      {
        aPtr = (byte*) aData.Scan0;
        bPtr = (byte*) bData.Scan0;
        outputPtr = (byte*) outputData.Scan0;

        aPtr += y*aData.Stride;
        bPtr += y*bData.Stride;
        outputPtr += y*outputData.Stride;

         for (int x = 0; x < w; x++)
         {
           bool bl = false;
           //the three color channels
           for (int j = 0; j < 3; j++)
           {
             if (*aPtr != *bPtr)
             {
               bl = true;
             }

             *outputPtr = (byte) *bPtr;

             outputPtr++;
             aPtr++;
             bPtr++;
          }

          //alpha, when one or mre color channels are different
          if (bl)
           *outputPtr = (byte) ((*aPtr + *bPtr)/2);

          outputPtr++;
          aPtr++;
          bPtr++;
         }
      }
   }

 }
 catch
 {
    if (output != null)
    {
      output.UnlockBits(outputData);
      output.Dispose();
      output = null;
    }
 }
 finally
 {
     a.UnlockBits(aData);
     b.UnlockBits(bData);

     if (output != null)
       output.UnlockBits(outputData);
 }
4

0 回答 0