Reputation: 14334
I am creating a method that loads 2 images, applies some transformations to them (scaling/rotation), then draws them at a certain point on on another image using .NET Graphics class.
The process I am currently attempting is as follows:
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
I am attempting to do this with the code below:
// 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();
However the end result is simply the two original bitmaps that were loaded, both drawn on top of each other as expected, but with no transforms applied.
I have never used the GDI before or done any image manipulation so I assume I am misunderstanding something fundamental about the process that must be followed. Can anyone help me out and point me in the right direction?
Upvotes: 0
Views: 999
Reputation: 942488
Yes, you are doing it wrong. The Graphics object modifications have no effect unless you actually draw with it. Which you don't, you only draw with mergedCanvas. So re-order your code, similar to this:
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);
}
Don't skip those using statements btw, very important on bitmaps.
Upvotes: 1
Reputation: 3919
you have to save your transformation called canevas on bmp file for each one. After you can use those bmp to draw your merged file.But don't set the same location when drawingImage because two image at same location you will see only one, the last.
// 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");
Upvotes: 2