Laden...

Bilder verkleinert drucken, ohne dass Auflösung (Pixelinformation) verlorengeht

Erstellt von 0x33_ vor 9 Jahren Letzter Beitrag vor 9 Jahren 3.142 Views
0
0x33_ Themenstarter:in
3 Beiträge seit 2014
vor 9 Jahren
Bilder verkleinert drucken, ohne dass Auflösung (Pixelinformation) verlorengeht

Hallo, ich benutze diesen Code-Schnipsel um die Bilder zu verkleinern.


        private static Bitmap ResizePicByWidth(Image sourceImage, double newWidth)
        {
            double sizeFactor = newWidth / sourceImage.Width;
            double newHeigth = sizeFactor * sourceImage.Height;
            Bitmap newImage = new Bitmap((int)newWidth, (int)newHeigth);
            using (Graphics g = Graphics.FromImage(newImage))
            {
                g.InterpolationMode = InterpolationMode.HighQualityBicubic;

               // g.SmoothingMode = SmoothingMode.HighQuality;
               // g.InterpolationMode = InterpolationMode.HighQualityBilinear;
               // g.PixelOffsetMode = PixelOffsetMode.HighQuality;
                
                g.DrawImage(sourceImage, new Rectangle(0, 0, (int)newWidth, (int)newHeigth));
            }
            return newImage;
        }

