2012-07-28 2 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를 사용하여 병합 된 파일을 그릴 수 있습니다.하지만 동일한 위치에 두 개의 이미지가 있기 때문에 동일한 위치를 설정하지 마십시오. 마지막으로 하나만 표시됩니다.

  // 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

시도해 보셨습니까? –

+0

아아아, 나는 내가 지금 놓치고 있었던 것을 본다. 코드를 업데이트했는데 지금은 작동하고 있습니다. 당신의 도움을 주셔서 감사합니다. – jcvandan

1

예, 잘못하고 있습니다. Graphics 객체의 수정은 실제로 그리지 않으면 효과가 없습니다. 그렇지 않으면 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); 
} 

은 BTW 문, 비트 맵에 매우 중요를 사용하는 를 건너하지 마십시오.

+0

팁 주셔서 감사합니다, 구현 된 비트 맵 IDisposable 실현하지 않았다 – jcvandan