Das folgende PHP-Code-Snippet verwendet GD, um die Größe eines vom Browser hochgeladenen PNG auf 128 x 128 zu ändern. Es funktioniert hervorragend, außer dass die transparenten Bereiche im Originalbild in meinem Fall durch einfarbiges Schwarz ersetzt werden.
Obwohl imagesavealpha
festgelegt, stimmt etwas nicht ganz.
Was ist der beste Weg, um die Transparenz im neu abgetasteten Bild zu erhalten?
$uploadTempFile = $myField[ 'tmp_name' ]
list( $uploadWidth, $uploadHeight, $uploadType )
= getimagesize( $uploadTempFile );
$srcImage = imagecreatefrompng( $uploadTempFile );
imagesavealpha( $targetImage, true );
$targetImage = imagecreatetruecolor( 128, 128 );
imagecopyresampled( $targetImage, $srcImage,
0, 0,
0, 0,
128, 128,
$uploadWidth, $uploadHeight );
imagepng( $targetImage, 'out.png', 9 );
alphablending = false
wichtig ist? Das Dokument gibt es an ... "Sie müssen alphablending (imagealphablending($im, false)
) deaktivieren , um es zu verwenden."imagecreatefrompng()
vorschlägt, dassimagealphablending
dies festgelegt werden solltetrue
, was eindeutig falsch ist. Vielen Dank.Warum machst du die Dinge so kompliziert? Folgendes verwende ich und bisher hat es die Arbeit für mich erledigt.
quelle
Ich glaube, das sollte den Trick machen:
Bearbeiten: Jemand in den PHP-Dokumenten Behauptungen
imagealphablending
sollte wahr sein, nicht falsch. YMMV.quelle
imagealphablending
ich entweder mit wahr oder falsch benutze, bekomme ich immer einen schwarzen Hintergrund.Eine Ergänzung, die einigen Menschen helfen könnte:
Es ist möglich, die Bildbearbeitung beim Erstellen des Bildes umzuschalten. In dem speziellen Fall, in dem ich dies brauchte, wollte ich einige halbtransparente PNGs auf einem transparenten Hintergrund kombinieren.
Zuerst setzen Sie imagealphablending auf false und füllen das neu erstellte True-Color-Bild mit einer transparenten Farbe. Wenn imagealphablending wahr wäre, würde nichts passieren, da die transparente Füllung mit dem schwarzen Standardhintergrund verschmelzen und zu Schwarz führen würde.
Dann schalten Sie imagealphablending auf true um und fügen der Leinwand einige PNG-Bilder hinzu, wobei ein Teil des Hintergrunds sichtbar bleibt (dh nicht das gesamte Bild ausfüllt).
Das Ergebnis ist ein Bild mit transparentem Hintergrund und mehreren kombinierten PNG-Bildern.
quelle
Ich habe eine Funktion zum Ändern der Bildgröße wie JPEG / GIF / PNG mit
copyimageresample
und PNG-Bilder haben immer noch Transparenz:quelle
$transparent = imagecolorallocatealpha($tmp, 255, 255, 255, 127);
imagefilledrectangle($tmp, 0, 0, $newwidth, $newheight, $transparent);
Ich nehme an, dass dies den Trick tun könnte:
Der Nachteil ist, dass das Bild alle 100% grünen Pixel entfernt wird. Wie auch immer, hoffe es hilft :)
quelle
imagecreate(...)
funktioniert. Sie erstellen ein Bild, das mit der ersten Farbe gefüllt wird, die Sie zuweisen. Dann setzen Sie diese Farbe auf transparent. Wenn Alphablending für das Zielbild auf true gesetzt ist, werden beide Bilder zusammengeführt und die Transparenz funktioniert ordnungsgemäß.Wenn die Transparenz beibehalten wird, muss ja, wie in anderen Posts angegeben, imagesavealpha () auf true gesetzt werden, um das Alpha-Flag imagealphablending () zu verwenden, muss false gesetzt werden, sonst funktioniert es nicht.
Außerdem habe ich in Ihrem Code zwei kleinere Dinge entdeckt:
getimagesize()
, um die Breite / Höhe für zu erhaltenimagecopyresmapled()
$uploadWidth
und$uploadHeight
sollte-1
der Wert sein, da die Koordinaten bei beginnen0
und nicht1
, damit sie in ein leeres Pixel kopiert werden. Ersetzen Sie es durch:imagesx($targetImage) - 1
undimagesy($targetImage) - 1
sollte es relativ tun :)quelle
Hier ist mein gesamter Testcode. Für mich geht das
quelle
Achten Sie auf die Quellbilder
width
undheight
Werte, die an dieimagecopyresampled
Funktion übergeben werden. Wenn sie größer als die tatsächliche Quellbildgröße sind, wird der Rest des Bildbereichs mit schwarzer Farbe gefüllt.quelle
Ich kombinierte die Antworten von Ceejayoz und Cheekysoft, was das beste Ergebnis für mich ergab. Ohne imagealphablending () und imagesavealpha () ist das Bild nicht klar:
quelle