[英]Converting blob back to original file type and making it available for download
[英]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.