2010-09-14 57 views
7

我有一個2208 x 3000 TransformedBitmap對象,格式{Indexed8},我做的.CopyPixels()上。我使用TransformedBitmap對象的'Stride'困境

(int)((formattedBitmap.PixelWidth * formattedBitmap.Format.BitsPerPixel + 7)/8) 

(假定「formattedBitmap」是從我想要的像素複製圖像的名稱),用於我的方法調用中的「步幅」值和一個字節數組,其是2208長。我在代碼的其他地方也有這樣的東西(圖片的格式是{Gray8}),但是我在上述圖片上試圖做同樣的事情時,我總是得到一個「Argument out of Range」例外說「參數值不能小於'6624000'。\ r \ n參數名稱:緩衝區。」

我的問題是:爲什麼在世界上完全相同的代碼似乎在一個地方工作,而不是另一方面呢?從外行的角度來說,真的是'大步'?我怎樣才能在沒有出現這個錯誤的情況下獲得想要的效果(複製這些比特)?我做錯了什麼?

任何幫助對此將非常感激。非常感謝!

回答

9

我已經想通了(哇......有點不敢相信我花了一個小時左右的時間搞了這個!)。問題是,字節數組必須是大小

sourceImage.PixelHeight * stride 

的地方

int stride = (int)((sourceImage.PixelWidth * sourceImage.Format.BitsPerPixel + 7)/8); 

,它在我的代碼的其他位置工作的原因是因爲而不是複製像素的整個圖像(因爲我試圖做我遇到問題的地方),我只是複製單行的像素......也就是說,基本上是2008 x 1區域,以便目標字節數組的大小可以是正好2208,它會正常工作。爲了將來的參考,這樣的東西應該可能總是或多或少地被使用:

int width = source.PixelWidth; 
int height = source.PixelHeight; 
int stride = width * ((source.Format.BitsPerPixel + 7)/8); 

byte[] bits = new byte[height * stride]; 

source.CopyPixels(bits, stride, 0); 

乾杯!

+4

呵呵,MSDN有一個非常不錯的文章,講述'跨度'是什麼。這當然不是「外行人」的術語,我確實覺得它有點讓人滿意,但它是一個很好的參考(只有一個你可能需要多次閱讀才能真正理解你是否是新來的C#中的圖像處理人員) (和我一樣!))LINK:http://msdn.microsoft.com/en-us/library/aa473780(VS.85).aspx – JToland 2010-09-14 19:19:56

+0

作爲一個傾向於瀏覽代碼的人(我們都很匆忙對吧?)我看到你的步幅計算(錯誤的),並花了半小時試圖讓它工作,然後才意識到你有更正確的公式。這將是很好的正確的公式在頂部:) – Peter 2011-11-28 22:43:50