Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Bild drucken (https://www.delphipraxis.net/68116-bild-drucken.html)

MCXSC 24. Apr 2006 21:12


Bild drucken
 
Hallo!

Folgendes:

In einer TImage-Komponente habe ich eine Bilddatei mit dem JP(E)G-Forat geladen.

Nun will ich dieses Bild in FESTEN Maßen drucken lassen. Also die Druckgröße muss nicht der Größe des TImages entsprechen, sondern soll aus Integer-Konstanten gelesen werden.

Ich habe zwar einiges im Forum gefunden, allerdings funktionirt es nicht so, wie ich es will: meist wird der Ausdruck zu klein, aber nie so, wie ich die Größe angebe...

MCXSC

Mackhack 24. Apr 2006 22:03

Re: Bild drucken
 
Hi,

du koenntest es %ual ausdrucken!

MCXSC 24. Apr 2006 22:11

Re: Bild drucken
 
:wiejetzt: :wiejetzt: :wiejetzt: :wiejetzt: :wiejetzt: :wiejetzt: :wiejetzt:

Ich hab jetzt irgendwie nichts verstanden :drunken: :drunken: :drunken:

SirThornberry 24. Apr 2006 22:19

Re: Bild drucken
 
wie hast du es denn bisher probiert. Du müsstest in etwa so vorgehen:
- Maßheinheit für Druckercanvas umstellen (auf 10tel Millimeter etc.)
- Dein JPEG auf ein Bitmap bringen (zumindest brauchst du eine Canvas wo das Bild drauf ist)
- Das Bild/Canvas per StretchBlt auf die Canvas des Druckers übertragen.

Mavarik 26. Apr 2006 08:04

Re: Bild drucken
 
Zitat:

Zitat von MCXSC
:wiejetzt: :wiejetzt: :wiejetzt: :wiejetzt: :wiejetzt: :wiejetzt: :wiejetzt:

Ich hab jetzt irgendwie nichts verstanden :drunken: :drunken: :drunken:

Versuchs mal mit:

Delphi-Quellcode:
function TPrintForm.Screen2PrinterX(X:integer):integer;
 begin
   result := (X * LogX) div 96; // 96 ist bei mir das Bezugssystem
 end;

function TPrintForm.Screen2PrinterY(Y:Integer):integer;
 begin
   result := (Y * LogY) div 96; // 96 ist bei mir das Bezugssystem
 end;

Procedure TPrintForm.DoImage(ChildControl:TControl;Top,Left:integer);
var
  Info           : PBitmapInfo;
  InfoSize       : DWORD;
  Image          : Pointer;
  ImageSize      : DWORD;
  Bits           : HBITMAP;
  DIBWidth,
  DIBHeight      : Longint;


  begin

    LogX          := GetDeviceCaps(Printer.Handle, LOGPIXELSX);
    LogY          := GetDeviceCaps(Printer.Handle, LOGPIXELSY);


{$IFDEF JPEG} 
    if (ChildControl as TImage).Picture.Graphic is TJPEGImage
    then begin // Der einfache Weg. Um bessere Qualität zu erhalten, erst in BMP umwandeln und dann die andere Routine
           Printer.Canvas.StretchDraw(Rect(Screen2PrinterX(ChildControl.Left+Left)-Rand_Links,
                                           Screen2Printery(Top)-Rand_Oben,
                                           Screen2PrinterX(ChildControl.Left+Left)-Rand_Links+Screen2PrinterX(ChildControl.width),
                                           Screen2Printery(Top)-Rand_Oben+Screen2PrinterY(ChildControl.height)),
                                    (ChildControl as TImage).Picture.Graphic);
         end
    else begin {$ENDIF }
            Bits := (ChildControl as TImage).Picture.Bitmap.Handle;
            GetDIBSizes(Bits, InfoSize, ImageSize);
            Info := AllocMem(InfoSize);
            try
              Image := AllocMem(ImageSize);
              try
                GetDIB(Bits, 0, Info^, Image^);        
                with Info^.bmiHeader do
                  begin
                    DIBWidth := biWidth;
                    DIBHeight := biHeight;
                  end;
                  StretchDIBits(Printer.Canvas.Handle,
                                Screen2PrinterX(ChildControl.Left+Left)-Rand_Links,
                                Screen2Printery(Top)-Rand_Oben,
                                Screen2PrinterX(ChildControl.width),
                                Screen2PrinterY(ChildControl.height),
                                0, 0, DIBWidth, DIBHeight, Image, Info^, DIB_RGB_COLORS, SRCCOPY);
              finally
                FreeMem(Image, ImageSize);
              end;
            finally
              FreeMem(Info, InfoSize);
            end;
{$IFDEF JPEG}
          end;
{$ENDIF}         
  end;
Die Procedure Druckt Imagekomponenten von einem Form welches in 96 DPI definiert ist.
die Koordinaten musst Du sicherlich auf Deine Wünsche anpassen...

mfg Frank :coder:

Luckie 26. Apr 2006 08:40

Re: Bild drucken
 
Setz den MapMopde auf MM_LOMETRIC, dann kannst du alle angaben in Millimetern machen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:43 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz