Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Image.Canvas wird invers gedruckt... (https://www.delphipraxis.net/170507-image-canvas-wird-invers-gedruckt.html)

andydp 20. Sep 2012 14:56

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:
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;
Wenn ich "Temperaturdaten.Image1.Transparent" weg lasse,
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!

Bummi 20. Sep 2012 15:04

AW: Image.Canvas wird invers gedruckt...
 
hilft
Delphi-Quellcode:
Image1.Canvas.Brush.Style := bsClear;
vor der Textausgabe?

andydp 20. Sep 2012 15:06

AW: Image.Canvas wird invers gedruckt...
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hier übrigens noch ein Scan des Ausdrucks...

andydp 20. Sep 2012 15:18

AW: Image.Canvas wird invers gedruckt...
 
Hi Bummi

Leider kein Erfolg :(

Sonst noch jemand einen Tip?

Bummi 20. Sep 2012 15:29

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.

Namenloser 20. Sep 2012 15:30

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:
procedure Draw(Dest: TCanvas);
begin
  // ...
end;

// Für GUI:
Draw(Image1.Picture.Bitmap.Canvas);

// Zum Drucken:
Draw(Printer.Canvas);
(Dabei muss natürlich auf die Skalierung geachtet werden wegen der unterschiedlichen Auflösungen.)

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:
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;
Wäre aber nur eine Art Hotfix bzw. eine Notlösung...

p80286 20. Sep 2012 15:59

AW: Image.Canvas wird invers gedruckt...
 
Zitat:

Zitat von Bummi (Beitrag 1183758)
Ich glaube nicht dass da etwas invers dargestellt wird,

Jo, Invers würde anders aussehen. Irgendwie erinnert mich an einen wackeligen Stecker in der alten Parallschnittstelle, aber das kann ja eigentlich nicht sein.

Gruß
K-h

Bummi 20. Sep 2012 16:00

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;

shmia 20. Sep 2012 16:12

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?
http://www.swissdelphicenter.ch/de/showcode.php?id=744


Sorry für meinen "seltsamen" Schreibstil, aber ich finde meine Überlegungen sind so einfach, dass eigentlich jeder auf diesen Trichter kommen müsste.

andydp 20. Sep 2012 16:27

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 10:52 Uhr.
Seite 1 von 2  1 2      

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