AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Große Bitmaps drucken zerschiessen Spoolsystem
Thema durchsuchen
Ansicht
Themen-Optionen

Große Bitmaps drucken zerschiessen Spoolsystem

Ein Thema von Sven Janssen · begonnen am 9. Okt 2006 · letzter Beitrag vom 10. Okt 2006
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Sven Janssen
Sven Janssen

Registriert seit: 22. Jun 2004
Ort: Mayen
187 Beiträge
 
Delphi 4 Professional
 
#1

Große Bitmaps drucken zerschiessen Spoolsystem

  Alt 9. Okt 2006, 14:37
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
:wq /dev/null
He who fights with monsters might take care lest he thereby become a monster - Nietzsche
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.487 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Große Bitmaps drucken zerschiessen Spoolsystem

  Alt 9. Okt 2006, 15:50
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.
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Benutzerbild von Sven Janssen
Sven Janssen

Registriert seit: 22. Jun 2004
Ort: Mayen
187 Beiträge
 
Delphi 4 Professional
 
#3

Re: Große Bitmaps drucken zerschiessen Spoolsystem

  Alt 9. Okt 2006, 16:04
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
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 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"
:wq /dev/null
He who fights with monsters might take care lest he thereby become a monster - Nietzsche
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.415 Beiträge
 
Delphi XE5 Professional
 
#4

Re: Große Bitmaps drucken zerschiessen Spoolsystem

  Alt 9. Okt 2006, 16:16
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.
Coding BOTT - Video Tutorials rund um das Programmieren - https://www.youtube.com/@codingbott
  Mit Zitat antworten Zitat
Benutzerbild von Sven Janssen
Sven Janssen

Registriert seit: 22. Jun 2004
Ort: Mayen
187 Beiträge
 
Delphi 4 Professional
 
#5

Re: Große Bitmaps drucken zerschiessen Spoolsystem

  Alt 9. Okt 2006, 16:30
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.
:wq /dev/null
He who fights with monsters might take care lest he thereby become a monster - Nietzsche
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#6

Re: Große Bitmaps drucken zerschiessen Spoolsystem

  Alt 9. Okt 2006, 16:33
Zitat von Sven Janssen:
Was gemacht die Zuweisung
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:
Bitmap.assign(pngImage.Picture.Bitmap);
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.487 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: Große Bitmaps drucken zerschiessen Spoolsystem

  Alt 9. Okt 2006, 16:41
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.
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Benutzerbild von Sven Janssen
Sven Janssen

Registriert seit: 22. Jun 2004
Ort: Mayen
187 Beiträge
 
Delphi 4 Professional
 
#8

Re: Große Bitmaps drucken zerschiessen Spoolsystem

  Alt 9. Okt 2006, 17:01
Ja sorry,
war vorher auch ohne das Cast. Geht auch ohne nicht.
:wq /dev/null
He who fights with monsters might take care lest he thereby become a monster - Nietzsche
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#9

Re: Große Bitmaps drucken zerschiessen Spoolsystem

  Alt 9. Okt 2006, 17:07
Zitat von Sven Janssen:
Geht auch ohne nicht.
Dir ist aber aufgefallen, dass ich
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.
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von Sven Janssen
Sven Janssen

Registriert seit: 22. Jun 2004
Ort: Mayen
187 Beiträge
 
Delphi 4 Professional
 
#10

Re: Große Bitmaps drucken zerschiessen Spoolsystem

  Alt 9. Okt 2006, 17:10
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.
:wq /dev/null
He who fights with monsters might take care lest he thereby become a monster - Nietzsche
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:47 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