A marca d'água obtém um fundo preto quando transparente


23

Instalei o PATCH SUPEE 9767 na minha loja magento 1.9.2.4.

Agora, enviei uma nova marca d'água, mas o fundo muda para preto.

Isso é um problema desde a nova atualização? Em outra instalação do magento 1.9.2.4 onde a atualização não está instalada, o fundo ainda é transparente.

Respostas:


29

Eu tive o mesmo problema depois de aplicar o patch 1.9.2.2 e 1.9.2.3. SUPEE-9767 adiciona um método de validação estendido em

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

O meu 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 alterado para:

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

O problema parece ser a imagecopyresampledchamada sem definir primeiro a transparência, pois mescla o plano de fundo preto padrão imagecreatetruecolor.

O que fiz foi passar imagecopyresampledpara a instrução switch e adicionar as chamadas de transparência anteriormente imagecopysampledno caso png (você também pode usá-lo para gif).

Então agora meu if / switch fica assim:

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

Isso manteve minha transparência png durante o upload de imagens do produto. Não sei se isso ajudará na marca d'água e, obviamente, se você usar essa cópia, copie o arquivo para a pasta local.

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


Você pode abrir um problema em github.com/OpenMage/magento-lts ?
precisa

você me salvou horas! THX!
Michael Leiss

Btw, depois de aplicar isso ao meu Image.php, o Upload da imagem parece estar preso ao "Upload". Para sempre. O__O Alguém encontrou o mesmo problema?
21817 jehzlau

Eu vi um site 1.9.2.3 sem a experiência do patch SUPEE-8788, com problemas de upload de administrador após o patch com o SUPEE-9767.
Tim Sullivan

1
@ TimSullivan Tentei sua solução, mas não funcionou para mim.
Deepak Mankotia

3

Eu tentaria salvar a imagem novamente (talvez com outro programa). E se isso não ajudar, você pode tentar o seguinte:

app / code / local / Varien / Image / Adapter / Gd2.php e copie o conteúdo de /lib/Varien/Image/Adapter/Gd2.php

Mudança:

$this->_fillBackgroundColor($newImage);

Para:

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

Mudança:

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

Para:

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/


Edit: isso foi corrigido no Magento 1.9.3.4 / SUPEE-9767 V2

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

Alterado de:

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

Para:

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

Eu tentei sua solução tanto primeiro um jogando erro de variável indefinida e segundo não está funcionando. Estou usando o magento 1.9.3.1
Deepak Mankotia

Você tentou aplicar o patch mais recente completo SUPEE-9767 V2?
sv3n

Eu tentei após a aplicação SUPEE-9767 patch de V2
Deepak Mankotia



0

Descobri que o ajuste dos arquivos Image.php e GD2.php, conforme sugerido nas respostas acima, funciona, mas para mim isso significava que as miniaturas JPEG que não eram completamente quadradas repentinamente tinham fundos pretos. Então, no GD2.php eu mudei

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

para

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

para manter a situação antiga dos JPEGs.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.