Bild Drucken

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
winduff
Beiträge: 879
Registriert: 10.02.2006 21:05
Wohnort: Gießen
Kontaktdaten:

Beitrag von winduff »

Nochmal super vielen Dank :allright:


Aaaaaber: Ohne zu wissen, was für einen Drucker / Auflösung / DPI der Endanwender hat, wie kann ich das Bild PERFEKT 1:1 an seinen Drucker wiedergeben, ohne mit der Auflösung des Bildes, bzw. skalieren - rumzuspielen?! so wie ich es verstanden hab, generell nciht möglich oder liegts an PureBasic?

Wenn ja könnte man das doch sicher mit ner in C (oder sonst was) geschriebenen DLL umgehen? Oder halt API.....
Bild
AND51 hat geschrieben:...und ich würde dein Programm aus Wut zwei mal installieren, um eines genüsslicher löschen zu können, als das andere...
Benutzeravatar
bluejoke
Beiträge: 1244
Registriert: 08.09.2004 16:33
Kontaktdaten:

Beitrag von bluejoke »

Wenn du es 1:1 weitergeben willst, dann skalierste halt nicht rum. Weil aber Drucker verschiedene Auflösungen haben, ist das Ergebnis am Ende eben unterschiedlich groß (Breite und Höhe meine ich). Die Bilddaten bleiben jedoch gleich groß (information). Der eine Drucker schaffts halt auf einen kleineren Platz, der andere auf einen größeren.
Ich bin Ausländer - fast überall
Windows XP Pro SP2 - PB 4.00
Benutzeravatar
winduff
Beiträge: 879
Registriert: 10.02.2006 21:05
Wohnort: Gießen
Kontaktdaten:

Beitrag von winduff »

hmmm okay ;-)

Ich glaub ich habs somit vollendend verstanden, und werd jetz ma bei HP nen Job annehmen :mrgreen:

Danke!
Bild
AND51 hat geschrieben:...und ich würde dein Programm aus Wut zwei mal installieren, um eines genüsslicher löschen zu können, als das andere...
Benutzeravatar
Jason
Beiträge: 123
Registriert: 06.01.2005 17:47

Beitrag von Jason »

winduff hat geschrieben:Nochmal super vielen Dank :allright:


Aaaaaber: Ohne zu wissen, was für einen Drucker / Auflösung / DPI der Endanwender hat, wie kann ich das Bild PERFEKT 1:1 an seinen Drucker wiedergeben, ohne mit der Auflösung des Bildes, bzw. skalieren - rumzuspielen?! so wie ich es verstanden hab, generell nciht möglich oder liegts an PureBasic?
Also was für Werte der Drucker des Anwenders hat kannst Du ja - wie
beschrieben - ermitteln. Das Bild wirst Du dann anpassen müssen. Wie gut
das Bild dann ist, ist auch eine Frage der Skalierqualitäten von PureBasic.
Je höher die Auflösung des Druckers ist desto mehr musst Du das Bild
aufblähen. Das ist ganz klar ein Nachteil von PureBasic. In den üblichen
Grafikprogrammen verhält es gänzlich anders. Egal welches Programm
und welchen Drucker Du nimmst, es wird in der Regel "immer gleich gross
gedruckt" (Ich meine natürlich Handelsübliche Drucker nicht das jetzt
jemand mit einem totale Exoten kommt der sich völlig anders verhält,
oder einem Drucker wo der Treiber völliger Mist ist. Das gibt es leider
auch). Es gibt aber auch da Ausnahmen wenn nämlich Programmierfehler
vorliegen. Als Beispiel sei PicturePublisher8 erwähnt. Das Programm
druckt auf DinA3 etwas zu hoch, verzerrt also leicht das Bild was eben ein
Programmierfehler ist. Andere getestete Programme verhielten sich da
korrekt. Sogar Vektorgrafikprogramme wie Illustrator. Micrografx
Designer etc. verhalten sich da gewöhnlich einwandfei wenn man ein
Bitmap auf das Arbeitsblatt importiert und druckt.

Also um es kurz zu machen es ist "generell möglich", aber nicht mit
PureBasic. Da muss man eben am Bild skalieren. Du kannst natürlich mal
testen ob sich das Skalieren sooo unverträglich auswirkt.
Bei Skalierungsraten die aber über wenigen Prozent liegen, also gleich 2,
3, 4, 5, 6 mal oder noch mehr betragen habe ich so meine Zweifel.
Aber vielleicht merkt das ja keiner, die Erkennungsfähigkeiten des
Betrachters spielen ja auch eine Rolle. :wink:

