4 回答

TA貢獻1條經(jīng)驗 獲得超1個贊
你好,這個問題我也遇到了,我也正在做遠程圖像的差異傳輸問題,我給您提供一個思路,把整個圖形平均分成大的四方塊,使用crc比較當(dāng)前塊是否變化,如果變化,傳輸一整個塊!這個算法我思考了下,確實可行,網(wǎng)上也有開源的crc算法,您可以試試

TA貢獻1810條經(jīng)驗 獲得超4個贊
此例程查找兩個位圖之間的差異,并通過將其他所有內(nèi)容設(shè)置為幾乎黑色且?guī)缀跬该鞯姆绞皆诘谝晃粓D中返回它們。通過將結(jié)果添加回前一個圖像,它也可以還原原始的第二個文件。
我縮小了800MB 1o 12k的屏幕截圖-但Clocks指針的確只有很小的變化;-)如果您的圖像在許多像素上有所不同,則壓縮效果將不會那么出色..但是我相信它將足夠好進行傳輸,我懷疑以像素為單位的任何內(nèi)容都可以與png或jpg文件格式的壓縮例程進行比較。.(我希望您不傳輸bmp?。?/p>
該例程使用LockBits并且非??臁?/p>
bool參數(shù)決定是創(chuàng)建差異位圖還是恢復(fù)更改后的位圖。
public static Bitmap Difference(Bitmap bmp0, Bitmap bmp1, bool restore)
{
int Bpp = 4; // assuming an effective pixelformat of 32bpp
var bmpData0 = bmp0.LockBits(
new Rectangle(0, 0, bmp0.Width, bmp0.Height),
ImageLockMode.ReadWrite, bmp0.PixelFormat);
var bmpData1 = bmp1.LockBits(
new Rectangle(0, 0, bmp1.Width, bmp1.Height),
ImageLockMode.ReadOnly, bmp1.PixelFormat);
int len = bmpData0.Height * bmpData0.Stride;
byte[] data0 = new byte[len];
byte[] data1 = new byte[len];
Marshal.Copy(bmpData0.Scan0, data0, 0, len);
Marshal.Copy(bmpData1.Scan0, data1, 0, len);
for (int i = 0; i < len; i += Bpp)
{
if (restore)
{
bool toberestored = (data1[i ] != 2 && data1[i+1] != 3 &&
data1[i+2] != 7 && data1[i+2] != 42);
if (toberestored)
{
data0[i ] = data1[i]; // Blue
data0[i+1] = data1[i+1]; // Green
data0[i+2] = data1[i+2]; // Red
data0[i+3] = data1[i+3]; // Alpha
}
}
else
{
bool changed = ((data0[i ] != data1[i ]) ||
(data0[i+1] != data1[i+1]) || (data0[i+2] != data1[i+2]) );
data0[i ] = changed ? data1[i ] : (byte)2; // special markers
data0[i+1] = changed ? data1[i+1] : (byte)3; // special markers
data0[i+2] = changed ? data1[i+2] : (byte)7; // special markers
data0[i+3] = changed ? (byte)255 : (byte)42; // special markers
}
}
Marshal.Copy(data0, 0, bmpData0.Scan0, len);
bmp0.UnlockBits(bmpData0);
bmp1.UnlockBits(bmpData1);
return bmp0;
}
注意:-我選擇了一種特殊的顏色來標(biāo)記那些需要在接收者處恢復(fù)的像素。在這里,我選擇了alpha=42和R=7; G=3; B=2;... ...而不是100%安全的,但幾乎; 不會錯過很多像素;也許您仍然沒有透明度..?

TA貢獻1828條經(jīng)驗 獲得超13個贊
您需要返回所有更改的像素,因此復(fù)雜度必須為m * n。
(Bitmap)_new).GetPixel(i,j)被調(diào)用了兩次,使用臨時值存儲它可能會更好一些。
像素應(yīng)該有幾個值吧?您可以嘗試創(chuàng)建一個名為comprareTwoPixel(color A,color B)的函數(shù)嗎?并一一比較所有值,如果其中之一為假,則無需比較其余值,只需返回false。(不知道這樣做是否會更快。)
喜歡:
bool comprareTwoPixel(color A, color B)
{
if(A.a!=B.b)
return false;
if(A.b!=B.b)
return false;
if(A.c!=B.c)
return false;
return true;
}
- 4 回答
- 0 關(guān)注
- 492 瀏覽
添加回答
舉報