Tanda air mendapatkan latar belakang hitam saat transparan

23

Saya telah menginstal PATCH SUPEE 9767 di toko magento 1.9.2.4 saya.

Sekarang saya telah mengunggah Tanda Air baru tetapi latar belakang berubah menjadi hitam.

Apakah ini masalah sejak pembaruan baru? Pada instalasi magento 1.9.2.4 lainnya di mana pembaruan tidak diinstal ada latar belakang masih transparan.

Mike
sumber

Jawaban:

29

Saya memiliki masalah yang sama setelah menambal 1.9.2.2 dan 1.9.2.3. SUPEE-9767 menambahkan metode validasi diperpanjang di

app / code / core / Mage / Core / Model / File / Validator / Image.php

Milik saya adalah:

public function validate($filePath)
{
    $fileInfo = getimagesize($filePath);
    if (is_array($fileInfo) and isset($fileInfo[2])) {
        if ($this->isImageType($fileInfo[2])) {
            return null;
        }
    }
    throw Mage::exception('Mage_Core', Mage::helper('core')->__('Invalid MIME type.'));
}

Dan diubah menjadi:

public function validate($filePath)
{
    list($imageWidth, $imageHeight, $fileType) = getimagesize($filePath);
    if ($fileType) {
        if ($this->isImageType($fileType)) {
            //replace tmp image with re-sampled copy to exclude images with malicious data
            $image = imagecreatefromstring(file_get_contents($filePath));
            if ($image !== false) {
                $img = imagecreatetruecolor($imageWidth, $imageHeight);
                imagecopyresampled($img, $image, 0, 0, 0, 0, $imageWidth, $imageHeight, $imageWidth, $imageHeight);
                switch ($fileType) {
                    case IMAGETYPE_GIF:
                        imagegif($img, $filePath);
                        break;
                    case IMAGETYPE_JPEG:
                        imagejpeg($img, $filePath, 100);
                        break;
                    case IMAGETYPE_PNG:
                        imagepng($img, $filePath);
                        break;
                    default:
                        return;
                }
                imagedestroy($img);
                imagedestroy($image);
                return null;
            } else {
                throw Mage::exception('Mage_Core', Mage::helper('core')->__('Invalid image.'));
            }
        }
    }
    throw Mage::exception('Mage_Core', Mage::helper('core')->__('Invalid MIME type.'));
}

Masalahnya tampaknya adalah imagecopyresampledpanggilan tanpa pengaturan transparansi terlebih dahulu karena menggabungkan latar belakang hitam default imagecreatetruecolor.

Apa yang saya lakukan adalah pindah imagecopyresampledke pernyataan switch dan menambahkan panggilan transparansi sebelum imagecopysampleddalam kasus png (Anda juga bisa menggunakannya untuk gif).

Jadi sekarang if / switch saya terlihat seperti ini:

if ($image !== false) {
    $img = imagecreatetruecolor($imageWidth, $imageHeight);

    switch ($fileType) {
        case IMAGETYPE_GIF:
            imagecopyresampled($img, $image, 0, 0, 0, 0, $imageWidth, $imageHeight, $imageWidth, $imageHeight);
            imagegif($img, $filePath);
            break;
        case IMAGETYPE_JPEG:
            imagecopyresampled($img, $image, 0, 0, 0, 0, $imageWidth, $imageHeight, $imageWidth, $imageHeight);
            imagejpeg($img, $filePath, 100);
            break;
        case IMAGETYPE_PNG:
            imagecolortransparent($img, imagecolorallocatealpha($img, 0, 0, 0, 127));
            imagealphablending($img, false);
            imagesavealpha($img, true);
            imagecopyresampled($img, $image, 0, 0, 0, 0, $imageWidth, $imageHeight, $imageWidth, $imageHeight);
            imagepng($img, $filePath);
            break;
        default:
            return;
    }
    imagedestroy($img);
    imagedestroy($image);
    return null;
}

Ini menjaga transparansi png saya selama unggahan gambar produk. Jangan tahu apakah ini akan membantu dengan tanda air dan jelas jika Anda menggunakan ini salin file ke folder lokal Anda.

app / code / local / Mage / Core / Model / File / Validator / Image.php

Tim Sullivan
sumber
Bisakah Anda membuka masalah di github.com/OpenMage/magento-lts ?
sv3n
kamu menyelamatkan saya jam! Terima kasih!
Michael Leiss
Btw, setelah menerapkan ini ke Image.php saya, Mengunggah gambar tampaknya terjebak ke "Mengunggah". Selama-lamanya. O__O Adakah yang mengalami masalah yang sama?
jehzlau
Saya telah melihat situs 1.9.2.3 tanpa masalah pengalaman pengunggahan admin SUPEE-8788 patch setelah menambal dengan SUPEE-9767.
Tim Sullivan
1
@TimSullivan Saya mencoba solusi Anda tetapi tidak berhasil untuk saya.
Deepak Mankotia
3

