Contents ...
udn網路城邦
Bitmap與 Byte的轉換程式分享
2015/08/18 04:48
瀏覽14,414
迴響0
推薦7
引用0

因為要做一個網路程式,必須頻繁的傳遞即時影像,就是想達到類似遠端桌面的效果,簡單的想法就是截下螢幕畫面,存成一個影像檔案,再將檔案傳到遠端,但是一說到「檔案」就必須存到磁碟,如果可以直接將資料傳到遠端,一定會更快更有效率。我們做過很多通訊類程式,多半只是傳遞文字資訊,直接傳影像就沒太多經驗了!

一般大家熟悉的HTPP(網頁)通訊是以文字模式為主的,雖然網頁上可以有很多圖片,但是傳遞的方式(超連結)還是必須先存檔到網站的磁碟中,再用超連結下載。要將影像在不必存檔的前提下直接傳遞,必須經過複雜的編碼(base64),好騙過HTTP協定,讓瀏覽器以為是在傳遞文字資料,收到這些「假文字資料」後再翻譯為影像在網頁上畫出來,這樣當然也是很沒效率。

最高效率的方式就是用TCP協定直接傳資料,雖然較少人會寫這種程式,但是剛好我會,還出了一本書:Visual Basic 2012網路程式設計-線上遊戲實作教人怎麼寫,但是前提是所有傳遞的資料,包括影像必須先解譯為Byte陣列,到了目的地還要再解譯回影像才能使用。這個我就不太會了!

和所有軟體工程師同業一樣,類似問題我們多半會先參考同業們在網路上好心提供的範例,這次我也花了不少時間研究了好多網頁資訊,解法是很多,但是都有點囉嗦,我最終整理出來的VB.NET版結果非常簡潔,就在此分享一下吧!

    'Bitmap to Byte array

    Function BmpToBytes(bmp As Bitmap) As Byte()

        Dim ms As New System.IO.MemoryStream

        bmp.Save(ms, Imaging.ImageFormat.Png)

        Dim b() As Byte = ms.GetBuffer

        bmp.Dispose()

        Return b

    End Function

    'Byte array to Bitmap

    Function BytesToBmp(b() As Byte) As Bitmap

        Dim ms As New System.IO.MemoryStream(b)

        Dim bmp As Bitmap = Bitmap.FromStream(ms)

        Return bmp

    End Function

為了證明我用C語言也是OK的,也在此分享一下C#版本吧!

        //Bitmap to Byte array
        public byte[] BmpToBytes(Bitmap bmp)
        {
            System.IO.MemoryStream ms = new System.IO.MemoryStream();
            bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
            byte[] b = ms.GetBuffer();
            return b;
        }
       

        //Byte array to Bitmap
        public Bitmap BytesToBitmap(byte[] b)
        {
            System.IO.MemoryStream ms = new System.IO.MemoryStream(b);
            Bitmap bmp = (Bitmap)Bitmap.FromStream(ms);
            return bmp;
        }

有誰推薦more
全站分類:心情隨筆 工作職場
自訂分類:教育學習

限會員,要發表迴響,請先登入