2012-05-07 194 views
1

我有以下代碼來處理流中的圖像。我的意圖是選擇一個分區域並將其調整到100x100。我事先不知道圖像的格式。剪切圖像

var image = new Bitmap(stream); 

var destArea = new Rectangle(0, 0, 100, 100); 
var srcArea = new Rectangle(x, y, width, height); 

var gfx = Graphics.FromImage(image); 
gfx.DrawImage(image, destArea, srcArea, GraphicsUnit.Pixel); 

var ms = new MemoryStream(); 
image.Save(ms, image.RawFormat); 

出於某種原因,這是考慮我想要的分區,調整其大小,並把它放在原始圖像的頂部,這樣的結果是原來和我期望的結果的混合物。

我已經通過了幾個指南,圖像處理的帖子,但我仍然不知道我在哪裏錯了。你介意幫我嗎?

另外,如果您還向我解釋了我錯過了什麼(代碼背後的一點理論),我將非常感激。

謝謝!

回答

1

如果您要調整圖像大小,您需要一個新的圖像對象,將放入您調整大小後的圖像。你缺少的是創建新的100x100圖像。這裏是你的代碼應該是什麼樣子:

var image = new Bitmap(stream); 
var destArea = new Rectangle(0, 0, 100, 100); 
var srcArea = new Rectangle(x, y, width, height); 

// Destination image 
var destImage = new Bitmap(destArea.Width, destArea.Height); 

var gfx = Graphics.FromImage(destImage); 
gfx.DrawImage(image, destArea, srcArea, GraphicsUnit.Pixel); 

var ms = new MemoryStream(); 
destImage.Save(ms, image.RawFormat); 

我也建議在包裝聲明using所有GDI +對象,因爲它們一般不與垃圾收集打好。

+0

非常感謝。我想我會繼續混淆不同的參數意義(例如,爲什麼gfx是從destimage創建的,但它會繪製圖像)。我需要深入閱讀文檔。謝謝! – Alpha

+1

不用擔心。 gfx是繪製到目標圖像中的對象,因此當您調用DrawImage(圖像,...)時,您將圖像的內容繪製爲destImage –