2012-07-28 49 views
0

我正在創建一個加載2個圖像的方法,對它們應用一些轉換(縮放/旋轉),然後在使用.NET Graphics類的另一圖像上的某個點上繪製它們。使用GDI和.NET應用轉換和組合位圖

我目前在嘗試的過程如下:

Load bmp1 
Load bmp2 
Create graphics object from bmp1 
Apply tranformations 
Save 
Repeat process for bmp2 
Instantiate new merged bmp obj 
Create graphics object from merged bmp 
Draw bmp1 & bmp2 on merged bmp 
Save 

我試圖用下面的代碼來做到這一點:

// load existing bmps 
var bmp1 = new Bitmap(Path.Combine(_staticIconsPath, staticIcon.Filename)); 
var bmp2 = new Bitmap(Path.Combine(_movableIconsPath, movableIcon.Filename)); 

// apply transforms to bmp1 
var canvas1 = Graphics.FromImage(bmp1); 
canvas1.ScaleTransform(0.5f, 0.5f); 
canvas1.RotateTransform(45.0f); 
canvas1.Save(); 

// apply transforms to bmp2 
var canvas2 = Graphics.FromImage(bmp2); 
canvas2.ScaleTransform(0.5f, 0.5f); 
canvas2.RotateTransform(45.0f); 
canvas2.Save(); 

// create final merged bmp 
var mergedBmp = new Bitmap(590, 590); 
mergedBmp.SetResolution(bmp1.HorizontalResolution, bmp1.VerticalResolution); 

// draw transformed images on to final bmp 
var mergedCanvas = Graphics.FromImage(mergedBmp); 
mergedCanvas.DrawImage(bmp1, 0, 0); 
mergedCanvas.DrawImage(bmp2, 0, 0); 

mergedCanvas.Save(); 

然而最終的結果僅僅是原來的兩個位圖是如預期的那樣彼此重疊,但沒有應用轉換。

我以前從未使用GDI或做過任何圖像處理,所以我認爲我誤解了必須遵循的過程的基本原理。任何人都可以幫助我並指出我朝着正確的方向嗎?

回答

2

你必須保存你的轉換稱爲canevas每個人的bmp文件。 之後你可以使用這些BMP來繪製你的合併文件。但不要設置相同的位置 drawingImage時,因爲兩個圖像在相同的位置,你會看到只有一個,最後一個。

  // load existing bmps 
     var bmp1 = new Bitmap("test2.bmp"); 
     var bmp2 = new Bitmap("test2.bmp"); 

     // apply transforms to bmp1 
     var canvas1 = Graphics.FromImage(bmp1); 
     canvas1.ScaleTransform(0.5f, 0.5f); 
     canvas1.RotateTransform(45.0f); 
     canvas1.Save(); 
     canvas1.DrawImage(bmp1,100, 0); 
     bmp1.Save("test1res.bmp"); 
     var bmpres1 = new Bitmap("test1res.bmp"); 

     // apply transforms to bmp2 
     var resbmp2 = new Bitmap(1000, 1000); 
     var canvas2 = Graphics.FromImage(bmp2); 
     canvas2.ScaleTransform(0.5f, 0.5f); 
     canvas2.RotateTransform(45.0f); 
     canvas2.Save(); 
     canvas2.DrawImage(bmp2, 100, 0); 
     bmp2.Save("test2res.bmp"); 
     var bmpres2 = new Bitmap("test2res.bmp"); 

     // create final merged bmp 
     var mergedBmp = new Bitmap(1000, 1000); 
     mergedBmp.SetResolution(bmp1.HorizontalResolution, bmp1.VerticalResolution); 

     // draw transformed images on to final bmp 
     var mergedCanvas = Graphics.FromImage(mergedBmp); 
     mergedCanvas.DrawImage(bmpres1, 0, 0); 
     mergedCanvas.DrawImage(bmpres2, 500, 0); 

     mergedCanvas.Save(); 
     Graphics graph = mergedCanvas; 
     // Bitmap bmpPicture = new Bitmap("test2.bmp"); 
     graph.DrawImage(mergedBmp, 0, 0); 

     mergedBmp.Save("res.bmp"); 
+0

你試過嗎? – 2012-07-28 17:19:40

+0

啊,好吧,我明白我現在失去了什麼。我已經更新了我的代碼,現在我已經開始工作了。謝謝你的幫助。 – jcvandan 2012-07-29 14:46:33

1

是的,你做錯了。除非您實際使用它,否則圖形對象修改不起作用。你不這樣做,你只能繪製mergedCanvas。因此,重新排序的代碼,與此類似:

var mergedBmp = new Bitmap(590, 590); 
using (var bmp1 = new Bitmap(Path.Combine(_staticIconsPath, staticIcon.Filename))) 
using (var bmp2 = new Bitmap(Path.Combine(_movableIconsPath, movableIcon.Filename))) 
using (var mergedCanvas = Graphics.FromImage(mergedBmp)) { 
    mergedCanvas.Save(); 
    mergedCanvas.ScaleTransform(0.5f, 0.5f); 
    mergedCanvas.DrawImage(bmp1, 0, 0); 
    mergedCanvas.Restore(); 
    mergedCanvas.ScaleTransform(-0.5f, -0.5f); 
    mergedCanvas.DrawImage(bmp2, 0, 0); 
} 

不要跳過使用語句順便說一句,對位圖非常重要的

+0

感謝您的提示,沒有意識到實施IDisposable的位圖 – jcvandan 2012-07-29 14:47:23