Um es noch mal auf den Punkt zu bringen, der Fehler an PureBasic ist das
PureBasic mit der Auflösung des Druckers druckt und NICHT mit der
Auflösung des Bildes. Da bessert Fred aber bestimmt gerne nach. :wink:

Noch was am Rande. Die von mir erwähnten ca. 200 - 300 dpi für einen
sehr guten Ausdruck beziehen sich auf Ausdrucke bis ca. 20 * 30 cm. Das
hängt mit dem üblichen Betrachtungsabstand zusammen der in etwa der
Diagonale des Bildes entspricht (Natürlich nicht bei Briefmarken etc.). Bei
grösseren Formaten kann man mit der Auflösung auch runter gehen weil
sich der Betrachtungsabstand vergrössert. Das hat vielleicht jeder schon
mal bei bei grossen Plakaten gesehen, die aus der Nähe betrachtet
reichlich Pixelig sind.
Der Rest ist Schweigen!
Benutzeravatar
Jason
Beiträge: 123
Registriert: 06.01.2005 17:47

Beitrag von Jason »

bluejoke hat geschrieben:Wenn du es 1:1 weitergeben willst, dann skalierste halt nicht rum. Weil aber Drucker verschiedene Auflösungen haben, ist das Ergebnis am Ende eben unterschiedlich groß (Breite und Höhe meine ich). Die Bilddaten bleiben jedoch gleich groß (information). Der eine Drucker schaffts halt auf einen kleineren Platz, der andere auf einen größeren.
Das stimmt, aber befriedigend ist das nicht und eigentlich auch nicht nötig.
Der Rest ist Schweigen!
Benutzeravatar
winduff
Beiträge: 879
Registriert: 10.02.2006 21:05
Wohnort: Gießen
Kontaktdaten:

Beitrag von winduff »

Manmanman du solltest für Computer Bild oder PC Go! arbeiten ;-)

Klasse und vielen Dank :)
Bild
AND51 hat geschrieben:...und ich würde dein Programm aus Wut zwei mal installieren, um eines genüsslicher löschen zu können, als das andere...
Benutzeravatar
bluejoke
Beiträge: 1244
Registriert: 08.09.2004 16:33
Kontaktdaten:

Beitrag von bluejoke »

Hallo!

Ich verstehe nicht, was das Problem darstellt. Grafikprogramme sind doch schon fertige Programme, keine Sprachen. Das man sich sowas vielleicht selbst zurechtschnitzeln muss ist doch klar. Und die Druckfunktion ist bestimmt nicht das einzige Beispiel für solche Situationen.

Grüße,
Simon
Ich bin Ausländer - fast überall
Windows XP Pro SP2 - PB 4.00
Benutzeravatar
Jason
Beiträge: 123
Registriert: 06.01.2005 17:47

Beitrag von Jason »

bluejoke hat geschrieben:Hallo!

Ich verstehe nicht, was das Problem darstellt. Grafikprogramme sind doch schon fertige Programme, keine Sprachen. Das man sich sowas vielleicht selbst zurechtschnitzeln muss ist doch klar. Und die Druckfunktion ist bestimmt nicht das einzige Beispiel für solche Situationen.

Grüße,
Simon
Sorry wenn ich das so sage, aber dann hast Du etwas grundsätzliches
nicht verstanden. Ein Grafikprogramm nimmt Dein Bild und druckt es.
PureBasic muss dieses Bild erst noch massiv überarbeiten und das ist ein
erheblicher Unterschied. Arbeite mal etwas mit kleinen Bildern und
versuch diese gross zu drucken in dem Du sie skalierst (interpolierst).
Mit ein wenig Überlegung dürfte eines klar sein. Wenn vielleicht nur noch -
sagen wir mal - 20 % der Bilddaten, echte Bilddaten sind und der Rest
erfundene Pixel, ist PureBasic mit seiner Vorgehensweise nicht geeignet
damit Grafikprogramme zu schreiben die auch vernünftig (qualität)
drucken.

Denk ruhig noch mal darüber nach, das braucht manchmal bis einem da
die Lampe aufgeht, ist keine Schande. :allright:
Der Rest ist Schweigen!
Phil
Beiträge: 32
Registriert: 05.07.2006 10:46

