Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. How to create an image of a specific width and height
QtWS25 Last Chance

How to create an image of a specific width and height

Scheduled Pinned Locked Moved General and Desktop
8 Posts 2 Posters 5.9k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • V Offline
    V Offline
    Victor
    wrote on last edited by
    #1

    Halo,

    I must create a QImage of specified size in inches. For example 6 inches wide and 4.25 inches high. The paper size and margins can change, so I must allow for that.

    I need to avoid scaling.

    I am using QT5.1 rc on Ubuntu linux.

    I tried many variations of the following code, but it does not work as expected, and by trial-and-error found that if I hardcode DPI to 96 its gets close, but do not understand why or how
    this would need to change with a change in paper size, orientation or margins.

    @

    #include <QApplication>
    #include <QTextDocument>
    #include <QTextCursor>
    #include <QPrinter>
    #include <QAbstractTextDocumentLayout>

    int main(int argc, char *argv[])
    {
    QApplication app(argc, argv);

    // set up the printer
    QPrinter printer(QPrinter::HighResolution);
    printer.setOutputFormat(QPrinter::PdfFormat);
    printer.setOrientation(QPrinter::Portrait);
    printer.setPaperSize(QPrinter::Letter);
    printer.setPageMargins(6.35,12.7,6.35,12.7,QPrinter::Millimeter);
    printer.setResolution(1200); 
    printer.setFullPage(true);
    printer.setColorMode(QPrinter::Color);
    
    // create any empty document
    QTextDocument doc;
    
    // set up document layout, page size, etc
    doc.documentLayout()->setPaintDevice(&printer);
    doc.setPageSize(QSizeF(printer.pageRect().size()));
    
    // create the image of specified size
    const float widthInches=6.0;
    const float heightInches=4.25;
    
    // QImage w and h must be in pixels that match the paint device?
    const int xDPI=doc.documentLayout()->paintDevice()->physicalDpiX();
    const int yDPI=doc.documentLayout()->paintDevice()->physicalDpiY();
    
    const float w=widthInches*xDPI;
    const float h=heightInches*yDPI;
    QImage theImage(w,h,QImage::Format_RGB32);
    
    // just fill it with color for example
    theImage.fill(Qt::blue);
    
    // put the image in the document
    QTextCursor cursor(&doc);
    cursor.insertImage(theImage);
    
    // create the PDF
    printer.setOutputFileName(QString("myDoc.pdf"));
    doc.print(&printer);
    
    return 0;
    }
    

    @

    Any help is appreciated greatly.
    Kind Regards,
    Vic

    1 Reply Last reply
    0
    • S Offline
      S Offline
      SergioDanielG
      wrote on last edited by
      #2

      Hi Victor.
      In line 17 of your code, you are setting printer resolution to 1200 dpi.
      But in lines 39, 40 you are using 96 as dpi.
      In base of that, you must to change line 17 and set printer resolution to 96 or change lines 39, 40 and replace to 1200 dpi.
      Regards.

      www.ftatv.com.ar El foro argentino de la TV libre

      1 Reply Last reply
      0
      • V Offline
        V Offline
        Victor
        wrote on last edited by
        #3

        Sergio,

        Thank you for your reply.

        Line 32 defines the macro so that lines 35 and 36 are compiled. This is what I need to make work (because the paper size or image size or resolution could change too, so I need a programmatic way to pick up the values).

        Using lines 35 and 36 in fact results in the value 1200 for xDPI and yDPI, but as mentioned originally this produces a horribly wrong result in the pdf.

        Any ideas?

        1 Reply Last reply
        0
        • V Offline
          V Offline
          Victor
          wrote on last edited by
          #4

          I updated my original post to remove the ifdef macro and the confusion I hope.

          Can anyone help? How difficult can it be to create an image of a specific width and height?

          1 Reply Last reply
          0
          • S Offline
            S Offline
            SergioDanielG
            wrote on last edited by
            #5

            Hi Victor, Sorry for delay.
            I'm working in a little project and to make a barcode, I use "QPixmap":http://qt-project.org/doc/qt-5.0/qtgui/qpixmap.html , something like
            @QPixmap pixmap (w , h);
            ...
            painter.setFont(fontA);
            painter.drawText(QRect(0,45mm,85.6mm,5mm), Qt::AlignHCenter, cliente);
            painter.drawPixmap(QRect(5
            mm, 0mm, 75.5mm, 45mm), pm.scaledToWidth(75.5mm));@
            See line 5 specially.
            I hope it's util for you.
            Regards

            www.ftatv.com.ar El foro argentino de la TV libre

            1 Reply Last reply
            0
            • V Offline
              V Offline
              Victor
              wrote on last edited by
              #6

              What is the value for 'w' and 'h' and what is the relationship to to
              the values in QRect.. 5, 75.5 and 45? Waht is the value of mm?

              My apologies for being obtuse, but it is my lack of understanding in general concerning the relationships that is my problem, I believe.

              To take your example and turn it into a compilable function that looks like this?
              @
              void printBarcode(QString barcodeValue,int widthMM,int heightMM) // where widthMM and heightMM is the true printed size in the barcode image
              {
              // calculate w and h
              const int w= // what is the math involving widthMM ?
              const int h = // what is the math involving heightMM?
              QPixmap pixmap(w,h);
              const int mm = // how to calculate this conversion factor? what is the value?
              const int a= // what is the math? how is '5' calculated?
              const int b= //
              const int c = //
              const int d = // what is the relationship to widthMM and heightMM?
              painter.drawPixmap(QRect(amm,bmm,cmm,dmm,pixmap.scaledToWidth(c*mm));
              // why are we not scaling to both heightMM and widthMM?
              }
              @

              1 Reply Last reply
              0
              • S Offline
                S Offline
                SergioDanielG
                wrote on last edited by
                #7

                w and y are values you wish as width and heigh of your images.
                mm represent pixels per milimeters.

                Here basically, create a pixmap image with "x" by "y" pixels.
                Then scale this pixmap to size wished.

                Regards.

                www.ftatv.com.ar El foro argentino de la TV libre

                1 Reply Last reply
                0
                • V Offline
                  V Offline
                  Victor
                  wrote on last edited by
                  #8

                  Sorry for not mentioning this earlier, but I thought my request was clear enough: I do not want to rescale because this causes quality issues with fonts, etc.

                  I know up front that I want the image to be a certain width and height in millimeters on the printed page.

                  1 Reply Last reply
                  0

                  • Login

                  • Login or register to search.
                  • First post
                    Last post
                  0
                  • Categories
                  • Recent
                  • Tags
                  • Popular
                  • Users
                  • Groups
                  • Search
                  • Get Qt Extensions
                  • Unsolved