2011-09-10 22 views
12

我在HDD上有幾個(〜2GB)原始24bpp RGB文件。 現在我想檢索它的一部分並將其縮放到所需的大小。
(允許的唯一尺度是1,1/2,1/4,1/8,...,1/256)C#從System.Drawing.Bitmap有效獲取像素數據

所以我目前正在讀從感興趣的長方形每行到一個數組,這使我留下了一張正確高度但錯誤寬度的位圖。

作爲下一步我從新創建的陣列創建一個位圖。
這是通過使用指針來完成的,因此不會複製涉及的數據。
接下來,我在位圖上調用GetThumbnailImage,它會創建一個具有正確尺寸的新位圖。

現在我想返回新創建的位圖的原始像素數據(作爲字節數組)。 但爲了實現目前我正在使用LockBits將數據複製到新數組中。

所以我的問題是:有沒有辦法將像素數據從位圖獲取到字節數組而不復制它?

喜歡的東西:

var bitmapData = scaledBitmap.LockBits(...) 
byte[] rawBitmapData = (byte[])bitmapData.Scan0.ToPointer() 
scaledBitmap.UnlockBits(bitmapData) 
return rawBitmapData 

我很清楚,這是不行的,這只是一個例子,我基本上要實現。

+0

要工作,而不是不安全{} void * to byte [],請嘗試 IntPtr ptr = bitmapData.Scan0; int bytes = Math.Abs​​(bitmapData.Stride)* bitmapData.Height; raw = new byte [bytes]; Marshal.Copy(ptr,raw,0,bytes); return raw; // byte [] – antonio

回答

15

我認爲這是你最好的選擇。

var bitmapData = scaledBitmap.LockBits(...); 
var length = bitmapData.Stride * bitmapData.Height; 

byte[] bytes = new byte[length]; 

// Copy bitmap to byte[] 
Marshal.Copy(bitmapData.Scan0, bytes, 0, length); 
scaledBitmap.UnlockBits(bitmapData); 

如果要傳遞一個字節[],則必須將其複製。

您不必刪除已分配的字節,只需完成原始位圖對象的處理,因爲它會實現IDisposable。

+0

不是我期待的答案,但是使用Marshal.Copy使它看起來比複製整數每整數更好。謝謝 – Arokh