Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Canvas ausdrucken (https://www.delphipraxis.net/27559-canvas-ausdrucken.html)

A_Hingerl 12. Aug 2004 07:41


Canvas ausdrucken
 
Hallo

Habe ein kleines Problem. Ich möchte von einem TImage den Canvas oder das Picture.Bitmap auf
einen Drucker ausdrucken. Eigentlich ganz einfach mit


Delphi-Quellcode:
 printer.draw(1,1,image1.picture.bitmap);
Wenn mein picture.canvas nur 500 height und 500 width hat.
Wenn ich aber 2000 height und 2000 width habe, kommt beim drucker nichts mehr an.

Kann mir bitte jemand helfen.

Danke

A_hingerl

Union 12. Aug 2004 10:31

Re: Canvas ausdrucken
 
Verwende Stretchdraw.

easywk 12. Aug 2004 11:24

Re: Canvas ausdrucken
 
Ja, StretchDraw hilft dir da weiter. Und wenn du das ganze Papier ausnutzen möchtest und dabei aber das Breiten-Höhen-Verhältnis beibehalten werden soll, dann errechne das für StretchDraw benötigte Rechteck mit der nachfolgenden Routine :-D

Delphi-Quellcode:
(* ***********************************************************
      Ein Rechteck fuer "StretchDraw" auf dem Drucker erzeugen
   *********************************************************** *)
function ScaleToPrint (Img:TImage;Prn:TPrinter;Center:Boolean):TRect;
var h,w,r:Single; Rect:TRect;
begin
  with Prn do
    with Img.Picture.Graphic do
      begin
        { Verhaeltniss errechnen }
        w := PageWidth/Width;
        h := PageHeight/Height;
        { begrenzendes Verhaeltniss }
        if w<h then r:=w else r:=h;
        { in linke obere Ecke legen }
        Rect.Left  := 0;
        Rect.Top   := 0;
        Rect.Right := Trunc(r*Width);
        Rect.Bottom := Trunc(r*Height);
        { Center ? }
        if Center then
          begin
            Rect.Left  := (PageWidth-Rect.Right) div 2;
            Rect.Right := Rect.Right+Rect.Left;
            Rect.Top   := (PageHeight-Rect.Bottom) div 2;
            Rect.Bottom := Rect.Bottom+Rect.Top;
          end;
     end;
  { zuweisen }
  Result:=Rect;
end;

A_Hingerl 12. Aug 2004 15:08

Re: Canvas ausdrucken
 
Danke für die prompte Antwort.

Aber mit Strechdraw und Copyrect und sonstigen Möglichkeiten hab ichs bereits probiert. Es geht ja auch. Nur wenn das Timage eine gewisse Größe erreicht (2000x2000) gehts plötzlich nicht mehr. Weiß jemand woran das liegen kann?

A.Hingerl

mytar 12. Aug 2004 15:10

Re: Canvas ausdrucken
 
Ich hab schon mit mehren Methoden probiert, es funktioniert ja auch.

Aber beim Ausdrucken mit AdobePDF kommt immer nur ein weißes Blatt.

mytar :-D

Union 12. Aug 2004 15:17

Re: Canvas ausdrucken
 
Zitat:

Zitat von mytar
Ich hab schon mit mehren Methoden probiert, es funktioniert ja auch.

Aber beim Ausdrucken mit AdobePDF kommt immer nur ein weißes Blatt.

mytar :-D

Tja, Delphi druckt eben Bitmaps nicht standardgemäß. Entwerder Du verwendest keine Bitmaps (kein Witz) oder Du nimmst diese Funktion:
Code:
procedure PrintBitmap(aCanvas : TCanvas; Dest : TRect; Bitmap : TBitmap);
  var
    Info : PBitmapInfo;
    InfoSize : DWord;
    Image : Pointer;
    ImageSize : DWord;
  begin
    with Bitmap do
    begin
      GetDIBSizes(Handle, InfoSize, ImageSize);
      Info := AllocMem(InfoSize);
      try
        Image := AllocMem(ImageSize);
        try
          GetDIB(Handle, Palette, Info^, Image^);
          if not Monochrome then
            SetStretchBltMode(ACanvas.Handle, STRETCH_DELETESCANS);
          with Info^.bmiHeader do
            StretchDIBits(aCanvas.Handle, Dest.Left, Dest.Top,
              Dest.RIght - Dest.Left, Dest.Bottom - Dest.Top,
              0, 0, biWidth, biHeight, Image, Info^, DIB_RGB_COLORS, SRCCOPY);
        finally
          FreeMem(Image, ImageSize);
        end;
      finally
        FreeMem(Info, InfoSize);
      end;
    end;
  end;

A_Hingerl 12. Aug 2004 16:02

Re: Canvas ausdrucken
 
Danke. es funktioniert perfekt.

Habe aber noch ein kleines Problem. Die Grafik (Timage) ist 2000 x 1000 und auf dem Bildschirm eine riiiiesen Grafik. Wenn ich es mit PrintBitmap ausdrucke und entsprechend vergrößere, ist es auf einem Laserdrucker etwas unscharf?? Es ist Barcode mit dabei und sollte eigentlich doch scharf sein, da sonst die Barcode-scanner ein problem bekommen werden. Gibts da auch noch ne elegante lösung??

Danke

A.Hingerl

Union 12. Aug 2004 16:07

Re: Canvas ausdrucken
 
Zitat:

Zitat von A_Hingerl
Danke. es funktioniert perfekt.
Habe aber noch ein kleines Problem. Die Grafik (Timage) ist 2000 x 1000 und auf dem Bildschirm eine riiiiesen Grafik. Wenn ich es mit PrintBitmap ausdrucke und entsprechend vergrößere, ist es auf einem Laserdrucker etwas unscharf?? Es ist Barcode mit dabei und sollte eigentlich doch scharf sein, da sonst die Barcode-scanner ein problem bekommen werden. Gibts da auch noch ne elegante lösung??
A.Hingerl

Wenn Du nur Barcodes drucken möchtest, solltest Du vielleicht lieber einen Reportgenerator verwenden, der Barcode unterstützt (Rave, Fastreport) oder Du besorgst Dir einen Barcodefont und gibst den Barcodeinhalt als Text mit der entsprechenden Schriftart aus.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:17 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