Saya akan mencoba untuk menyimpan gambar lagi (mungkin dengan program lain). Dan jika itu tidak membantu Anda dapat mencoba ini:

app / code / local / Varien / Gambar / Adaptor / Gd2.php dan salin isi /lib/Varien/Image/Adapter/Gd2.php

Perubahan:

$this->_fillBackgroundColor($newImage);

Untuk:

$this->_fillBackgroundColor($newImage, $frameWidth, $frameHeight);

Perubahan:

if (!imagefill($imageResourceTo, 0, 0, $color)) {

Untuk:

if (!imagefilledrectangle($imageResourceTo, 0, 0, $w, $h, $color)) {

Sumber: https://www.gravitywell.co.uk/latest/how-to/posts/fixing-black-magento-adds-to-image-backgrounds/


Sunting: ini telah diperbaiki di Magento 1.9.3.4 / SUPEE-9767 V2

app / code / core / Mage / Core / Model / File / Validator / Image.php

Diubah dari:

if ($image !== false) {
    $img = imagecreatetruecolor($imageWidth, $imageHeight);
    imagecopyresampled($img, $image, 0, 0, 0, 0, $imageWidth, $imageHeight, $imageWidth, $imageHeight);
    switch ($fileType) {
        case IMAGETYPE_GIF:
            imagegif($img, $filePath);
            break;
        case IMAGETYPE_JPEG:
            imagejpeg($img, $filePath, 100);
            break;
        case IMAGETYPE_PNG:
            imagepng($img, $filePath);
            break;
        default:
            return;
    }

Untuk:

if ($image !== false) {
    $img = imagecreatetruecolor($imageWidth, $imageHeight);
    imagealphablending($img, false);
    imagecopyresampled($img, $image, 0, 0, 0, 0, $imageWidth, $imageHeight, $imageWidth, $imageHeight);
    imagesavealpha($img, true);

    switch ($fileType) {
         case IMAGETYPE_GIF:
            $transparencyIndex = imagecolortransparent($image);
            if ($transparencyIndex >= 0) {
                imagecolortransparent($img, $transparencyIndex);
                for ($y = 0; $y < $imageHeight; ++$y) {
                    for ($x = 0; $x < $imageWidth; ++$x) {
                        if (((imagecolorat($img, $x, $y) >> 24) & 0x7F)) {
                            imagesetpixel($img, $x, $y, $transparencyIndex);
                        }
                    }
                }
            }
            if (!imageistruecolor($image)) {
                imagetruecolortopalette($img, false, imagecolorstotal($image));
            }
            imagegif($img, $filePath);
            break;
        case IMAGETYPE_JPEG:
            imagejpeg($img, $filePath, 100);
            break;
        case IMAGETYPE_PNG:
            imagepng($img, $filePath);
            break;
        default:
            break;
    }
sv3n
sumber
Saya mencoba kedua solusi Anda 1 kesalahan melempar variabel yang tidak terdefinisi dan yang kedua tidak berfungsi. Saya menggunakan magento 1.9.3.1
Deepak Mankotia
Sudahkah Anda mencoba menerapkan tambalan SUPEE-9767 V2 terbaru?
sv3n
Saya telah mencoba setelah menerapkan patch SUPEE-9767 V2
Deepak Mankotia
0

Saya telah membuat modul Magento sesuai dengan jawaban Tim Sullivan yang memperbaiki masalah itu:

https://github.com/CopeX/PNGUploadFix

pointiA
sumber
Cobalah untuk memberikan beberapa detail kode di sini alih-alih hanya memposting tautan.
Priyank
@pointiA Saya mencoba modul Anda dan tidak memperbaiki masalah untuk saya
Deepak Mankotia
0

Saya telah membuat file tambalan dengan mudah menginstal pada folder root magento Anda.

URL: Unduh dari sini

Shashikant Singh
sumber
0

Saya menemukan bahwa menyesuaikan file Image.php dan GD2.php seperti yang disarankan dalam jawaban di atas berfungsi, tetapi bagi saya itu berarti bahwa thumbnail JPEG yang tidak sepenuhnya persegi tiba-tiba memiliki latar belakang hitam. Jadi di GD2.php saya berubah

if (!imagefilledrectangle($imageResourceTo, 0, 0, $w, $h, $color)) {
            throw new Exception("Failed to fill image background with color {$r} {$g} {$b}.");
        }

untuk

if($this->_fileType == IMAGETYPE_JPEG){
        if (!imagefill($imageResourceTo, 0, 0, $color)) {
            throw new Exception("Failed to fill image background with color {$r} {$g} {$b}.");
        }
    } else {
        if (!imagefilledrectangle($imageResourceTo, 0, 0, $w, $h, $color)) {
            throw new Exception("Failed to fill image background with color {$r} {$g} {$b}.");
        }
    }

untuk menjaga situasi lama untuk JPEG.

Ogier Schelvis
sumber