Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Probleme beim Drucken von Bildern (https://www.delphipraxis.net/148466-probleme-beim-drucken-von-bildern.html)

easywk 2. Mär 2010 14:55


Probleme beim Drucken von Bildern
 
Moin, moin,

in meinen Programmen haben die Anwender die Möglichkeit, Bilder in die Druckausgabe einzubinden. Meistens wird das in den Fusszeilen der Seiten verwendet. Dabei benutze ich die folgenden Funktionen, wobei PrintIt() die Funktion ist, die ich aufrufe:

Delphi-Quellcode:
procedure PrintBild(DestRect:TRect; Image:TImage);
var BitmapHeader:pBitmapInfo; BitmapImage:POINTER; Bitmap:TBitmap;
    HeaderSize,ImageSize:DWORD;
begin
  Bitmap := TBitmap.Create;
  try
    Bitmap.Width:=Image.Picture.Width;
    Bitmap.Height:=Image.Picture.Height;
    Bitmap.PixelFormat:=pf24bit;
    // Convert GIF (JPEG, or whatever) to BMP
    Bitmap.Canvas.Draw(0,0, Image.Picture.Graphic);
    GetDIBSizes(Bitmap.Handle, HeaderSize, ImageSize);
    GetMem(BitmapHeader, HeaderSize);
    GetMem(BitmapImage, ImageSize);
    try
      GetDIB(Bitmap.Handle, Bitmap.Palette, BitmapHeader^, BitmapImage^);
      StretchDIBits(Printer.Canvas.Handle,
                    DestRect.Left, DestRect.Top,    // Destination Origin
                    DestRect.Right - DestRect.Left, // Destination Width
                    DestRect.Bottom - DestRect.Top, // Destination Height
                    0, 0,                           // Source Origin
                    Bitmap.Width, Bitmap.Height,    // Source Width & Height
                    BitmapImage,
                    TBitmapInfo(BitmapHeader^),
                    DIB_RGB_COLORS,
                    SRCCOPY)
    finally
      FreeMem(BitmapHeader);
      FreeMem(BitmapImage)
    end
  finally;
    Bitmap.Free;
  end;
end;

procedure PrintIt(Filename:String; BildHoeheMillimeter,BildBreiteMillimeter:Integer);
var Img:TImage; Rect:TRect; cnt,bb,bh:INTEGER;
begin
  Img:=TImage.Create(NIL);
  Img.Picture.LoadFromFile(Inhalt.Inhalt);
  bh:=Trunc(BildHoeheMillimeter*PixelsPerInch.X/25.4);
  bb:=Trunc(BildBreiteMillimeter*PixelsPerInch.X/25.4);
  if bb=0 then // ggfs. Seitenverhältnisse beibehalten
    bb:=Round(bh*(Img.Picture.Width/Img.Picture.Height));
  if bh=0 then // ggfs. Seitenverhältnisse beibehalten
    bh:=Round(bb*(Img.Picture.Height/Img.Picture.Width));
  // x,y = aktuelle Position auf dem Papier
  Rect.Top:=y;
  Rect.Bottom:=y+bh;
  Rect.Left:=x;
  Rect.Right:=x+bb;
  PrintBild(Rect,Img);
  Img.Free;
end;
Nun zu meinem Problem:

die Anwender berichten mir, dass es immer wieder vorkommt, dass das Bild nicht gedruckt wird. Anstelle des Bildes wird ein schwarzer Kasten gedruckt, der genau der Bildgröße entspricht. Das Ganze ist nicht reproduzierbar. Sehr oft tritt es gar nicht auf, manchmal ab Seite 10, manchmal auch erst ab Seite 100. Wenn es auftritt, kann es nur "repariert" werden, in dem das Programm beendet wird. Ich selber habe das Problem noch nie gehabt, kann es also auch nicht debuggen. Der Fall wurde auch bei unterschiedlichen Druckern und sogar bei PDF-Erzeugern berichtet.

Kann jemand anhand des Codes was "böses" sehen oder hat eine Idee, wo das Verhaltern herkommt? Bin für jede Idee dankbar

cu
easy

shmia 2. Mär 2010 17:06

Re: Probleme beim Drucken von Bildern
 
Mir fällt auf, dass du TImage verwendest obwohl hier eigentlich TPicture verwendet werden sollte:
Delphi-Quellcode:
procedure PrintBild(DestRect:TRect; {Image:TImage}Picture:TPicture);
Und später:
Delphi-Quellcode:
procedure PrintIt(Filename:String; BildHoeheMillimeter,BildBreiteMillimeter:Integer);
var Pict:TPicture;
  Rect:TRect; cnt,bb,bh:INTEGER;
begin
  Pict:=TPicture.Create;
  try
    Pict.LoadFromFile(Inhalt.Inhalt);
    ...
    PrintBild(Rect,Pict);
  finally
    Pict.Free;
  end;
end;
Das ist jetzt noch nicht die Lösung deines Problems, aber der Code ist so zumindest sauberer.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:37 Uhr.

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