Einzelnen Beitrag anzeigen

easywk

Registriert seit: 9. Jul 2003
Ort: Schwanewede
117 Beiträge
 
Delphi 7 Enterprise
 
#1

Probleme beim Drucken von Bildern

  Alt 2. Mär 2010, 14:55
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
Björn
if all else fails - read the instructions
  Mit Zitat antworten Zitat