Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - image wird nich gedruckt


Ironwulf - Di 03.10.06 00:20
Titel: image wird nich gedruckt
ich hab mir folgendes im forum zusammengesucht:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Printer.Title:='bla';
  Printer.BeginDoc;
  Printer.Canvas.Draw(0,0,Image1.Picture.Graphic);
  Printer.EndDoc;
end;

procedure TForm1.Button2Click(Sender: TObject); // "bemalt" das image
var i: Byte;
begin
  Image1.Height:= 600;
  for i:= 0 to 120 Do
  Image1.Canvas.Textout(1,i*50,IntToStr(i*50));
end;


der drucker zieht das blatt und macht dann nichts damit, kann mir jemand sagen was ich falsch mache?


Narses - Di 03.10.06 00:25

Moin!

Müßte das nicht so gehen, wenn du mit .Canvas gemalt hast: :gruebel:

Delphi-Quelltext
1:
Printer.Canvas.Draw(0,0,Image1.Picture.Bitmap);                    

cu
Narses


Ironwulf - Di 03.10.06 00:30

nein da passiert dasselbe... :(


Ironwulf - Do 05.10.06 17:51

*hochschieb*


Ironwulf - Fr 09.02.07 05:13

*mal wieder hochschieb nach 4 monaten ;D*

irgendwer wird doch schonmal en bild gedruckt haben?


Raffo - Fr 09.02.07 06:56

Und? Hast Du nach 4 Monaten nicht nochmal neu gesucht? Das Zauberwort ist SetStretchBltMode und StretchBlt weil Bildschirm (96dpi) und Druckerauflösung(~300dpi) immer unterschiedlich sind.

Thread http://www.delphi-forum.de/viewtopic.php?t=66989&highlight=bild+drucken

Es gibt aber noch eine andere Möglichkeit die ich für mein Projekt schon lange verwende über eine TRichEditEx Komponente (Shareware von Jean LACOSTE), vielleicht gibts noch ähnliche Komponenten (ich hörte von Jedi).

Vorteil ist, mit nur ein paar Befehlen ist das Bild eingefügt, es scaliert sich automatisch zu der Druckerauflösung, und man kann auch eine Vorschau generieren.


Ironwulf - Fr 09.02.07 21:22

ich hab das jetz so (ein wenig abgeändert da ich keine panel hab), klappt aber trotzdem nich, drucker zieht blatt und das wars


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
procedure TForm1.Drucken1Click(Sender: TObject);
var i, j         : integer;
    Druckgroesse : TRect;
    oW, oH       : integer;
begin  
  printer.orientation := poPortrait;
  printer.BeginDoc;  
  Druckgroesse.Left   := 0;  
  Druckgroesse.Top    := 0;
  Druckgroesse.Right  := GetDeviceCaps(Printer.Canvas.Handle, horzres);
  Druckgroesse.Bottom := GetDeviceCaps(Printer.Canvas.Handle, vertres);
  //i := panel1.ControlCount;

//  for j := 0 to i-1 do begin;
    oW := Image1.Width;
    oH := Image1.Height;


    SetStretchBltMode(printer.Canvas.Handle, HALFTONE);
    StretchBlt(printer.Canvas.Handle, 00, Druckgroesse.Right, Druckgroesse.Bottom,
              Image1.Canvas.Handle, 00, oW, oH, SRCCopy);
    //if j < i-1 then printer.NewPage;
  //end;

  printer.EndDoc;
end;


Raffo - Sa 10.02.07 08:12

Jetzt wollte ich es auch mal genauer wissen, unten ein Beispiel Projekt (mit genau Deinem Code) - hat auf Anhieb funktioniert. Selbst auf einem Bondrucker (Epson TMT). Vielleicht ist Dein Standard-Drucker verstellt oder sonstwie ungültig? Im Projekt auch die compilierte .exe, probier die zuerst. 2 Buttons, einmal über Standarddrucker und einmal Drucker auswählen. Wäre gut, wenn andere das auch testen, und wenn es dort auch geht, ist irgendwas bei Dir faul (vielleicht mal an einem anderen Computer testen). Oder versuch mal einen anderen Drucker...

Woran aber noch zu arbeiten ist: an der Größe, auf dem HP Deskjet druckt er mir das Bild auf die ganze Seite...

//Edit: Achso, beim ersten Mal hatte ich ein .jpg Bild ohne spezielle Konvertierung eingefügt, da hat er nix gedruckt.


Ironwulf - Sa 10.02.07 18:33

thx, funktioniert ;D

hab gestern mal noch beim suchen herausgefunden das der drucker eben nix druckt wenn das Image zu groß ist, vllt liegts daran ich schaus mir bei gelegenheit mal ganz genau an


Ironwulf - Di 06.03.07 04:51

ich hat grad mal wieder ein wenig zeit mich um das drucken zu kümmern

wenn ich das image zur laufzeit "bemal" und dann die obige druckerprozedur verwende geschieht nix, nehm ich jedoch das image und speicher es per Image1.Picture.Bitmap.SaveToFile(); und schmeißes dann zur entwurfszeit (so wie beim bsp von Raffo) in ein Image und drucks dann mit der selben prozedur klappts, warum?

das bild is 649 x 800 Pixel groß falls das irgendwie relevant is...


Delete - Di 20.03.07 01:01

as passiert denn, wenn du den Inhalt des Images in ein Bitmap kopierts und den Canvas des Bitmaps an den Drucker schickst? Ansonsten: http://www.michael-puff.de/Developer/Artikel/2006_06/Drucken.shtml und http://www.michael-puff.de/Developer/Delphi/Sonstiges/Print.html


Ironwulf - Di 20.03.07 02:04

jop
ich bemal das bild mit Image1.Canvas
und will das dann so weitergeben an den drucker Printer.Canvas.Draw(0,0,Image1.Picture.Bitmap);

was ja dann das bild eigentlich autom auf die größe des druckers stretchen sollte

deine tuts find ich etwas umständlich, da ich so sämtliche zeichenroutinen nochmal anwerfen müsste nur halt auf den Printer.Canvas und dabei müsste ich dann noch alles auf die größe des druckers umrechnen, was mir sehr aufwendig erscheint


Ironwulf - Sa 24.03.07 05:58

ich hab mal alle prozeduren die ich im netz feinden konnt durch probiert, keine hat funktioniert...

bin ich wirklich zu dumm dazu?

gibts eine dll an die ich einfach nur den canvas übergeben muss, und die das dann für mich druckt?


LGoris - Mo 26.03.07 22:53
Titel: image wird nicht gedruckt
Try this:
Take a TChart component (z.b. Chart1) over the image wou will print (z.b. ImPict) and set his propertys invisible or 0(I mean: left axis, bottom axis u.s.w.). Chart1.Height = ImPict.Height, Chart1.Width = ImPict.Width, Chart1.Visible = False


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TForm.SBtnPrintPictureClick(Sender: TObject);
begin
  Chart1.BackImage:=ImPict.Picture;
  Chart1.Visible:=True;
  Teeprevi.ChartPreview(Form,Chart1);
  Chart1.Visible:=False;
end;


Do not forget: add the unit Teeprevi to the uses of your unit.

Moderiert von user profile iconraziel: Delphi-Tags hinzugefügt


Ironwulf - Sa 31.03.07 23:03

das geht bei mir auch nicht, obwohl in der druckvorschau alles richtig dargestellt wird

hab nun aber das gefunden:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
var bmp: TBitmap;
begin 
 Seite1.Picture.Bitmap.SaveToFile('1.bmp');
  try
    bmp:= TBitmap.Create;
    bmp.LoadFromFile('1.bmp');
    with Printer do begin
      BeginDoc;
      Canvas.StretchDraw(Rect(200200, PageWidth - 200, PageHeight - 200), bmp);
      EndDoc;
    end;
    bmp.Destroy;
  except
    raise;
  end;
end;


das funktioniert
aber wenn ich es nicht erst auf der platte ablege sondern direkt so mache:
bmp:= Seite.Picture.Bitmap;
gehts wiedrrum nicht, warum?


Martok - So 01.04.07 03:55

Ich würde ja mal ein falsches PixelFormat vermuten, wenn es aus Datei geht. Was steht da denn drin?


Ironwulf - So 01.04.07 04:52

das Image.Picture.Bitmap ist pfDevice
und das bmp ist pf32Bit

ich find morgen (also das heute morgen ;D ) mal raus obs wirklich daran gelegen hat, wenn ja schrei ich erstmal ganz laut


Ironwulf - Mi 04.04.07 02:36

*schrei*

lag echt die ganze zeit nur daran...