Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Portal
  • |
  • Mitglieder
Beiträge von Sw4t
Thema: Grafik beim Drucken verzerrt
Am im Forum: Grafik und Sound


// GRID Klasse
public void Print(Graphics g, int marginX, int marginY, int dpi)
{
    if (g == null)
        return;

    int pageWidth, pageHeight = 0;
    int maxWidth, maxHeight = 0;
    float f = 0;

    if (Width > Height) // Landscape
    {
        pageWidth = UnitCalc.MillimeterToPixel(297, dpi);
        pageHeight = UnitCalc.MillimeterToPixel(210, dpi);
    }
    else // Portrait
    {
        pageWidth = UnitCalc.MillimeterToPixel(210, dpi);
        pageHeight = UnitCalc.MillimeterToPixel(297, dpi);
    }

    maxWidth = pageWidth - 2 * marginX;
    maxHeight = pageHeight - 2 * marginY;

    f = Min(maxWidth / (float)Width, maxHeight / (float)Height);

    maxWidth = (int)(Width * f);
    maxHeight = (int)(Height * f);
    marginX = (int)((pageWidth - maxWidth) / 2);
    marginY = (int)((pageHeight - maxHeight) / 2);

    if (UseBackColor)
        using (SolidBrush br = new SolidBrush(BackColor))
            g.FillRectangle(br, marginX, marginY, maxWidth, maxHeight);

    g.ScaleTransform(f, f);
    DrawCells(g, (int)(marginX / f), (int)(marginY / f));
    DrawGrid(g, (int)(marginX / f), (int)(marginY / f));
}

// FORM Klasse
private void tsmiPrint_Click(object sender, EventArgs e)
{
    printDialog1.Document = printDocument1;

    if (printDialog1.ShowDialog() == DialogResult.OK)
    {
        printDocument1.DefaultPageSettings.Landscape = _grid.Width > _grid.Height;
        printDocument1.Print();
    }
}

private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
    _grid.Print(e.Graphics, 30, 30, 100);
}

Thema: Min() zweier Gleitkommazahlen zurückgeben
Am im Forum: Grundlagen von C#

Zitat von "Palladin007"
Der Compiler sieht ja nur "Zahl" und wenn Du keinen Typ definierst, ist "Zahl" eben ein Int.
Danke, das wusste ich bislang noch nicht.
Zitat von "gfoidl"
für Komplettheit: Math.Min ist eine Methode in .NET für das Minimum von 2 Werten.
Hallo gfoidl,
Mit Math.Min() hatte ich das Problem, dass es mir ständig einen Integer lieferte. Nun weiss ich auch, warum.

Thema: Min() zweier Gleitkommazahlen zurückgeben
Am im Forum: Grundlagen von C#

Oh man. Float ist ein lästiger Datentyp. Danke dir

Thema: Min() zweier Gleitkommazahlen zurückgeben
Am im Forum: Grundlagen von C#


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?

Thema: Grafik beim Drucken verzerrt
Am im Forum: Grafik und Sound

Zitat von Th69
Zum Skalieren kann auch einfach vorher Graphics.ScaleTransform aufgerufen werden, s.a. Verwenden der globalen Transformation.

Und danach dann _grid.Paint(e.Graphics) aufrufen (wenn du die Bitmap nicht benötigst, ansonsten die Bitmap entsprechend vorher vergrößern).

♪♫ Das ist die perfekte Lösung, das ist der perfekte Hinweis.
Mehr als Graphics.ScaleTransform() hat es nicht gebraucht.

Thema: Grafik beim Drucken verzerrt
Am im Forum: Grafik und Sound

Zitat von david.m
PrintPageEventArgs bietet doch die Eigenschaften für die Seitengröße.
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.

Thema: Grafik beim Drucken verzerrt
Am im Forum: Grafik und Sound

Wie soll ich sonst die Original-Grafik, die im _grid.Paint() gezeichnet wird, skaliert an den Drucker übergeben?

Thema: Grafik beim Drucken verzerrt
Am im Forum: Grafik und Sound

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:


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

            IntPtr hdcDest = e.Graphics.GetHdc();
            IntPtr hdcSrc = g.GetHdc();
            IntPtr hBitmap = b.GetHbitmap();

            ExternFunctions.SelectObject(hdcSrc, hBitmap);
            ExternFunctions.SetStretchBltMode(hdcDest, ExternFunctions.StretchMode.STRETCH_HALFTONE);
            ExternFunctions.TransparentBlt(hdcDest, 0, 0, b.Width * 20, b.Height * 20, hdcSrc, 0, 0, b.Width, b.Height, (uint)(_grid.BackColor.ToArgb() & 0xFFFFFF));

            g.ReleaseHdc();
            e.Graphics.ReleaseHdc();
        }
    }
}


Und so erscheinen die freien Flächen grau, sogar dann, wenn ich die Hintergrundfarbe (hier Gelb) explizit übergebe.

Thema: Grafik beim Drucken verzerrt
Am im Forum: Grafik und Sound

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.

Thema: Grafik beim Drucken verzerrt
Am im Forum: Grafik und Sound


//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.


private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
    _grid.Paint(e.Graphics);
}

Wie handhabt Windows einen direkten Druckauftrag eines Bildes, samt der Skalierung und Ausrichtung? Mit der Windows Imaging Component?

Thema: Grafik beim Drucken verzerrt
Am im Forum: Grafik und Sound

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?

Thema: Maßstabsgetreu zeichnen und drucken
Am im Forum: Grafik und Sound

Kleine Abweichungen gehen in Ordnung.
Wenn anstelle von 5cm dann 4,8cm gedruckt werden, werde ich es überleben.

Wie verlässlich ist diesbezüglich ein XPS Drucker?
Welches Größenformat stellt ein XPS Drucker dar? A4? Immer, oder kann man das anpassen?

Thema: Maßstabsgetreu zeichnen und drucken
Am im Forum: Grafik und Sound

Zitat
Pixel = dpi * Zentimeter / 2,54
Zentimeter = Pixel * 2,54 / dpi

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?

Thema: Maßstabsgetreu zeichnen und drucken
Am im Forum: Grafik und Sound

Guten Abend!

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?

Thema: Picturebox Zeichnung speichern
Am im Forum: Grafik und Sound

Danke für den Hinweis

So funktioniert es nun bei mir


using System;
using System.Drawing;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        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 Bitmap _bmp;

        public Form1()
        {
            InitializeComponent();
            _bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height);
        }

        void DrawCells(Graphics g)
        {
            for (int row = 1; row < _rowCount; row++)
                g.DrawLine(Pens.White, 0, row * _cellHeight, _colCount * _cellWidth, row * _cellHeight);

            for (int col = 1; col < _colCount; col++)
                g.DrawLine(Pens.White, col * _cellWidth, 0, col * _cellWidth, _rowCount * _cellHeight);

            g.DrawRectangle(Pens.White, 0, 0, _cellWidth * _colCount, _cellHeight * _rowCount);
        }

        void SaveCells(string fileName)
        {
            using (Graphics g = Graphics.FromImage(_bmp))
            {
                DrawCells(g);
                _bmp.Save(_path, System.Drawing.Imaging.ImageFormat.Png);
            }
        }

        private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
            DrawCells(e.Graphics);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            SaveCells(_path);
        }

        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            if (_bmp != null)
                _bmp.Dispose();
        }
    }
}

Thema: Picturebox Zeichnung speichern
Am im Forum: Grafik und Sound

Mahlzeit!

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