Laden...

Mehrere Tiff Images zusammenführen (transparente Bilder übereinander legen)

Erstellt von briloner vor 9 Jahren Letzter Beitrag vor 9 Jahren 3.056 Views
B
briloner Themenstarter:in
5 Beiträge seit 2014
vor 9 Jahren
Mehrere Tiff Images zusammenführen (transparente Bilder übereinander legen)

Hallo zusammen,

ich habe mehrere TIFFs mit transparentem Hintergrund. Alle haben die selbe Größe. Jetzt möchte ich diese Bilder übereinander legen und als ein neues TIFF speichern.

Die einzelnen TIFFs sind quasi Basteine eines Labels das ich vor dem Druck dynamisch zusammenbauen muss.

Ich hab mal Dr. Google befragt, aber nicht wirklich was gefunden.

Die TIFFS kann ich mergen, jedoch sehe ich nur das letzte was mit die anderen mit seinem weißen Hintergrund (der laut unserem Marketing transparent ist) die anderen überlagert.

Jemand eine Idee dazu?

Gruß
Briloner

49.485 Beiträge seit 2005
vor 9 Jahren

Hallo briloner,

ob Tiff oder nicht. Erstmal musst du aus den Bildern Bitmap-Objekte machen.

Wenn du dann mit Graphics.FromImage.DrawImage ein an bestimmten Stellen transparentes Bild über anderes bestehendes Bild zeichnest, dann bleibt an den transparenten Stellen das ursprüngliche Bild sichtbar. Nach deiner Beschreibung müsste das, das sein, was du willst.

herbivore

B
briloner Themenstarter:in
5 Beiträge seit 2014
vor 9 Jahren

Bisher mache ich das so, aber das klappt nicht wie beschrieben:

PS: Ist quick & dirty zum testen.. 😉


static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);


            string firstFile = @"X:\Datenaustausch\Michel\h_leuchte_enthaelt_de_weiß.tif";
            string secondFile = @"X:\Datenaustausch\Michel\h_leuchte_geeignet_de_weiß.tif";

            List<System.Drawing.Bitmap> images = new List<System.Drawing.Bitmap>();

            using (Stream imageStreamSource = new FileStream(firstFile, FileMode.Open, FileAccess.Read, FileShare.Read))
            {
                TiffBitmapDecoder decoder = new TiffBitmapDecoder(imageStreamSource, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
                BitmapSource bitmapSource = decoder.Frames[0];
                images.Add(BitmapFromSource(bitmapSource));
            }

            using (Stream imageStreamSource = new FileStream(secondFile, FileMode.Open, FileAccess.Read, FileShare.Read))
            {
                TiffBitmapDecoder decoder = new TiffBitmapDecoder(imageStreamSource, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
                BitmapSource bitmapSource = decoder.Frames[0];
                images.Add(BitmapFromSource(bitmapSource));
            }

            Bitmap target = new Bitmap(images[0].Width, images[0].Height, PixelFormat.Format32bppArgb);
            target.MakeTransparent();
            Graphics graphics = Graphics.FromImage(target);
            graphics.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceCopy; // this is the default, but just to be clear

            graphics.DrawImage(images[0], 0, 0);
            graphics.DrawImage(images[1], 0, 0);

            target.Save("c:\\filename.tiff", ImageFormat.Tiff);


        }


        public static Bitmap BitmapFromSource(BitmapSource bitmapsource)
        {
            Bitmap bitmap;
            using (var outStream = new MemoryStream())
            {
                BitmapEncoder enc = new BmpBitmapEncoder();
                enc.Frames.Add(BitmapFrame.Create(bitmapsource));
                enc.Save(outStream);
                bitmap = new Bitmap(outStream);
            }
            return bitmap;
        }

Resultat: Das letzte Image gewinnt und ist zu sehen....

B
briloner Themenstarter:in
5 Beiträge seit 2014
vor 9 Jahren

Ich hab es.

Für jeden den interessiert wie:

static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);


            string firstFile = @"X:\Datenaustausch\Michel\h_led_lampen_nicht_austauschbar_de.tif";
            string secondFile = @"X:\Datenaustausch\Michel\h_leuchte_enthaelt_de.tif";

            Bitmap firstBitmap = GetBitmapFromTiff(firstFile);
            firstBitmap.MakeTransparent();
            Bitmap secondBitmap = GetBitmapFromTiff(secondFile);
            secondBitmap.MakeTransparent();


            Graphics graphics = Graphics.FromImage(firstBitmap);
            //graphics.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceCopy; // this is the default, but just to be clear

            graphics.DrawImage(secondBitmap, 0, 0);

            firstBitmap.Save("c:\\filename.png", ImageFormat.Png);


        }


        public static Bitmap GetBitmapFromTiff(string path)
        {
            using (Stream imageStreamSource = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read))
            {
                TiffBitmapDecoder decoder = new TiffBitmapDecoder(imageStreamSource, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
                BitmapSource bitmapSource = decoder.Frames[0];
                return BitmapFromSource(bitmapSource);
            }
        }

        public static Bitmap BitmapFromSource(BitmapSource bitmapsource)
        {
            Bitmap bitmap;
            using (var outStream = new MemoryStream())
            {
                BitmapEncoder enc = new BmpBitmapEncoder();
                enc.Frames.Add(BitmapFrame.Create(bitmapsource));
                enc.Save(outStream);
                bitmap = new Bitmap(outStream);
            }
            return bitmap;
        }