[Qt] Bild mit exakter Größe in mm drucken [gelöst]



  • Hallo in die Runde,
    ich hänge mal wieder an einem Problem fest und komme nicht weiter.

    Ich möchte/muss ein Bild mit einer exakten Größe von z.B. 160mm x 240mm drucken. Um Missverständnissen vorzubeugen: das gedruckt Bild muss eine Größe von 160mm x 240mm haben.
    Das gedruckte Bild wird entweder zu klein oder wird auf den ganzen Druckbereich hochskaliert.

    Mein Code bisher:

        //Bild aus anderer Klasse holen
        QImage image = PatternHolder::instance()->getPrintableTemplate();
        QPrinter printer;
        QPrintDialog printDialog(&printer, this);
        printDialog.setWindowTitle("Print Pattern");
        
        //printDialog anzeigen etc
        if(printDialog.exec() != QDialog::Accepted) return;
    
        QPainter painter(&printer);
    
        //Bildgröße in Pixeln für 160mm x 240mm großes Bild  
        //abhängig von der Druckerauflösung
        QRectF printSize = QPageSize(QSizeF(160,240), QPageSize::Millimeter).rectPixels(printer.resolution());
    
        //Skalierungsfaktor berechnen
        QSize imageSize = image.size();
        imageSize.scale(printSize.width(),printSize.height(), Qt::KeepAspectRatio);
    
        //Bild zentrieren
        QRect printRect = QRect((printer.pageRect().width() - imageSize.width())/2, (printer.pageRect().height() - imageSize.height())/2, 
                                imageSize.width(), imageSize.height());
    
        //viewport und window setzen, Bild zeichnen    
        painter.setViewport(printRect);
        painter.setWindow(printRect);
    
        painter.drawImage(printRect,image);
    

    Ich hoffe, ihr könnt mir weiterhelfen, diese Funktion ist (leider) sehr wichtig...

    PS: Bevor jemand einfach "Google hilft" schreibt, ich habe schon sehr viel gesucht, konnte aber nichts passendes finden, ausser wie man das Bild skaliert, dass es auf die Seite passt. Aber nicht, wie man ein Bild mit einer exakten Größe in mm druckt...


  • |  Mod

    Habe mit solchem Code recht wenig Erfahrung.
    Aber mir fällt in dem eigentlichen Code von dir was auf:

     QRectF printSize = QPageSize(QSizeF(160,240), QPageSize::Millimeter).rectPixels(printer.resolution());
    

    QPageSize ist hier nur ein temporary. Das erstellte Objekt wird kurz für rectPixels aufgerufen, danach aber wieder zerstört.
    Wahrscheinlich musst du dieses PageSize objekt aber vom Printer anfordern oder es dort setzen, so wie ich Qt APIs kenne.

    Da du dies nicht machst, wird es auch nicht zur Ausführung kommen...



  • @phlox81
    danke für die Antwort.
    Allerdings nutze ich die Zeile bzw. QPageSize tatsächlich auch nur als temporary um die Größe von 160mm x 240mm in Pixeln zu bekommen, damit ich das Bild auf die Größe in Pixeln skalieren kann.
    Aber die Anmerkung bringt mich auf die Idee, ob ich die PageSize des printers nicht direkt setzen könnte. Werd mal in der Docu nachlesen ob das möglich ist, damit könnte ich mir wahrscheinlich die Ganze Skalierung ersparen...



  • @cherup sagte in [Qt] Bild mit exakter Größe in mm drucken:

    Das gedruckte Bild wird entweder zu klein oder wird auf den ganzen Druckbereich hochskaliert.

    Um wie viel zu klein?



  • Nicht viel, ~3-4mm in der Höhe und Breite.
    Das liegt grundsätzlich noch im Toleranzbereich, ich hätte es trotzdem lieber exakt.
    Ich arbeite an einem Pose-Estimation System und über die Größe des Bildes wird der Abstand bestimmt.

    Kann die Abweichung evtl auch daran liegen, das ich erst ein PDF erzeugt habe und dieses dann gedruckt habe?
    Mein Drucker will das jetzt nicht mehr direkt drucken und ich hab keine Ahnung warum, da es schon lief...



  • Schonmal probiert dein Bild in ein image zu zeichnen und z.b. als png zu speichern und dann dieses Image unskalliert mit einem anderen tool zu drucken?
    Tritt dann die gleiche abweichung auf?
    Wenn ja, könnte es dann eventuell am drucker liegen, dass der eine gewisse toleranz hat

    Bzw. du hast es in ein PDF gedruckt stimmt dort die größe? (Sollte testbar sein, wenn man das pdf unskalliert darstellt (aka 100% zoom)



  • Im PDF ist die Größe auch etwas zu klein. Allerdings habe ich eben die Idee mit dem PNG ausprobiert. Als ich dort bei den Druckeinstellungen das Bild auf die exakte Größe skaliert habe trat die gleiche Abweichung auf. Also liegt es entweder am Drucker oder es liegt am QImage. Ich werde mal testen, ob da irgendwelche "unsichtbaren Ränder" sind, die die Größe verfälschen...

    Danke für die Hilfe bisher 🙂



  • Hast du versucht das PNG auserhalb deines tools zu drucken?
    Mit irgend einem image viewer, der unskalliertes drucken unterstüzt.



  • Ja, mit dem Standard imageviewer von Ubuntu auf 160 x 240 mm skaliert und unskaliert mit Gimp. Beides mal die gleiche Abweichung. Aber da mir Gimp bei den Bildeigenschaften die korrekte Druckgröße angibt liegt es definitiv am Drucker oder an irgendwelchen Einstellungen, nicht am Code.

    Von daher: Thema ist mehr oder weniger gelöst, der Code ist insoweit korrekt, dass er ein auf mm skaliertes Bild erzeugt.

    Dass das Drucken (bei mir) nicht funktioniert ist ein Problem für einen anderen Tag...

    Vielen Dank für eure Hilfe 🙂



  • @cherup sagte in [Qt] Bild mit exakter Größe in mm drucken [gelöst]:

    Nicht viel, ~3-4mm in der Höhe und Breite.

    Womit stellst du dies fest?



  • Indem ich mit einem Lineal das gedruckte Bild messe. Es soll 160mm breit sein, ist aber real nur ~157mm breit.


  • |  Mod

    Du skalierst das Bild mit KeepAspectRatio, was ja auch richtig ist.
    Aber dann wird wohl nur eine der Seiten die korrekte Länge haben, wenn dein Bild nicht die richtigen Seitenverhältnisse hat.



  • Dass Ausdrucke mal ein paar Prozent bei der Grösse daneben sind ist zwar blöd, aber leider nicht ganz selten. Es kann natürlich an der KeepAspectRatio Sache liegen. Kann aber auch passieren wenn das druckende Programm an und für sich alles richtig macht.



  • An der KeepAspectRatio liegt es nicht, das Bild ist ein von mir erzeugtes Muster mit einem Seitenverhältnis von 2:3. Die Größe in mm berechnet sich eigentlich automatisch aus dem Seitenverhältnis des Musters und einer voreingestellten Breite. Ich hab das hier nur vereinfacht, um die Lesbarkeit zu erhöhen. Mittlerweile habe ich die funktion auch etwas umgeschrieben, so dass ich nur die breite übergebe und ein korrekt skaliertes Bild aus einer anderen Klasse zurückbekomme.
    Und Gimp sagt mir ja auch, dass die Druckgröße korrekt ist, von daher wirds am Drucker oder an Treibern liegen.
    Falls ich durch die falsche Größe tatsächlich Probleme bekomme, werde ich das wahrscheinlich kompensieren können. Aber eine Abweichung von ~2% sollte keine großen Probleme bereiten.

    Nochmals danke an alle, die geholfen haben. Ich hab schon sehr an meinem Verstand gezweifelt, weil ich keinen logischen Fehler gefunden habe. Auf die Idee, dass es am Drucker oder an Treibern liegt wäre ich wahrscheinlich erst gekommen, wenn ich aus purer Verzweiflung den Schreibtisch mit meinem Kopf zerbrochen hätte 😃