![]() |
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:
Freue mich über anregungen wie man das Problem in den Griff bekommen kann.
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; 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 |
Re: Große Bitmaps drucken zerschiessen Spoolsystem
Hi,
ich hatte bisher mit folgender Funktion Erfolg:
Delphi-Quellcode:
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.
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; |
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:
eigentlich genau. Scheinbar ist es nach der Zuweisung kein korrektes Bitmap.
Bitmap.assign(TBitmap(pngImage.Picture.graphic));
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:
das Bild zu, erhalte ich eine Fehlermeldung.
image.picture.bitmap.assign(TBitmap(pngImage.Picture.graphic));
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" |
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. |
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. |
Re: Große Bitmaps drucken zerschiessen Spoolsystem
Zitat:
Also so:
Delphi-Quellcode:
Bitmap.assign(pngImage.Picture.Bitmap);
|
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.
|
Re: Große Bitmaps drucken zerschiessen Spoolsystem
Ja sorry,
war vorher auch ohne das Cast. Geht auch ohne nicht. |
Re: Große Bitmaps drucken zerschiessen Spoolsystem
Zitat:
Delphi-Quellcode:
geschrieben habe?!
Bitmap.assign(pngImage.Picture.Bitmap) // .Bitmap nicht .Picture
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. |
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. |
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