Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Große Bitmaps drucken zerschiessen Spoolsystem (https://www.delphipraxis.net/78694-grosse-bitmaps-drucken-zerschiessen-spoolsystem.html)

Sven Janssen 9. Okt 2006 14:37


Große Bitmaps drucken zerschiessen Spoolsystem
 
Hallo,

ich muss Bitmaps mit einer Auflösung von ca. 3500x2400 bzw. 2400x3500 Pixel drucken.
Dabei habe ich das Problem, das mir regelmäßig das Drucksystem von Windows XP (wahrscheinlich auch andere Systeme ) den Bach runter geht. Das macht sich Bemerkbar, das beim erneuten Ausdruck eine leere Seite ausgedruckt wird.
Erst ein Neustart der Druckerwarteschlange unter Verwaltung->Dienste bringt das System wieder zum drucken.

Hier der relativ simple Quellcode:
Delphi-Quellcode:
   seitenHoehe:=printer.PageHeight;
   seitenBreite:=printer.PageWidth;

               
        Printer.BeginDoc;
        image:=TImage.create(nil);
   try
      image.Picture.LoadFromFile(bildpfad);
        except
      messagedlg('Konnte das Bild "'+bildpfad+'" nicht laden',mterror,[mbok],0);
                image.free;
              continue;
        end;
   bitmap:=TBitmap.Create;

   GRect.Left:=0;
   GRect.Top :=0;
   bitmap.assign(image.Picture.graphic);

   w:=Image.Picture.width;
        h:=Image.Picture.height;
        if w > h then begin
      rotateBitmap(bitmap,90);
      hlp:=w;
      w:=h;
      h:=hlp;
   end;

   if h/w < seitenHoehe / seitenBreite then begin
      GRect.Bottom := Trunc(((h / f) / (w/f)) * seitenBreite);
      GRect.Right := trunc(seitenBreite);
   end else begin
      GRect.Bottom := trunc(seitenHoehe);
      GRect.Right := Trunc( (w/f) / (h/f) * seitenHoehe);
   end;

        Printer.Canvas.StretchDraw(Grect,bitmap);

   bitmap.Free;
   image.free;
   Printer.enddoc;
Freue mich über anregungen wie man das Problem in den Griff bekommen kann.

Mir ist auch aufgefallen, das einige Drucker(treiber) direkt eine weiße Seite ausdrucken, andere wenigstens das Bild einmal ausdrucken bevor das Spoolsystem den Geist aufgibt.

Sven
PS:Benutze Delphi6

Union 9. Okt 2006 15:50

Re: Große Bitmaps drucken zerschiessen Spoolsystem
 
Hi,

ich hatte bisher mit folgender Funktion Erfolg:
Delphi-Quellcode:
  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;
Damit habe ich jedenfalls problemlos Bitmaps von 3200x530 gedruckt, vielleicht funktioniert es ja. Die Funktion musste ich auch damals verwenden, weil es mit den normalen in Delphi integrierten Rasteroperationen nicht funktionierte.

Sven Janssen 9. Okt 2006 16:04

Re: Große Bitmaps drucken zerschiessen Spoolsystem
 
Hi,

danke für den Code, den habe ich allerdings eben auch schon beim suchen im Forum gefunden.
Damit funktioniert es zwar, aber wenn ich diesen Code direkt nach dem laden des Bildes setze erhalte ich immer die meldung "Bitmap ungültig". Das liegt daran, das ich mit pngimage arbeite und PNG Dateien lade.

Was gemacht die Zuweisung
Delphi-Quellcode:
Bitmap.assign(TBitmap(pngImage.Picture.graphic));
eigentlich genau. Scheinbar ist es nach der Zuweisung kein korrektes Bitmap.
Sonst würde danach nicht die Fehlermeldung kommen oder?

Lustigerweise funktioniert das ganze, wenn ich am Anfang vom Programm das Bild in ein TImage lade, über mein Menü auf Drucken gehe , Drucker auswähle usw.
Ursprünglich wurde das Bild genau so geladen. Weise ich nun wieder kurz vor dem Drucken per
Delphi-Quellcode:
image.picture.bitmap.assign(TBitmap(pngImage.Picture.graphic));
das Bild zu, erhalte ich eine Fehlermeldung.
D.h durch die Interaktion mit der GUI muss irgendetwas passieren.

Stehe gerade mit beiden Füssen auf dem Schlauch :-(

PS : GetDIBSizes bringt den Fehler "Bitmap ist ungültig"

generic 9. Okt 2006 16:16

Re: Große Bitmaps drucken zerschiessen Spoolsystem
 
StretchDraw basiert auf der gdi funktion.
diese hat gewisse einschränkungen in bildgrösse farbtiefe usw.

in der kb von ms steht etwas dadrüber.
hatte das problem auch vor einiger zeit.
ich habe meine software auf gdi+ umgestellt.
danach hatte ich keine probleme mehr.

Sven Janssen 9. Okt 2006 16:30

Re: Große Bitmaps drucken zerschiessen Spoolsystem
 
Nun habe ich mir die gr32 und die Datei gr32_png heruntergeladen und das Bild mit LoadPNGintoBitmap32 geladen.
Das Problem bleibt das gleiche.

Also Druckproblem gelöst, wie wandel ich nun aber korrekt ein PNG in ein Bitmap, damit GetDIBSizes dies lesen kann.

shmia 9. Okt 2006 16:33

Re: Große Bitmaps drucken zerschiessen Spoolsystem
 
Zitat:

Zitat von Sven Janssen
Was gemacht die Zuweisung
Delphi-Quellcode:
Bitmap.assign(TBitmap(pngImage.Picture.graphic));
eigentlich genau. Scheinbar ist es nach der Zuweisung kein korrektes Bitmap.

Man darf nicht den Cast-Operator nicht bei einem Assign-Aufruf verwenden !!
Also so:
Delphi-Quellcode:
Bitmap.assign(pngImage.Picture.Bitmap);

Union 9. Okt 2006 16:41

Re: Große Bitmaps drucken zerschiessen Spoolsystem
 
Richtig, es wird nämlich in der Assign-Methode von TBitmap abgefragt ob es sich bei der Quelle um ein Bitmap handelt und dann wird der Inhalt einfach von dort kopiert - denn durch Dein Typecast meint das Ziel-Bitmap die Quelle sei bereits eines. Läßt Du das Typecast weg, sollte richtigerweise die Methode AssignTo der PNG-Klasse aufgerufen werden. Diese hat dann hoffentlich eine Abfrage auf den Zieltyp und nimmt die erforderliche Konvertierung vor.

Sven Janssen 9. Okt 2006 17:01

Re: Große Bitmaps drucken zerschiessen Spoolsystem
 
Ja sorry,
war vorher auch ohne das Cast. Geht auch ohne nicht.

shmia 9. Okt 2006 17:07

Re: Große Bitmaps drucken zerschiessen Spoolsystem
 
Zitat:

Zitat von Sven Janssen
Geht auch ohne nicht.

Dir ist aber aufgefallen, dass ich
Delphi-Quellcode:
Bitmap.assign(pngImage.Picture.Bitmap) // .Bitmap nicht .Picture
geschrieben habe?!
Wenn du ein Problem mit PNG-Images hast, dann wandle die Bilder vorher mit einem externen Tool
einfach mal in Bitmaps um.
Dann weisst du, ob das Drucken prinzipiell funktioniert.
Danach kümmerst du dich darum, wie man PNG in ein gültige Bitmap verwandelt.

Sven Janssen 9. Okt 2006 17:10

Re: Große Bitmaps drucken zerschiessen Spoolsystem
 
Nein das ist mir nicht aufgefallen ;) *sorry*
Werde das morgen früh ausprobieren.
Und das der Druck funktioniert hatte ich weiter oben geschrieben. Es liegt nur noch an dem umwandeln.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:43 Uhr.
Seite 1 von 2  1 2      

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