La filigrana diventa nera quando è trasparente


23

Ho installato PATCH SUPEE 9767 sul mio negozio magento 1.9.2.4.

Ora ho caricato una nuova filigrana ma lo sfondo diventa nero.

È un problema dal nuovo aggiornamento? In un'altra installazione di Magento 1.9.2.4 in cui l'aggiornamento non è installato, lo sfondo è ancora trasparente.

Risposte:


29

Ho avuto lo stesso problema dopo aver patchato 1.9.2.2 e 1.9.2.3. SUPEE-9767 aggiunge un metodo di convalida esteso in

app / code / core / Mage / core / Modello / File / Validator / image.php

Il mio era:

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.'));
}

E cambiato in:

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.'));
}

Il problema sembra essere la imagecopyresampledchiamata senza prima impostare la trasparenza poiché unisce lo sfondo nero predefinito imagecreatetruecolor.

Quello che ho fatto è stato imagecopyresampledpassare all'istruzione switch e aggiungere le chiamate di trasparenza prima imagecopysamplednel caso png (puoi anche usarlo per gif).

Quindi ora il mio if / switch è simile al seguente:

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;
}

Ciò ha mantenuto la mia trasparenza png durante i caricamenti delle immagini dei prodotti. Non so se questo aiuterà con la filigrana e ovviamente se lo usi copia il file nella tua cartella locale.

app / code / local / Mage / core / Modello / File / Validator / image.php


Potete per favore aprire un problema su github.com/OpenMage/magento-lts ?
sv3n

mi hai risparmiato ore! grazie!
Michael Leiss,

A proposito, dopo averlo applicato al mio Image.php, il caricamento dell'immagine sembra bloccato su "Caricamento". Per sempre. O__O Qualcuno ha riscontrato lo stesso problema?
jehzlau,

Ho visto un sito 1.9.2.3 senza l'esperienza della patch SUPEE-8788 con problemi di caricamento dell'amministratore dopo aver patchato con SUPEE-9767.
Tim Sullivan,

1
@TimSullivan Ho provato la tua soluzione ma non ha funzionato per me.
Deepak Mankotia,

3

Proverei a salvare di nuovo l'immagine (magari con un altro programma). E se non aiuta puoi provare questo:

app / code / local / Varien / Image / Adapter / Gd2.php e copia il contenuto di /lib/Varien/Image/Adapter/Gd2.php

Modificare:

$this->_fillBackgroundColor($newImage);

A:

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

Modificare:

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

A:

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

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


Modifica: risolto in Magento 1.9.3.4 / SUPEE-9767 V2

app / code / core / Mage / core / Modello / File / Validator / image.php

Modificato da:

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;
    }

A:

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;
    }

Ho provato sia la tua soluzione 1 ° errore di lancio di variabile non definita e il secondo non funziona. Sto usando Magento 1.9.3.1
Deepak Mankotia il

Hai provato ad applicare l'ultima patch SUPEE-9767 V2 completa?
sv3n

Ho provato dopo aver applicato la patch SUPEE-9767 V2
Deepak Mankotia il



0

Ho scoperto che la regolazione dei file Image.php e GD2.php come suggerito nelle risposte precedenti funziona, ma per me significava che le miniature JPEG che non erano completamente quadrate improvvisamente avevano sfondi neri. Quindi in GD2.php ho cambiato

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

a

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}.");
        }
    }

al fine di mantenere la vecchia situazione per JPEG.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.