Beitrag von Phil »

@Jason
Ich habe mir einen älteren Beitrag von dir noch mal angeschaut und bin der Meinung, dass das so nicht stimmen kann. Wenn ich mich irren sollte, so bitte ich natürlich um Korrektur :wink:

Jason hat geschrieben: Wie kommen wir jetzt zur Auflösung mit der gedruckt
wird? Zunächst müssen wir herausfinden wie gross dieser Bereich in mm
bei unserem Drucker ist, und das ohne in's Handbuch zu schauen.

Wir wissen:
ein Blatt Papier DinA4 ist 210mm * 297mm gross

der druckbare Bereich beträgt (bezogen auf meinen Drucker) 2892 * 3969
Pixel

das Seitenverhältnis DinA4 297mm/210mm = 1,414

das Seitenverhältnis Druckbereich 3969pixel/2892pixel = 1,372

Was hilft uns das? Wir setzen jetzt die Verhältnisse in's Verhältnis, dann
sehen wir wie es weiter geht.

1,372/1,414 = 0,970

Aha, der Druckbare Bereich z.B. für die Breite (wir nehmen hier mal die
Breite weil dort meistens die kleinsten Ränder sind, und das reicht uns
erstmal für diese Anleitung), beträgt also 97% vom DinA4 Blatt. Da
rechnen wir jetzt weiter...

X-Druckbereich = 210mm * 0,97 = 203,76 mm
Die Seitenverhältnisse 1,372 und 1,414 sagen nur jeweils aus um wieviel die Länge größer ist als die Breite der Seite bzw. des druckbaren Bereichs. Sie enthalten also nur Information über die Form und nicht über die tatsächliche Größe des druckbaren Bereichs. Deshalb kann man damit auch nicht die Größe des druckbaren Bereichs bestimmen.
Ein Beispiel zur Veranschaulichung. Wenn ich einen Drucker hätte der auf einem DIN A4 Blatt nur einen druckbaren Bereich von der Größe eines DIN A5 Blattes hätte, dann wäre das "Verhältnis der Seitenverhältnisse" 1,414/1,414=1. Als X-Druckbereich würde also nach deiner Rechnung die ganze DIN A4 Breite von 210mm herauskommen.

Meiner Meinung nach könnte man die Größe des druckbaren Bereichs nur bestimmen, wenn man z.B die Druckauflösung kennt. Dann würde sich die Breite des druckbaren Bereichs in mm ergeben zu:

Breite = ( Printerpagewidth() / Auflösung(dpi) ) * 25,4

Beispiel: Breite = ( 2378 / 300dpi ) * 25,4 = 201,34 mm

Wie man jedoch die Auflösung wärend des Progammausführung herausbekommt, ist mir nicht klar. Vielleicht kann TS-Soft oder ein anderer alter Hase helfen.

Meine Ausführung soll deinen Ruhm nicht schmälern. Ich finde es toll, wenn jemand so ausführliche Beiträge liefert. Wer viel tut, riskiert eben auf mehr Fehler zu machen.
:D
PB 5.62 on Win10
Benutzeravatar
Ligatur
Beiträge: 196
Registriert: 09.07.2006 00:41

Re: Bild Drucken

Beitrag von Ligatur »

winduff hat geschrieben:Alo ;)

Bevor ich hier ganz verblöde: Ich versuche ein Bild zu drucken, nur wird mein Bild in minimaler größe gezeichnet...

Code: Alles auswählen

If PrintRequester()
        If StartPrinting("")
          If StartDrawing(PrinterOutput())
            DrawImage(ImageID(#CDCRD),0,0,336,217)
            StopDrawing()
          EndIf
          StopPrinting()
        EndIf
      EndIf
Das Bild ist im Format .PNG (JPG hab ich auch probiert), 336x217

Thanks
Chris :allright:
Printer_PhysicalOptions bzw. einfacher Print_Image im Codearchive könnten vieleicht weiterhelfen. Besser ist allerdings ersteres, da man mit Hilfe des dort benutzten API - Befehls (GetDeviceCaps_(hDC, #Flag)) alle möglichen Infos über den Drucker bekommen kann. Unter anderem auch die aktuelle Druckauflösung (GetDeviceCaps_(hDC,#HORZRES) Horizontal und, welch Überaschung, GetDeviceCaps_(hDC,#VERTRES) vertikal.
Antworten