Entwickler-Ecke

Multimedia / Grafik - Drucker verkleindert grafik


mimi - So 29.06.03 13:47
Titel: Drucker verkleindert grafik
Hallo,
ich wil ein bild ausdrucken, und der drucker verkleinert die grafik, warum ?


nyx - Di 14.10.03 01:49

Weil Röhrenbildschirme in aller Regel eine geringere Anzahl an Bildpunkten pro Zoll oder Zentimeter haben, als Drucker. Wenn Dein Bild beispielsweise 640 x 480 pixel groß ist, bedeutet das in etwa bei den üblichen 72 dpi, die ein Monitor (laut meiner Grafikapplikation) hat, daß das Bild ca. 23 cm breit dargestellt... hust hust.. ich weiß hängt auch von der dargestellten Auflösung und der Bilddiagonalen des Monitors ab. Ich will ja nur mal klugscheißern :D
So und im Gegensatz dazu nimm Deinen Drucker, der vielleicht bei einer Auflösung von 300 dpi druckt. Das bewirkt schlußendlich, daß Dein Bild auf dem Papier nur 5,4 cm breit erscheint.

Gerade in Printsachen muß man zwei Dinge beachten - das zu druckende Bild - muß je nach Qualitätsansprüchen - genügend Pixelinformationen haben und zudem noch die adequate Angabe der dpi-Zahl (dots per inch). Wenn letzteres nicht stimmt, könnts bei einem professionellen Druckereiauftrag ein böses Erwachen geben :wink:


mimi - Di 14.10.03 17:17

also muss ich die passende größe selbst herrausfinden.
weil ich habe folgendeds gemacht:
ich hahtte eine papier vorlage und diese habe ich auf meine TFT nachgebaut mit Delphi.
wenn ich das bild jetzt aber unter Picture Publisher drucke hat es die richtige größe warum ? und wie bekommt man diese abweichung rauß ?


PheliX - Di 14.10.03 18:28

Hi!

Villeicht hilft dir das ja weiter:



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
uses
printers


function getpix_x(cm:real):integer;
var ppi:Integer;
i:real;
begin
ppi:=  GetDeviceCaps(printer.Handle,LOGPIXELSX);
i:= (ppi * cm) / 2.54;
result:= round(i+0.5);
end;

function getpix_y(cm:real):integer;
var ppi:Integer;
i:real;
begin
ppi:=  GetDeviceCaps(printer.Handle,LOGPIXELSY);
i:= (ppi * cm) / 2.54;
result:= round(i+0.5);
end;


ci@o

Felix


mimi - Mi 15.10.03 17:07

danke werde ich gleich testen *G*


mimi - Mi 15.10.03 17:56

wenn ich deine funktionen so benutze:

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:
27:
28:
29:
30:
procedure TForm1.BitBtn1Click(Sender: TObject);
var
  x,y,i:Integer;
begin
  with Image1.Canvas do begin
    ShowMessage(IntToStr(getpix_x(18)));
    for x:=0 to getpix_x(18) do Pixels[x,0]:=clBlack;
    for x:=0 to getpix_x(18) do Pixels[x,getpix_y(7.7)]:=clBlack;

    for y:=0 to getpix_y(7.7) do Pixels[0,y]:=clBlack;
    for y:=0 to getpix_y(7.7) do Pixels[getpix_x(18),y]:=clBlack;

  {  for i:=1 to 30 do
      for y:=0 to 289 do
        Pixels[i*22,y]:=clBlack;

    for x:=0 to 681 do
      Pixels[x,144]:=clBlack;

    for x:=0 to 681 do
      Pixels[x,263]:=clBlack;

    for i:=1 to 61 do
      for y:=263 to 289 do
        Pixels[i*11,y]:=clBlack;

    for x:=0 to 681 do
      Pixels[x,277]:=clBlack;}

  end;
end;

bekomme ich bei der X sachen viel zu große werte rauß. woran kann das liegen ?


PheliX - Do 16.10.03 19:28

Hmmm :?:

Weiß ich jetzt auch nit.. aber wenn dein Drucker auf beiden Seiten die gleiche Auflöduns hat (was weiß ich: 360*360) dann kannst du auch nur die Y Variante nehmen!

Cu

Felix

PS: Ich konnte irgendwie nicht so ganz erkennen was dein Programm machen soll... naja!


mimi - Do 16.10.03 19:56

gans einfach:
es soll eine beschrieftung für meine CD boxen ausdrucken. mehr nicht.

aber wie schaffe ich das, das ist in der größe ausgedruckt wird in der es auch angezeigt wird ?

Micrografx Picture Publisher 8 schaft dies ja auch


PheliX - Do 16.10.03 21:43

Pass auf: jeder Drucker hat eine verschiedene Auflösung.

Du musst wenn du zum Beispiel ein Etikett drucken willst, das 5 cm breit und 2 cm hoch ist, die Pixels für den Drucker ausrechenen. (Das is n bissel schwer zu erklären :) )

dann gibst du in meine Funtion 2 ein (also 2 cm) dann fragt das Programm die Auflösung des Druckers ab und rechnet dann die Pixelzahl aus.

Also, du machst dann dein Etikett z.B. in ein Canvas uns kopierst das dann auf das DruckerCanvas mit Stretchdraw (oder wie das heißt?!?)

Ich weiß jetzt nit, ob dir das was geholfen hat, aber ich habs versucht *g*
cu


mimi - Fr 17.10.03 18:10

danke, könnte du noch ein kleines beispiel posten ?
Danke*G*


PheliX - Fr 17.10.03 22:15

Das Beispiel:


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:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls,printers;

type
  TForm1 = class(TForm)
    bt_ellipse: TButton;
    Image1: TImage;
    bt_print: TButton;
    procedure bt_ellipseClick(Sender: TObject);
    procedure bt_printClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

function getpix(cm:real):integer;
var ppi:Integer;
i:real;
begin
ppi:=  GetDeviceCaps(printer.Handle,LOGPIXELSX);
i:= (ppi * cm) / 2.54;
result:= round(i+0.5);
end;

{$R *.dfm}

procedure TForm1.bt_ellipseClick(Sender: TObject);
begin
Image1.Canvas.Ellipse(Image1.ClientRect);
end;

procedure TForm1.bt_printClick(Sender: TObject);
var rect:Trect;
begin
// Also, zuerst das Rechteck für das Etikett der CD boy berechnen

rect.Left:=0; //
              // obere linke Ecke
rect.Top:=0;  //


rect.Right:=getpix(5); // sagen wir einfach mal das das Etikett 5 cm breit ist
rect.Bottom:=getpix(2.5); // damit das Bild nicht verzerrt wird müssen die Breite
                          // un die Länge proportional zu deinem Image sein



with printer do
begin
BeginDoc;
Canvas.StretchDraw(rect,Image1.Picture.Bitmap); //jetzt mit Stretchdraw auf das
                                                //Drucker Canvas
enddoc;
end;
end;

end.



Jetzt wird das wahrscheinlich SEEEEEHR seltsam aussehen.

Wenn du das ganze perfekt machen willst muss du das ganze Bild auf das Canvas proportional zeichnen (getpix)

ich hoffe das hat dir jetzt n bissel geholfen!

Viel Glück

Felix


mimi - Sa 18.10.03 17:02

also vergrößern wollte ich das bild auch wieder nicht, es soll nur in der orgnial größe angezeigt werden, mehr möchte ich garnicht, das das so schwer ist, hätte ich nie gedacht.