![]() |
Image.Canvas wird invers gedruckt...
Hallo Leute
Hab das Problem, dass auf einem Recher (Windows 7) der Ausdruck meiner Grafik invers dargestellt wird. D.h. der Hintergrund ist schwarz anstelle weiss. Hier mein Code zum Ausdrucken der Grafik:
Code:
Wenn ich "Temperaturdaten.Image1.Transparent" weg lasse,
procedure TTemperaturdaten.SpeedButton10Click(Sender: TObject);
Var rect:TRect; Tmp_String:String; Begin if ((Daten_ok) AND (Abbruch=False)) then begin if(Mode=MD_TEMP_DATEN) then begin Tmp_String:=Edit3.Text; Image1.Canvas.TextOut(50,330,Tmp_String); try screen.cursor:=crHourglass; Printer.Orientation := poLandscape; printer.BeginDoc; with printer.canvas do begin Temperaturdaten.Image1.Visible:=False; //Temperaturdaten.Image1.Transparent:=True; rect:=Bounds(10,10,printer.pagewidth,printer.pageheight); StretchDraw(Rect,Temperaturdaten.Image1.picture.bitmap); //Temperaturdaten.Image1.Transparent:=False; Temperaturdaten.Image1.Visible:=True; end finally printer.enddoc; screen.cursor:=crDefault; Temperaturdaten.Show; end; end; end; end; funktioniert alles bestens, aber auf den anderen Rechnern wird jetzt nur noch ein weisses Blatt ausgegeben. Kennt jemand das Problem? Bin für Eure Hilfe sehr dankbar! |
AW: Image.Canvas wird invers gedruckt...
hilft
Delphi-Quellcode:
vor der Textausgabe?
Image1.Canvas.Brush.Style := bsClear;
|
AW: Image.Canvas wird invers gedruckt...
Liste der Anhänge anzeigen (Anzahl: 1)
Hier übrigens noch ein Scan des Ausdrucks...
|
AW: Image.Canvas wird invers gedruckt...
Hi Bummi
Leider kein Erfolg :( Sonst noch jemand einen Tip? |
AW: Image.Canvas wird invers gedruckt...
Ich glaube nicht dass da etwas invers dargestellt wird, kannst Du mal das Bitmap vor dem Drucken speichern und hochlegen?
(Eher wird Transparent falsch behandelt und ein weißes Blatt bei nicht transparent kann ich mir nicht erklären) Du könntest versuchsweise noch da Image1.Picture.Bitmap.PixelFormat:=pf24bit; versuchen. |
AW: Image.Canvas wird invers gedruckt...
Am besten wäre es, die Zeichenroutine so zu gestalten, dass sie auf ein beliebiges Canvas zeichnen kann, und dann das Drucker-Canvas zu übergeben. Das sollte ziemlich sicher auf jedem Drucker funktionieren und hat den Vorteil, dass es effizienter ist, weil nur die Zeichenbefehle an den Drucker übertragen werden und nicht ein Bitmap Pixel für Pixel (langsam). Außerdem wird die Bitmap-Lösung immer recht pixelig aussehen, da der Monitor eine deutlich geringere Auflösung hat als der Drucker.
Delphi-Quellcode:
(Dabei muss natürlich auf die Skalierung geachtet werden wegen der unterschiedlichen Auflösungen.)
procedure Draw(Dest: TCanvas);
begin // ... end; // Für GUI: Draw(Image1.Picture.Bitmap.Canvas); // Zum Drucken: Draw(Printer.Canvas); Damit wäre auch die Logik von der Darstellung getrennt. Direkt Daten aus GUI-Controls zu verwenden ist immer Gefrickel, das aus gutem Grund vermieden werden sollte. Wenn das aus irgendeinem Grund nicht geht, würde ich es so versuchen:
Delphi-Quellcode:
Wäre aber nur eine Art Hotfix bzw. eine Notlösung...
var
Tmp: TBitmap; begin Tmp := TBitmap.Create; try // Wir zeichnen das Bild erst auf einen weißen Hintergrund, und das Ergebnis dann auf // das Drucker-Canvas Tmp.SetSize(Image1.Picture.Bitmap.Width, Image1.Picture.Bitmap.Height); Tmp.Canvas.Brush.Color := clWhite; Tmp.Canvas.FillRect(Rect(0, 0, Tmp.Width, Tmp.Height); // Image1.Transparent := True; ? Tmp.Canvas.Draw(0, 0, Image1.Picture.Bitmap); // Canvas.Draw beachtet Transparenz von Bitmaps Printer.BeginDoc; Printer.Canvas.StretchDraw(Bounds(10,10,printer.pagewidth,printer.pageheight), Tmp); Printer.EndDoc; finally Tmp.Free; end; end; |
AW: Image.Canvas wird invers gedruckt...
Zitat:
Gruß K-h |
AW: Image.Canvas wird invers gedruckt...
Liste der Anhänge anzeigen (Anzahl: 1)
Noch eine recht dankbare Methode, wenn man keine eigenen Komponenten hat denen man das Canvas vor dem Zeichnen/Drucken austauscht sind Metafiles.
Als Vektorgrafiken können sie verlustfrei skaliert werden. Zeichnen im Metafile, darstellen in einem TImage ..
Delphi-Quellcode:
public
{ Public-Deklarationen } FMF:TMetafile; end; var Form1: TForm1; implementation Const C_WishedWidth=2900; C_WishedHeight=2100; {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var i:Integer; Mfc: TMetaFileCanvas; x,y:Integer; begin Mfc := TMetaFileCanvas.Create(FMF, 0); for I := 0 to 100 do begin Mfc.Font.Color := RGB(random(255),Random(255),Random(255)); Mfc.Pen.Color := RGB(random(255),Random(255),Random(255)); Mfc.Brush.Style := bsClear; Mfc.Textout(random(2800),Random(2000),Format('Test %d',[i])); Mfc.Brush.Style := bsSolid; Mfc.Brush.Color := RGB(random(255),Random(255),Random(255)); x := Random(2800); y := Random(2000); Mfc.Ellipse( x,y, x+ Random(200), y+Random(200) ); end; Mfc.Free; image1.Picture.Assign(FMF); if Checkbox1.Checked then begin Printer.Orientation := poLandScape; Printer.Begindoc; Printer.Canvas.StretchDraw(Rect(0,0,Printer.PageWidth,printer.PageHeight),FMF); Printer.EndDoc; end; end; procedure TForm1.FormCreate(Sender: TObject); begin FMF:=TMetafile.Create; FMF.Width := C_WishedWidth; FMF.Height := C_WishedHeight; end; procedure TForm1.FormDestroy(Sender: TObject); begin FMF.Free; end; |
AW: Image.Canvas wird invers gedruckt...
Was braucht man um ein Bitmap zu drucken??
* Ein Bitmap * ein Rechteck in das das Bitmap gedruckt werden soll * ein Printer-Handle oder ein Printer-Objekt Und jetzt MUSS jedem der Geistesblitz kommen: Man bräuchte eine Prozedur mit genau diesen Parametern. :bouncing4: Wenn man eine unabhängige Prozedur hätte, dann könnte man sogar den Code in eine andere Anwendung kopieren. Und vielleicht könnte man dann sogar auf verschiedenen Rechnern und mit verschiedenen Druckern testen bis man den Code entwickelt hat, der immer korrekt druckt. Hmmmm, vielleicht gibt es das schon im Internet? ![]() Sorry für meinen "seltsamen" Schreibstil, aber ich finde meine Überlegungen sind so einfach, dass eigentlich jeder auf diesen Trichter kommen müsste. |
AW: Image.Canvas wird invers gedruckt...
@Bummi: Image1.Picture.Bitmap.PixelFormat:=pf24bit; hat leider auch nichts gebracht.
Danke für die Infos Leute! Möchte den Code nicht unbedingt umschreiben. Es muss doch eine Erklärung geben, weshalb die Eigenschaft "Transparent" auf einem einzigen Rechner ein solcher Ausdruck produziert. Wie gesagt, wenn ich Transparent vor dem Ausdruck nicht auf True stelle, habe ich auf dem Problemrechner einen korrekten Ausdruck. Dafür erscheint die Grafik auf den andern Testrechnern als weisses Blatt :-( |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:19 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