Autor Beitrag
C++arsten
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 79



BeitragVerfasst: Sa 21.07.07 13:22 
Hallo,
es ist eine Bitmap-Grafik in meinem Programm eingebunden, die mittels
ausblenden Delphi-Quelltext
1:
Printer.Canvas.Draw(pixel_x, pixel_y, Image1.Picture.Bitmap)					

ausgedruckt wird. In Abhängigkeit von der Druckerauflösung (300 DPI bzw. 600 DPI bzw. 1200 DPI) wird diese Grafik entweder
- zu groß (bei einem 300-DPI-Drucker),
- passend (bei einem 600-DPI-Drucker) oder
- zu klein (bei einem 1200-DPI-Drucker)
ausgegeben.
Es soll die Grafik nun immer passend zur Auflösung des Druckers ausgegeben werden, sie soll also immer die Größe haben, wie bei dem 600-DPI-Drucker, dort passt sie. Eine Lösung bestünde darin, für jeden möglichen DPI-Faktor des Druckers eine in der Größe passende Grafik in das Programm einzubinden, das hätte aber eine erhebliche Vergrößerung der exe-Datei zur Folge.
Gibt es also eine Möglichkeit, die Bitmap iim laufenden Betrieb, je nach Drucker-DPI, in der Größe zu verkleinern bzw. zu vergrößern?

Danke.
Wonko
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 69



BeitragVerfasst: Sa 21.07.07 13:49 
Hallo,

ich nehme mal an, dass der Ausdruck bei 300DPI doppelt so groß wird wie bei 600DPI?
Dann solltest Du aus Deiner 600DPI- eine 300DPI-Grafik machen. Du nimmst Dir also vier Punkte aus Deinem 600DPI-Bild bildest den "mittleren Farbwert" und speicherst sie als einen Punkt eines neuen, jetzt halb so breiten und hohen, Bildes ab. Das sollte während der Laufzeit des Programms kein Probelm sein.
(die 4 Punkte sollten natürlich ein 2x2-Quadrat sein)

Funktioniert das so?; ich denke, es sollte. Natürlich geht Dir somit Information verloren, abhängig vom Motiv kann das dann hässlich aussehen.

Für 1200DPI das ganze einfach umdrehen, aus einem Punkt werden vier Punkte mit selber Farbe, oder du interpolierst die neuen Pixel aus den alten.

Grüße
C++arsten Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 79



BeitragVerfasst: Sa 21.07.07 18:15 
Hm, das muss ich erst einmal probieren, danke.
C++arsten Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 79



BeitragVerfasst: Di 31.07.07 11:37 
Gelöst. Danke.
C++arsten Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 79



BeitragVerfasst: So 28.10.07 08:22 
Ich muss mich revidieren.
Leider ist das Problem nicht gelöst, habe es nicht hinbekommen.

Hat noch wer einen Rat???
matze
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 4613
Erhaltene Danke: 24

XP home, prof
Delphi 2009 Prof,
BeitragVerfasst: So 28.10.07 11:57 
Schau dir mal die Methode StretchDrawan. Das dürfe das sein, was du brauchst. Du musst halt die Größenberechnungen noch selbst vornehmen, was aber kein Problem sein dürfte.

_________________
In the beginning was the word.
And the word was content-type: text/plain.
C++arsten Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 79



BeitragVerfasst: So 28.10.07 23:10 
Danke, hast mir geholfen. So gehts:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TForm1.Button1Click(Sender: TObject);
var
  rect: TRect;
begin
    Printer.BeginDoc;
    rect:= Bounds(00, Image1.Picture.Bitmap.Height * 4, Image1.Picture.Bitmap.Width * 4);
    Printer.Canvas.StretchDraw(rect, Image1.Picture.Bitmap);
    Printer.EndDoc;
end;
matze
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 4613
Erhaltene Danke: 24

XP home, prof
Delphi 2009 Prof,
BeitragVerfasst: Mo 29.10.07 12:25 
Wobei du jetzt das Bild immer um den Faktor 4 vergrößerst. Du solltest dir diesen Faktor besser dynamisch errechnen, damit dein Programm auch auf jedem Drucker mit jeder Auflösung funktioniert !

_________________
In the beginning was the word.
And the word was content-type: text/plain.
C++arsten Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 79



BeitragVerfasst: Mo 29.10.07 13:04 
Ja, so mache ich es auch, der Code sollte nur ein Beispiel sein.
So wie ich es sehe, hat ein Drucker entweder eine Auflösung von 300, 600 oder 1200 dpi, dazwischen gibt es nichts. Also nehme ich eine kleine passende Grafik für die 300er Auflösung (um die Codegröße klein zu halten) und verdoppele oder vervierfache dann die Größe, je nach Drucker.
Reinhard Kern
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 591
Erhaltene Danke: 14



BeitragVerfasst: Mo 29.10.07 15:22 
user profile iconC++arsten hat folgendes geschrieben:
...
So wie ich es sehe, hat ein Drucker entweder eine Auflösung von 300, 600 oder 1200 dpi, dazwischen gibt es nichts. ...


Es gibt fast nichts, was es nicht gibt - ein Fax hat 192 oder 200 dpi, und unser Laserbelichter hatte eine Auflösung von 5 µ = 5080 dpi. Ich würde daher rechnen oder einer case-Anweisung ein else zufügen für die nicht aufgeführten Fälle.

Gruss Reinhard
C++arsten Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 79



BeitragVerfasst: Mo 29.10.07 15:34 
Ist besser, hast Recht.
Danke.
C++arsten Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 79



BeitragVerfasst: Mo 29.10.07 17:54 
Ich muss noch einmal nachfragen, sorry.

Ein Bild zu stretchen ging, weil es in seinen Abmessungen quadratisch war.
Ein anderes Bild aber ist drei mal so breit wie hoch. Wenn ich das mit StretchDraw verändere, wird es furchtbar gestaucht. Funktioniert StretchDraw also nur mit quadratischen Bitmaps?

Danke!
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Mo 29.10.07 18:29 
Natürlich nicht. Was willst Du eigentlich? Du willst, das ein Bild immer die gleichen Abmessungen hat, z.B. 40 x 30 mm.
Dazu benötigst du die aktuelle X- und Y-Auflösung des Druckers. Ja, auch da gibt es: Unterschiedliche Auflösungen in X- und Y-Richtung.

Die Formel hierfür lautet: Anzahl der Pixel = [Abmessung in mm] * [Drucker DPI] / 25.4;

Du musst also nur noch die vertikale und horizontale Auflösung des Zieldruckers ermitteln, aus o.g. Formel für die Höhe und Breite die dann gültige Pixelanzahl ausrechnungen und das Bild dann mit StretchDraw auf den Druckercanvas zeichnen.

_________________
Na denn, dann. Bis dann, denn.