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 =)
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...
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 😃
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...
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...