Aplicar transformaciones y combinar mapas de bits usando GDI y .NET

Estoy creando un método que carga 2 imágenes, les aplica algunas transformaciones (escalado/rotación), luego las dibuja en un punto determinado en otra imagen usando la clase de gráficos .NET.

El proceso que estoy intentando actualmente es el siguiente:

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

Estoy tratando de hacer esto con el siguiente código:

// 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();

Sin embargo, el resultado final son simplemente los dos mapas de bits originales que se cargaron, ambos dibujados uno encima del otro como se esperaba, pero sin aplicar transformaciones.

Nunca antes había usado el GDI ni había manipulado imágenes, por lo que supongo que estoy malinterpretando algo fundamental sobre el proceso que se debe seguir. ¿Puede alguien ayudarme y señalarme en la dirección correcta?

preguntado el 28 de julio de 12 a las 09:07

2 Respuestas

tienes que guardar tu transformación llamada canevas en un archivo bmp para cada uno. Después, puede usar esos bmp para dibujar su archivo combinado. Pero no establezca la misma ubicación cuando dibuje la imagen porque dos imágenes en la misma ubicación solo verán una, la última.

            // 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");

Respondido 28 Jul 12, 11:07

ahh ok genial, ahora veo lo que me estaba perdiendo. He actualizado mi código y lo tengo funcionando ahora. Gracias por su ayuda. - jcvandan

Sí, lo estás haciendo mal. Las modificaciones del objeto Graphics no tienen efecto a menos que realmente dibuje con él. Lo cual no haces, solo dibujas con mergedCanvas. Así que reordena tu código, similar a esto:

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);
}

no te saltes esos usar declaraciones por cierto, muy importante en mapas de bits.

Respondido 28 Jul 12, 13:07

gracias por la sugerencia, no me di cuenta de que los mapas de bits implementaron IDisposable - jcvandan

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.