PHP GD mengubah ukuran gambar transparan memberikan batas hitam

Saya mencoba memperkecil beberapa gambar transparan di PHP dengan GD, dan setiap kali saya melakukannya, ada batas hitam aneh yang ditambahkan di sekitarnya.

Sebelum sebelum

Setelah masukkan deskripsi gambar di sini

Kode

<?php
    $image = imagecreatefromstring(file_get_contents('logo.png'));
    $width = imagesx($image);
    $height = imagesy($image);

    $newWidth = $width - 1;
    $newHeight = $height - 1;
    $output = imagecreatetruecolor($newWidth, $newHeight);
    imagecolortransparent($output, imagecolorallocatealpha($output, 0, 0, 0, 127));
    imagealphablending($output, false);
    imagesavealpha($output, true);
    imagecopyresampled($output, $image, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height);

    header('Content-Type: image/png');
    imagepng($output);
?>

Sepertinya jika saya mengubah kode dimensi baru menjadi sama dengan yang lama (menghapus - 1), tidak ada batas hitam yang muncul. Jadi pengubahan ukuran menyebabkan masalah.

Adakah yang tahu apa yang mungkin salah?

Sunting: Saya baru menyadari ini hanya terjadi dengan imagecopyresampled dan bukan imagecopyresized. Namun, imagecopyresampled memberikan efek visual yang jauh lebih baik dan saya ingin membuatnya berfungsi jika memungkinkan.


person Alex Turpin    schedule 15.11.2011    source sumber
comment
Sepertinya anti-aliasingnya menggunakan warna hitam untuk warna matte.   -  person Brad    schedule 15.11.2011
comment
@Brad memang benar. Namun, halaman dokumentasi mengatakan bahwa anti-aliasing tidak aktif secara default, dan hanya tersedia pada versi paket GD, yang tidak saya gunakan. Mungkin ada fungsi lain yang menyebabkannya, tetapi sejauh yang saya tahu saya tidak melihat parameter lain...   -  person Alex Turpin    schedule 15.11.2011
comment
Saya baru menyadari ini hanya terjadi dengan imagecopyresampled dan bukan imagecopyresized. Namun, imagecopyresampled memberikan efek visual yang jauh lebih baik dan saya ingin membuatnya berfungsi jika memungkinkan.   -  person Alex Turpin    schedule 15.11.2011
comment
@ Xeon06 jika Anda menemukan solusinya tolong beri tahu saya juga.   -  person Ali Nouman    schedule 15.11.2011


Jawaban (1)


Saya pikir masalahnya di sini adalah gambar sumber Anda.

Apa yang Anda miliki bukanlah PNG warna asli dengan saluran alfa, tetapi PNG warna terindeks dengan warna transparan. Ini terlihat jika Anda membuka gambar di Photoshop:

Gambar seperti yang terlihat di Photoshop

Gambar ini telah dibuat dengan anti-aliasing (yang memberikan teks kuning dengan batas putih yang terlihat di sini), tetapi ketika Anda mengubah ukurannya, perhitungan sub-piksel mungkin sedikit keluar dari batasnya.

Saya kira jika Anda memperbaiki gambar, menjadikannya RGB penuh dengan saluran alfa, Anda tidak akan mengalami masalah ini.

person Brad    schedule 15.11.2011
comment
Terima kasih atas jawabannya. Apakah Anda mungkin mengetahui cara untuk membuatnya bekerja secara terprogram atau tidak dapat dilakukan? - person Alex Turpin; 15.11.2011
comment
Hal terbaik yang harus dilakukan adalah mendapatkan gambar sumber yang bagus. Ini mudah diperbaiki untuk Anda di Photoshop. Kirimkan email kepada saya di [email protected], dan saya akan mengirimkan file yang diperbarui kepada Anda. - person Brad; 16.11.2011
comment
terima kasih banyak atas bantuan Anda. Masalahnya adalah hal ini dilakukan oleh klien kami di antarmuka web. Saya kira mereka harus puas. Terima kasih lagi. - person Alex Turpin; 16.11.2011
comment
@ Xeon06, mungkin Anda hanya dapat menerima gambar dengan warna asli? Atau, mungkin ada cara untuk mengubah gambar ini menjadi gambar RGB penuh yang tidak diindeks sebelum mengubah ukurannya? - person Brad; 16.11.2011
comment
itulah yang saya pikirkan, apakah ada cara untuk mengubahnya terlebih dahulu. - person Alex Turpin; 16.11.2011
comment
@ Xeon06, Bagaimana jika Anda melakukan imagecreatefrompng(), lalu imagesavealpha(), dan langsung imagepng(). Tidak ada pengubahan ukuran, cukup buka, atur penyimpanan alfa, lalu keluarkan? Jika Anda mengambil keluaran itu, lalu mengubah ukurannya, apakah Anda mendapatkan masalah yang sama? Bagaimana jika Anda mencoba imagesavealpha() pada gambar sumber terlebih dahulu? - person Brad; 16.11.2011
comment
Dalam kedua kasus tersebut saya mendapatkan masalah yang sama. - person Alex Turpin; 16.11.2011
comment
@ Xeon06, Dalam hal ini, saya menduga gambar tersebut harus dalam format yang oke terlebih dahulu. Anda mungkin dapat membuat skrip Gimp untuk melakukannya, tetapi saya hanya akan memeriksa gambar dengan warna asli, dan tidak menerima file yang aneh seperti ini. - person Brad; 16.11.2011