找到位图之间差异的最小可能矩形

时间:2013-01-11 16:56:30

标签: c# .net image bitmap

我正在尝试优化我正在编写的VNC类应用程序的性能,并且我在实现它真正优化方面遇到了一些困难。

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

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

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

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

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);
 }

0 个答案:

没有答案