第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

請問如何找到兩個圖像之間的差異?

請問如何找到兩個圖像之間的差異?

C#
楊__羊羊 2019-12-29 11:00:27
我正在開發(fā)一個屏幕共享應(yīng)用程序。在這個項目中,我需要通過互聯(lián)網(wǎng)傳輸圖像。顯然,我無法每隔幾秒鐘就通過互聯(lián)網(wǎng)發(fā)送一張新照片,這將非常慢。我想將服務(wù)器屏幕的一個圖像發(fā)送給客戶端,然后再發(fā)送新圖像,而不是發(fā)送僅發(fā)送自上一個圖像(客戶端已具有的圖像)以來已更改的像素的新圖像。我寫了這段代碼:private List<Color> CompareBitmaps(Image old, Image _new){    List<Color> returnList = new List<Color>();    for(int i = 0; i < old.Width; i++)        for (int j = 0; j < old.Height; j++)        {            if (((Bitmap)old).GetPixel(i, j) != ((Bitmap)_new).GetPixel(i, j))            {                returnList.Add(((Bitmap)_new).GetPixel(i, j));            }        }return returnList;}但是,它的工作速度太慢。我正在尋找一種更快,更復(fù)雜的算法。注意:我不想要一個能做到這一點的內(nèi)置庫。我需要一個算法。
查看完整描述

4 回答

?
精慕門7919710

TA貢獻1條經(jīng)驗 獲得超1個贊

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

查看完整回答
1 反對 回復(fù) 2020-01-15
?
蝴蝶不菲

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%安全的,但幾乎; 不會錯過很多像素;也許您仍然沒有透明度..?



查看完整回答
1 反對 回復(fù) 2020-01-06
?
慕田峪7331174

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;

}



查看完整回答
反對 回復(fù) 2020-01-06
  • 4 回答
  • 0 關(guān)注
  • 492 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號