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.

Mike
fonte

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

Tim Sullivan
fonte
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;
    }
sv3n
fonte
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

Eu criei um módulo Magento de acordo com a resposta de Tim Sullivan que corrige esse problema:

https://github.com/CopeX/PNGUploadFix

pointiA
fonte
Tente fornecer alguns detalhes do código aqui, em vez de apenas postar um link.
Priyank
@pointiA Tentei seu módulo e não corrigir o problema para mim
Deepak Mankotia
0

Eu criei um arquivo de patch para instalar facilmente na sua pasta raiz do magento.

URL: Baixe aqui

Shashikant Singh
fonte
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.

Ogier Schelvis
fonte