透かしが透明なときに背景が黒くなる


23

magento 1.9.2.4ショップにPATCH SUPEE 9767をインストールしました。

新しい透かしをアップロードしましたが、背景が黒に変わります。

これは新しいアップデート以降の問題ですか?更新がインストールされていない他のmagento 1.9.2.4インストールでは、バックグラウンドはまだ透明です。

回答:


29

1.9.2.2および1.9.2.3にパッチを適用した後、同じ問題が発生しました。SUPEE-9767は、拡張検証メソッドを追加します

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

私は:

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

変更後:

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

問題は、imagecopyresampledからデフォルトの黒の背景をマージするため、最初に透明度を設定しない呼び出しであるようですimagecreatetruecolor

私がしたことimagecopyresampledは、switchステートメントに移動し、imagecopysampledpngケースの前に透過呼び出しを追加することでした(gifにも使用できます)。

だから今私のif /スイッチは次のようになります:

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

これにより、製品画像のアップロード中にpngが透明になりました。これが透かしに役立つかどうか、そしてこれを使用する場合は明らかにファイルをローカルフォルダーにコピーするかどうかはわかりません。

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


github.com/OpenMage/magento-ltsで問題を開いてください。
sv3n

あなたは私の時間を節約しました!THX!
マイケルリース

ところで、これをImage.phpに適用した後、画像のアップロードが「アップロード」に固執しているようです。永遠に。O__O同じ問題が発生しましたか?
jehzlau

SUPEE-8767パッチエクスペリエンスのない1.9.2.3サイトで、SUPEE-9767でパッチを適用した後、管理アップロードの問題が発生しました。
ティムサリバン

1
@TimSullivanあなたのソリューションを試しましたが、うまくいきませんでした。
ディーパックマンコティア

3

画像を再度保存しようとします(別のプログラムを使用する場合があります)。そして、それが助けにならないなら、あなたはこれを試すことができます:

app / code / local / Varien / Image / Adapter / Gd2.phpおよび/lib/Varien/Image/Adapter/Gd2.phpの内容をコピーします

変化する:

$this->_fillBackgroundColor($newImage);

に:

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

変化する:

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

に:

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

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


編集:これはMagento 1.9.3.4 / SUPEE-9767 V2で修正されました

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

変更後:

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

に:

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

私はあなたの両方の解決策を試しました1つ目は未定義変数のエラーを投げ、2つ目は動作していません。私は、Magentoの1.9.3.1使用しています
ディーパックMankotia

完全な最新パッチSUPEE-9767 V2を適用しようとしましたか?
sv3n

私はSUPEE-9767 V2パッチを適用した後に試してみました
ディーパックMankotiaを

0

その問題を修正するティムサリバンの答えに従って、Magentoモジュールを作成しました。

https://github.com/CopeX/PNGUploadFix


リンクを投稿するのではなく、ここでコードの詳細を提供してください。
-Priyank

@pointiA私はあなたのモジュールを試してみましたが、私のために問題を修正しませんでした
Deepak Mankotia


0

上記の回答で示唆されているようにImage.phpとGD2.phpのファイルを調整すると動作することがわかりましたが、私にとっては、完全に正方形ではないJPEGサムネイルが突然黒い背景になったことを意味しました。GD2.phpで変更しました

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

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

JPEGの古い状況を維持するため。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.