簡體   English   中英

將圖像文件轉換回其原始二進制文件

[英]Converting image file back to its original binary file

這是對此處發布的先前問題的引用

將二進制文件表示為圖像表示

根據馬修給出的解決方案,我能夠得出結果。

我想知道如何反轉該過程,將該位圖圖像轉換回其原始二進制文件?

我只能將圖像轉換為字節數組,但不確定如何繼續進行

可能嗎?

如果我對這個問題的理解正確,那么您將獲得一個位圖(在內存中,在文件中存儲,無論如何),根據提供的鏈接給出的答案,其中的像素數據是從任意二進制源生成的。 並且您想要對該像素數據進行解碼,以檢索原始二進制數據。

如果是這樣,那么下面的方法將做您想要的事情(我嘗試盡可能地遵循原始答案的約定和結構):

private static byte[] DecodeBinaryFromBitmap(Stream inputStream)
{
    using (Bitmap bitmap = (Bitmap)Image.FromStream(inputStream))
    {
        int length = bitmap.GetPixel(0, 0).ToArgb();
        byte[] buffer = new byte[length];

        int x = 1, y = 0;
        for (var offset = 0; offset < buffer.Length; offset += 4)
        {
            var colorValue = bitmap.GetPixel(x, y);

            byte[] pixelBuffer = BitConverter.GetBytes(colorValue.ToArgb());

            Array.Copy(pixelBuffer, 0, buffer, offset, Math.Min(4, buffer.Length - offset));

            x++;
            if (x >= bitmap.Width)
            {
                x = 0;
                y++;
            }
        }

        return buffer;
    }
}

假設您在另一個問題中使用的是編碼例程的ARGB版本。 您傳遞代表位圖數據的Stream對象。 這可能是您從磁盤上的文件打開的FileStream ,或者是從(例如)資源或數據庫中檢索到的MemoryStream ,或者是您擁有的其他一些合適的Stream對象。

由於SetPixel()GetPixel()非常慢,我打算展示一個使用LockBits()方法獲取位圖的原始字節數據並從中解碼的版本。 但是我用1MB的隨機二進制數據流進行了測試,在我的計算機上只花了大約四分之一秒的時間。 我想如果您要使用非常大的數據(例如1GB數量級)來執行此操作,則可以考慮采用更快的方法。 但是,如果您最多要處理10兆字節(即幾秒鍾的處理時間),而不必經常這樣做,那么上面的內容應該沒問題。

如果您需要更快的速度,則應該應用基本技術,但使用LockBits()獲取位圖數據,而不是為每個像素調用GetPixel() 從好的方面來說,這實際上會使代碼更簡單 ,因為您不需要在ARGB int和每個像素代表的四個字節之間進行轉換。 數據將已經以字節的形式呈現給您。 主要缺點是您必須擔心步幅(但這並不十分困難)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM