TPicture => TBitmap und dann drucken = Problem



  • Hallo Hallo,

    ich habe ein Problem bei dem Druck eines TBitmaps.
    Ich habe ein TPicture das ich ganz leicht via Printer()->Canvas->Draw(...)
    ausdrucken kann. Kein Problem.

    Jetzt möchte ich aber das Bild vor dem Druck drehen oder spiegeln.
    Dazu erstelle ich mir dann ein TBitmap und kopiere das Picture->Bitmap da rein.
    (mit eingebauter drehung und spiegelung)
    Wenn ich das dann via Printer()->Canvas->Draw(...) ausgeben will wird aber
    nichts ausgegeben.
    Woran kann das liegen?
    Fehlt mir da irgendwie eine Einstellung?
    Ich habe das auch mit einem TPicture statt eines TBitmaps gemacht, aber leider gleiches Ergebnis.
    Wenn ich das eine TPicture dem anderen via Assign zuweise kann ich es aber drucken. Nur eben nicht gespiegelt oder gedreht....
    Ich probiere jetzt mal das Assignte TPicture zu drehen und das dann zu drucken...

    Aber ne Erklärung hätte ich doch gerne.

    jenz



  • Ich gehe mal davon aus das der Fehler in der drehen bzw spiegeln Routine liegt.
    Zeig doch mal code.
    🙄



  • okay okay,

    ich werde mal ein minimalbsp zusammenbasteln, aber ich glaube nicht,
    dass es an dem drehen bzw. spiegeln liegt.

    bis gleich,
    jenz



  • so, hier ein bischen code:

    if (pd->Execute()) {
        Printer()->BeginDoc();
        TPicture *pic(new TPicture);
        pic->Assign(Image1->Picture);
        Printer()->Canvas->Draw(10,10,pic->Graphic);
        Graphics::TBitmap *bmap(new Graphics::TBitmap);
        bmap->PixelFormat = pf32bit;
        bmap->Width = pic->Width;
        bmap->Height = pic->Height;
        bmap->Canvas->Draw(0,0,pic->Graphic);
        for (int y(0);y<bmap->Height/2;++y) {   // spiegeln an der horizontalen
          int *a((int*)bmap->ScanLine[y]);
          int *b((int*)bmap->ScanLine[bmap->Height-1-y]);
          for (int x(0);x<bmap->Width;++x) {
            int h(a[x]);
            a[x] = b[x];
            b[x] = h;
          }
        }
        Printer()->Canvas->Draw(10,500,bmap);
        delete bmap;
        delete pic;
        Printer()->EndDoc();
      }
    

    Das ist die Click routine irgendeines Buttons.
    Auf der Form befindet sich außerdem nur noch ein TImage (Image1) und
    ein PrinterDialog (pd).
    Das "pic" wird gedruckt. Das bmap leider nicht....

    jenz



  • Dein Code Funktioniert bei mir,

    Dein zweites Bild ist außerhalb des bedruckbaren Bereiches nehme ich an.

    Ich habe auch gleich zu Anfang folgendes vermisst.

    int dpiX = GetDeviceCaps(Prntr->Handle, LOGPIXELSX);
    int dpiY = GetDeviceCaps(Prntr->Handle, LOGPIXELSY);

    die x und Y Koordinaten beim Drucken mußt Du dann immer mit den aktuellen Drucker - Dpi werten muliplizieren.
    (d.H.: wenn du die werte für eien 600*600 DPI drucker hast mußt du den Wert durch 600 * die dpi nehmen.)

    Prntr->Draw(50.00 / 600.00 * dpiX ,60.00 / 600.00 * dpiY,bmap);

    P.S.
    um schnell ein Ergebnis zu haben stell dein Drucker mal auf 600 dpi um bevor du druckst.



  • Das ist ja merkwürdig, dass das bei dir funktioniert.
    Ich bin mir sicher, dass ich mich im Druckbereich des
    Druckers bewege.
    Naja ich werde noch ein wenig probieren.

    Danke und bis dann,
    jenz


Anmelden zum Antworten