2009-08-20 12 views
20

Ich habe zwei PNGs, die ich versuche, mit ReportLab 2.3 auf Python 2.5 zu einer PDF zu kombinieren. Wenn ich canvas.drawImage (ImageReader) verwende, um entweder PNG auf die Leinwand zu schreiben und zu speichern, erscheint die Transparenz schwarz. Wenn ich PIL (1.1.6) verwende, um ein neues Bild zu erzeugen, dann paste() entweder PNG auf das PIL-Bild, es fügt sich gut zusammen. Ich habe in Gimp doppelt überprüft und beide Bilder haben funktionierende Alpha-Kanäle und werden korrekt gespeichert. Ich erhalte keinen Fehler und es scheint nichts zu geben, dass mein Google-Fu auftauchen kann.Transparenz in PNGs mit reportlab 2.3

Hat jemand da draußen ein transparentes PNG auf einem ReportLab-Canvas zusammengefügt, wobei die Transparenz ordnungsgemäß funktioniert? Vielen Dank!

Antwort

47

Übergeben der Maske Parameter mit einem Wert von 'Auto' zu drawImage behebt dies für mich.

drawImage(......., mask='auto') 

More information on the drawImage-function

+0

Arbeitete auch für mich - danke! –

+0

Yup, das macht es. Vielen Dank! –

+1

FYI die 'drawImage' Dokumente sind hier verfügbar: http://www.reportlab.com/apis/reportlab/dev/pdfgen.html#reportlab.pdfgen.canvas.Canvas.drawImage – dkamins

0

ReportLab verwendet PIL für die Verwaltung von Bildern. Momentan hat der PIL-Trunk einen Patch zur Unterstützung transparenter PNGs, aber Sie müssen auf eine Version 1.1.6 warten, wenn Sie ein stabiles Paket benötigen.

1

Ich habe festgestellt, dass mask='auto' für mich die Arbeit mit reportlab 3.1.8 aufgehört hat. In der Dokumentation heißt es, die Werte zu übergeben, die Sie ausblenden möchten. Was für mich jetzt funktioniert ist mask=[0, 2, 0, 2, 0, 2, ]. Im Grunde sieht es so aus: `mask = [red_start, red_end, green_start, green_end, blue_start, blue_end,]

Mit dem Maskenparameter können Sie transparente Bilder erstellen. Es nimmt 6 Zahlen und definiert den Bereich der RGB-Werte, die maskiert werden oder als transparent behandelt werden. Zum Beispiel mit [0,2,40,42,136,139], es wird alle Pixel mit einem Rot-Wert von 0 oder 1, Grün von 40 oder 41 und Blau von 136, 137 oder 138 (auf einer Skala von 0- 255). Es ist derzeit Ihre Aufgabe zu wissen, welche Farbe der 'transparente' oder Hintergrund ist.

UPDATE: Das blendet alles, was rgb(0, 0, 0) oder rgb(1, 1, 1) der ist offensichtlich nicht die richtige Lösung sein könnte. Mein Problem war, dass Leute PNG-Bilder mit einem grauen Farbraum hochladen. Also muss ich noch einen Weg finden, den Farbraum des Bildes zu erkennen. und wenden Sie diese Maske nur auf Graustufenbilder an.

+0

Ich verwende ein Schwarz-Weiß-Bild. Es scheint nicht möglich zu sein, eine Korrektur zu finden, also habe ich das Bild einfach photoshoppt, um einen weißen Hintergrund zu haben. Weg, Weg, viel schneller. – varagrawal

+0

@varagrawal Wenn Sie Ihr Originalbild in Photoshop öffnen, sollten Sie überprüfen, welchen Farbraum es verwendet. Es ist wahrscheinlich Graustufen. Wenn Sie den Farbraum in RGB ändern würden, würde das Bild gleich aussehen, aber es wäre ein wenig groß, aber das würde funktionieren und Sie könnten die Transparenz beibehalten. – teewuane