我正在尝试优化我正在编写的 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);
}