Hallo in die Runde.
Ich bekam die im Betreff angegebene Fehlermeldung (Windows). Leider ist der Wert ohne Einheit angegeben.
Es betrifft folgenden Code (Druck eines großen Bildes auf mehrere Seiten):
dim i,j,bis1,bis2,w,h,wf,hf as integer
dim firstprint as Boolean
dim gp as Graphics
gp=OpenPrinterDialog(ps)
if gp<>nil then
firstprint=true
w=gp.width
h=gp.height
wf=pi.Width
hf=pi.Height
h=h/Zeilenhoehe
h=h*Zeilenhoehe
bis1=hf\h
bis2=wf\w
for i=0 to bis1//Höhe
for j=0 to bis2//Breite
if firstprint=false then
gp.NextPage
else
firstprint=false
end
gp.DrawPicture Pi,0,0,w,h,j*w,i*h,w,h
next
next
end
Bei DrawPicture kommt es mit folgenden Werten zu besagtem Fehler:
i=0
j=0
w=3781
h=5760
hf=18080
wf=5120
Damit vermute ich mal, dass die maximale Größe 16384 Pixel sein sollen (kann das einer bestätigen?).
Was kann ich tun, um das Bild dennoch ausgeben zu können?
Offenbar hat Windows ohnehin Probleme mit großen Bildern. Wie kann ich unter Windows Bilder mit 20.000 oder 30.000Pixel erzeugen und drucken (oder zumindest als Bild sichern)? Gar nicht?
Leider gab es bisher keine Lösung.
Hier noch mal den aktuellen Stand:
Ich bekomme unter Windows beim Ausführen des Codes: gp.DrawPicture PLokal,0,0,w,h,j*w,i*h,w,h
wobei:
i und j = 0
w = 4956
h = 6880
PLokal ist eine 32-Bit Grafik mit height=32000 und width=6720
die Fehlermeldung: UnsupportetOperationException Picture exceeds max size of 16384
Unter macOS ist das kein Problem. Wo ist mein Fehler?
Oder Besser, wie kann ich das ändern, dass der Code unter Windows funktioniert?
Ich glaube, 32767 ist die maximale Größe (16384 für Breite oder Höhe), die ein Bild unter Windows haben kann. Ich weiß nicht, ob das eine von Xojo oder der API auferlegte Beschränkung ist. Ich weiß nicht, wie man das umgehen kann, und ich kann mich auch nicht daran erinnern, dass dies zu 100% die Ursache ist, da ich noch nie mit einem so großen Bild gearbeitet habe.
Hoffentlich meldet sich jemand, der das schon einmal erlebt hat, oder einer der Techniker.
Ich meinte nicht, dass es sich um ein Windows-weites Problem handelt, aber es könnte ein Problem mit der API sein, die sie zum Erstellen und Verwalten von Bildobjekten auf Betriebssystemebene verwenden. Wie auch immer, es scheint eine harte Grenze für die Bildgröße in Windows von Xojo-Anwendungen zu geben. Ich nehme an, dass Sie irgendeine Art von großen Objekten für Banner oder ähnliches drucken, sonst würde ich vorschlagen, die Größe des Eingabebildes zu beschränken. Ich hoffe immer noch, dass einer der Techniker hier einspringen und helfen wird, da ich nicht wirklich von mehr Nutzen sein kann mit diesem.
OK, ich habe gerade mit @Geoff_Perlman darüber gesprochen. Sie prüfen gerade, ob es sich um eine selbst auferlegte Einschränkung handelt, die nicht mehr notwendig ist. Wenn ich etwas höre, werde ich hier Bericht erstatten.
OK, das ist offenbar eine Einschränkung der Direct2D-Engine in Windows, und nichts, was sie schnell beheben können. Ich habe @Christian_Schmitz angerufen, um zu sehen, ob er helfen kann.
Zum Hintergrund.
Es handelt sich um die Ausgabe einer Listbox (in den Zeilen ist nicht nur Text sondern auch Grafik). Die Breite ist vermutlich selten problematisch. Allerdings können es viele Hundert bis mehrere Tausend Zeilen werden. Die werden dann auf mehrere A4 Seiten verteilt (auch in der Breite).
Der Code funktioniert auf dem Mac problemfrei. Ohne die Fehlermeldung, die nur auf Windows kommt. (Linux habe ich noch nicht getestet).
You could use GMImageMBS class in MBS Xojo Plugins to load image and scale it down to make it usable. Or of course our PictureMBS class can help here, too.
Die Überlegung, die Ausgabe auf mehrere Bilder zu verteilen hatte ich auch schon.
Wie mir PictureMBS hier helfen kann habe ich noch nicht verstanden. Der Fehler kommt ja in der Zeile
gp.DrawPicture PLokal,0,0,w,h,jw,ih,w,h
Hier wird ja über OpenPrinterDialog auf den Drucker ausgegeben. Das Bild PLocal entspricht dem übergebenem Bild (zuvor gibt es die Zeile PLocal=Pi, wobei Pi Parameter der Methode ist). Demnach ist das ursprüngliche (auszugebende) Bild nicht das Problem.
Du könntest ein temporäres Bild erzeugen mit den Maßen, in denen du Zeichen willst zum Drucken und dann dieses temporäre Bild beim Drucken zeichnen.
Dadurch kommt das skalieren vor der Übergabe zum Drucker.
Ja, das habe ich auch überlegt und versucht. Das führt unter Windows zumindest nicht mehr zu einem Fehler, aber die erzeugte PDF-Datei (ich habe eine PDF-Drucker genutzt) zeigte nicht alle Seiten.
Daraufhin habe ich mir das auf dem Mac angesehen und feststellen müssen, dass ab einem bestimmten Vergrößerungsfaktor nicht mehr das komplette Ursprungsbild ausgegeben wird.
Also gehe ich erst mal davon aus, dass Dein Vorschlag hilft und die Fehlermeldung unterbleibt.
Jetzt muss ich nur noch herausfinden, wieso unter bestimmten Umständen (Vergrößerungsfaktor der Ausgabe) nicht alles ausgegeben wird.
Soweit erst mal vielen Dank für die Unterstützung!