Cuplikan kode PHP berikut menggunakan GD untuk mengubah ukuran PNG yang diunggah browser menjadi 128x128. Ini berfungsi dengan baik, kecuali bahwa area transparan pada gambar asli diganti dengan warna solid- hitam dalam kasus saya.
Meskipun imagesavealpha
sudah diatur, ada sesuatu yang tidak beres.
Apa cara terbaik untuk menjaga transparansi pada gambar yang telah diubah sampelnya?
$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
penting di sini? Doc menyatakan itu ... "Anda harus membatalkan alphablending (imagealphablending($im, false)
), untuk menggunakannya."imagecreatefrompng()
menyarankan yangimagealphablending
harus diseteltrue
, yang jelas salah. Terima kasih banyak.Mengapa Anda membuat hal-hal menjadi begitu rumit? berikut ini adalah apa yang saya gunakan dan sejauh ini telah berhasil untuk saya.
sumber
Saya yakin ini akan berhasil:
edit: Klaim seseorang di dokumen PHP
imagealphablending
seharusnya benar, bukan salah. YMMV.sumber
imagealphablending
baik dengan benar atau salah saya selalu mendapatkan latar belakang hitam.Tambahan yang mungkin membantu beberapa orang:
Hal ini dimungkinkan untuk mengubah gambaralphablending sambil membangun gambar. Saya kasus khusus yang saya butuhkan ini, saya ingin menggabungkan beberapa PNG semi-transparan pada latar belakang transparan.
Pertama Anda mengatur imagealphablending ke false dan mengisi gambar warna asli yang baru dibuat dengan warna transparan. Jika imagealphablending benar, tidak ada yang akan terjadi karena isian transparan akan bergabung dengan latar belakang default hitam dan menghasilkan hitam.
Kemudian Anda mengubah gambar menjadi berubah menjadi true dan menambahkan beberapa gambar PNG ke kanvas, membiarkan beberapa latar belakang terlihat (yaitu. Tidak memenuhi seluruh gambar).
Hasilnya adalah gambar dengan latar transparan dan beberapa gambar PNG gabungan.
sumber
Saya telah membuat fungsi untuk mengubah ukuran gambar seperti JPEG / GIF / PNG dengan
copyimageresample
dan gambar PNG tetap menjaga transparansi:sumber
$transparent = imagecolorallocatealpha($tmp, 255, 255, 255, 127);
imagefilledrectangle($tmp, 0, 0, $newwidth, $newheight, $transparent);
Saya kira ini mungkin berhasil:
Sisi negatifnya adalah bahwa gambar akan dihilangkan dari setiap 100% piksel hijau. Bagaimanapun, semoga membantu :)
sumber
imagecreate(...)
berhasil. Anda membuat gambar, yang diisi dengan warna pertama yang Anda alokasikan. Kemudian Anda mengatur warna itu menjadi transparan. Jika alphablending diatur ke true untuk gambar target, kedua gambar akan digabungkan dan transparansi berfungsi dengan benar.Regrading menjaga transparansi, maka ya seperti yang dinyatakan dalam posting lain imagesavealpha () harus disetel ke true, untuk menggunakan bendera alpha imagealphablending () harus disetel ke false jika tidak itu tidak berfungsi.
Saya juga melihat dua hal kecil di kode Anda:
getimagesize()
untuk mendapatkan lebar / tinggiimagecopyresmapled()
$uploadWidth
dan$uploadHeight
harus-1
nilai, karena cordinates dimulai pada0
dan tidak1
, sehingga akan menyalinnya ke dalam pixel kosong. Menggantinya dengan:imagesx($targetImage) - 1
danimagesy($targetImage) - 1
, secara relatif harus dilakukan :)sumber
Ini adalah total kode tes saya. Ini bekerja untuk saya
sumber
Perhatikan gambar sumber
width
danheight
nilai yang diteruskan keimagecopyresampled
fungsi. Jika lebih besar dari ukuran gambar sumber sebenarnya, area gambar lainnya akan diisi dengan warna hitam.sumber
Saya menggabungkan jawaban dari ceejayoz dan Cheekysoft, yang memberikan hasil terbaik untuk saya. Tanpa imagealphablending () dan imagesavealpha () gambar tidak jelas:
sumber