Hiermit lade ich 3 bilder und ein layout (bild) und möchte anschließend die 3 bilder verkleinern und dann alles zeichnen..drucken.


		  private void printDocument2_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
        {
				//EINSTELLUNGEN
                e.Graphics.SmoothingMode = SmoothingMode.HighQuality;
                e.Graphics.InterpolationMode =InterpolationMode.HighQualityBicubic;
                e.Graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
				
				//LAYOUT LADEN
                FileStream layoutStream = new FileStream("layout6.png", FileMode.Open, FileAccess.Read); //1750*1242 __300 dpi
                Bitmap bm = (Bitmap)Image.FromStream(layoutStream);
                bm.SetResolution(300, 300);
				
				//3 BILDER LADEN
                FileStream layoutStream1 = new FileStream("bild1.JPG", FileMode.Open, FileAccess.Read);	//5184*3456 __72 dpi
                Bitmap bm1 = (Bitmap)Image.FromStream(layoutStream1);
                bm1.SetResolution(300,300);
                
                FileStream layoutStream2 = new FileStream("bild2.JPG", FileMode.Open, FileAccess.Read); //5184*3456 __72 dpi
                Bitmap bm2 = (Bitmap)Image.FromStream(layoutStream2);
                bm2.SetResolution(300, 300);
                
                FileStream layoutStream3 = new FileStream("bild3.JPG, FileMode.Open, FileAccess.Read); //5184*3456 __72 dpi
                Bitmap bm3 = (Bitmap)Image.FromStream(layoutStream3);
                bm3.SetResolution(300, 300);

				//RESIZE BY WIDTH
                bm1 = ResizePicByWidth(bm1, size1);
                bm2 = ResizePicByWidth(bm2, size2);
                bm3 = ResizePicByWidth(bm3, size3);

				//3 BILDER ZEICHNEN
                e.Graphics.DrawImageUnscaled(bm1, bm1x, bm1y);
                e.Graphics.DrawImageUnscaled(bm2, bm2x, bm2y);
                e.Graphics.DrawImageUnscaled(bm3, bm3x, bm3y);
				
				//LAYOUT DRÜBER ZEICHNEN
                e.Graphics.DrawImageUnscaled(bm, 0, 0); 
                
				//STREAMS SCHLIEßEN
                layoutStream1.Close();
                layoutStream2.Close();
                layoutStream3.Close();
                layoutStream.Close();
        }

Ich habe einen virtuellen drucker (pdf24) auf den ich zum testen drucke.
Die 3 bilder muss ich komischerweise auf breite 230 verkleinern um sie z.B. nebeneinander anzuordnen (breite von a6 = 1750) => also sollte 580 gehen aber wird dann viel zu groß angezeigt.

Im Ausdruck sind diese dann aber tatsächlich größer und verpixelt auf dem layout.
Wo mache ich etwas falsch?
(A6 _//1750*1242 __300 dpi)

Vielen Dank =)

4.221 Beiträge seit 2005
vor 9 Jahren

Du nimmst somit ein Bild... veränderst dessen Auflösung und zeichnest es dann auf einem kleineren Bild.

Hast Du mal versucht, statt beim OriginalBild die Resolution zu ändern in der ResizePicByWidth auf dem newImage die Resolution zu ändern ?

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

0
0x33_ Themenstarter:in
3 Beiträge seit 2014
vor 9 Jahren

also du meintest ich soll erst alles in originalgröße zeichnen und dann verkleinern?


                FileStream layoutStream = new FileStream("biglayout.png", FileMode.Open, FileAccess.Read);
                Bitmap bm = (Bitmap)Image.FromStream(layoutStream);
                bm.SetResolution(300, 300);

                FileStream layoutStream1 = new FileStream("bild.jpg", FileMode.Open, FileAccess.Read); //letztes bild
                Bitmap bm1 = (Bitmap)Image.FromStream(layoutStream1);
                bm1.SetResolution(300, 300);

                FileStream layoutStream2 = new FileStream("bild.jpg", FileMode.Open, FileAccess.Read); //letztes bild-1
                Bitmap bm2 = (Bitmap)Image.FromStream(layoutStream2);
                bm2.SetResolution(300, 300);

                FileStream layoutStream3 = new FileStream("bild.jpg", FileMode.Open, FileAccess.Read); //letztes bild-2
                Bitmap bm3 = (Bitmap)Image.FromStream(layoutStream3);
                bm3.SetResolution(300, 300);
                try
                {
                    Bitmap bildgross = new Bitmap(15600, 11072);
                    bildgross.SetResolution(300, 300);

                    Graphics graphic = Graphics.FromImage(bildgross);

                graphic.DrawImageUnscaled(bm1, 0, 0); //(bis 5184)
                graphic.DrawImageUnscaled(bm2, 5190, 0);
                graphic.DrawImageUnscaled(bm3, 10380, 0);
                graphic.DrawImageUnscaled(bm, 0, 0);

                Bitmap bmp = new Bitmap(15600, 11072, graphic);
                bmp = ResizePicByWidth(bmp, 1750);
                pbox_layout.Image = bmp;

problem hierbei ist dass ich eben alles rießig lassen muss um 3 bilder nebeneinander zu bekommen
new Bitmap(15600, 11072);

was mir auch gleich ne exception wirft..
(Anhang)
vll. noch ne andere idee warum sich das so verschiebt oder was mach ich jetzt wieder falsch?..

edit:
nochmal zu meinem ersten post, ich habe das ganze jetzt nochmal in einem grafikprogramm simuliert und mir kommt es so vor als würde das resize tatsächlich auf 230er breite runterskalieren aber beim aufzeichnen wird es wieder vergrößert (in diesem fall auf ca. 715er breite).
was die verschlechterung des bildes auch wiederspiegelt.
Wo passiert das und was kann ich dagegen machen? danke 😃

4.221 Beiträge seit 2005
vor 9 Jahren

Du hast meinen Post falsch verstanden... lies es nochmals 😃

Statt bm2.SetResolution (das OriginalBild)

Mach newImage.SetResolution in der originalen ResizePicByWidth

Damit Du beim verkleinern des Bildes auf ein Bild mit kleinem Size aber hoher Auflösung zeichnest.

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

0
0x33_ Themenstarter:in
3 Beiträge seit 2014
vor 9 Jahren

geil, so funktionierts. wär ich nie drauf gekommen..

Vielen Dank! =)

4.221 Beiträge seit 2005
vor 9 Jahren

Stell dir ein Bild als Schachbrett vor. Es hat eine gewisse Anzahl Felder.
Ein kleineres Bild derselben Grösse hat gleich grosse Felder (aber logischerweise weniger).
Durch die Erhöhung der Resolution im kleinen Bild erhöhst Du die Anzahl der Felder (diese werden dadurch kleiner).

Dann ist es plötzlich ganz logisch.

Umgekehrt wird beim vergrössern eines Bildes nur Speicher verschwendet wenn man nicht gleichzeitig die Auflösung reduziert (ohne Reduzierung der Auflösung hast Du dann mehr Felder... Also 1 Ausgangsfeld wird auf mehrere Zielfelder projiziert).

Alles klar ? Ist so ähnlich wie die Körnigkeit in der Analogphotographie.

Das waren noch Zeiten als ich noch selber aus Schwarzweiss Negativen Abzüge erstellt habe 😃

Gruss Programmierhans

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...