private float Min(float a, float b)
{
//return a < b ? a : b;
if (a < b)
return (float)a;
return (float)b;
}
float test = Min(8 / 7, 6 / 5); // Debugger: 1.0 (float)
Wieso rundet C# hier den Rückgabewert ab bzw. wieso liefert es mir nicht einfach 1.1428 (ca. 8/7)?
Wie bekomme ich es wie gewünscht hin?
Wie könnte mir das Ändern der Seitengröße hier weiterhelfen?
Zitat von Abt
Zu den Grundlagen/Unterschieden zwischen Drucker DPI und Bildschirm / Grafik "DPI" siehe mein Beitrag in Maßstabsgetreu zeichnen und drucken
Mit dem Umrechnen von DPI in Zentimeter oder umgekehrt komm ich durchaus auf ein vernünftiges Druckergebnis.
Das gilt sowohl für den virtuellen XPS- als auch für meine HP-Drucker.
Die Klasse Grid ist noch kein Control, vielmehr eine Testklasse für ein übergeordnetes Projekt, das auf ein Control hinauslaufen wird.
Es beinhaltet auch eine BackColor-Eigenschaft, die die Hintergrundfarbe des darunterliegenden Parent-Controls setzt.
Also habe ich folgendes versucht:
wie lustig, dass mir das "Verzehren" nicht aufgefallen ist. Danke!
Externe Funktionen wie StretchBlt() und TransparentBlt() skalieren optisch ansprechender als Graphics.DrawImage(), ABER ... es mogelt sich ein grauer Hintergrund (RGB[211,211,211]) hinzu, den ich nicht wegbekomme.
//zeigt die dünneren Linien etwas besser an
Graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
// Beide Methoden führen zu einer Verzehrung
Graphics.DrawImage(bmp, 0, 0);
Graphics.DrawImageUnscaled(bmp, 0, 0);
Als letzten Ausweg sehe ich eine zweite Paint-Methode zu schreiben, die einen Skalierfaktor beinhaltet.
Damit sollte es angemessen erscheinen, siehe Dateianhang.
Ich möchte eine selbstgezeichnete Grafik auf eine A4 Seite anpassen und ausdrucken
Wenn die Grafik über das Maß hinaus geht, soll sie verkleinert werden, ansonsten soll die Größe übernommen werden.
Zum Skalieren der Grafik benutze ich die Graphics.DrawImage() Methode.
Dabei entsteht die unerwünschte Verzehrung, die Linien unterschiedlich dick darstellt, siehe Dateianhang.
// VERZEHRUNG
private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
using (Bitmap b = new Bitmap(_grid.Width, _grid.Height))
{
using (Graphics g = Graphics.FromImage(b))
{
_grid.Paint(g);
e.Graphics.DrawImage(b, 0, 0);
// e.Graphics.DrawImage(b, 0, 0, 400, 400);
b.Save(_path, System.Drawing.Imaging.ImageFormat.Png);
}
}
}
// KEINE VERZEHRUNG
private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
_grid.Paint(e.Graphics);
}
Erst dachte ich, es läge am Bitmap-Objekt und habe jene Grafik ohne optische Probleme abgespeichert, siehe Dateianhang.
Im Anschluss kommentierte ich jene DrawImage() Zeile aus und versuchte - ohne die Breite und Höhe zu verändern - die Grafik 1:1 an das Drucker-Ereignis weiterzuleiten, mit entsprechenden Erfolgen, siehe Code.
Meines Erachtens liegt mein Problem an der DrawImage() Methode selbst.
Welche Alternative bzw. Herangehensweise gäbe es dazu?
Wenn ich meine Zentimeter-Angaben auf diese Weise in Pixel umrechne - bezogen auf den DPI-Wert des Druckers - und daraus ein entsprechend großes Bitmap-Objekt entsteht, bekomme ich dann meine Zeichnung im gewünschten Maß ausgedruckt?
Wie zeichnet man u.a. ein Viereck, dass 4 x 3 (B x H) Zentimetern auf dem Monitor entspricht und beim Ausdrucken ebenso groß erscheint?
Die Zeichenoberfläche weist 72 dpi auf, der Monitor 96 dpi und der Drucker wird bei 300 dpi liegen.
Kann die Bitmap-Klasse das managen, und wenn ja, wie geht man da prinzipiell vor?
Auf einer der Picturebox zeichne ich ein Gitter, das ich als Grafik speichern möchte, um es später ausdrucken zu können.
Beim Speichern bekomme ich je nach Bildformat einen schwarzen Hintergrund oder nichts geliefert.
Was mache ich falsch?
private int _rowCount = 5;
private int _colCount = 3;
private int _cellWidth = 120;
private int _cellHeight = 60;
private string _path = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Gitter.png");
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
for (int row = 1; row < _rowCount; row++)
e.Graphics.DrawLine(Pens.Black, 0, row * _cellHeight, _colCount * _cellWidth, row * _cellHeight);
for (int col = 1; col < _colCount; col++)
e.Graphics.DrawLine(Pens.Black, col * _cellWidth, 0, col * _cellWidth, _rowCount * _cellHeight);
e.Graphics.DrawRectangle(Pens.Black, 0, 0, _cellWidth * _colCount, _cellHeight * _rowCount);
}
private void button1_Click(object sender, EventArgs e)
{
using (Graphics g = pictureBox1.CreateGraphics())
{
using (Bitmap b = new Bitmap(pictureBox1.Width, pictureBox1.Height, g))
{
b.Save(_path, System.Drawing.Imaging.ImageFormat.Png);
}
}
}