ลายน้ำรับพื้นหลังสีดำเมื่อโปร่งใส


23

ฉันได้ติดตั้ง PATCH SUPEE 9767 ในร้านค้าคุณภาพเยี่ยม 1.9.2.4

ตอนนี้ฉันได้อัปโหลดลายน้ำใหม่แล้ว แต่พื้นหลังเปลี่ยนเป็นสีดำ

นี่เป็นปัญหาตั้งแต่การอัพเดทใหม่หรือไม่? ในการติดตั้ง magento 1.9.2.4 อื่น ๆ ที่ไม่ได้ติดตั้งการอัปเดตมีพื้นหลังยังคงโปร่งใส

คำตอบ:


29

ฉันมีปัญหาเดียวกันหลังจากทำการปะ 1.9.2.2 และ 1.9.2.3 SUPEE-9767 เพิ่มวิธีการตรวจสอบความถูกต้องเพิ่มเติมใน

app / รหัส / core / Mage / core / รุ่น / ไฟล์ / ตรวจสอบ / 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.'));
}

ปัญหาที่เกิดขึ้นน่าจะเป็นโทรโดยไม่ต้องตั้งความโปร่งใสเป็นครั้งแรกที่มันผสานพื้นหลังสีดำเริ่มต้นจากimagecopyresampledimagecreatetruecolor

สิ่งที่ฉันทำก็คือย้ายimagecopyresampledไปที่คำสั่ง switch และเพิ่มการโทรแบบโปร่งใสก่อนimagecopysampledในกรณี png (คุณสามารถใช้มันสำหรับ gif ได้)

ดังนั้นตอนนี้ถ้า / สวิตช์ของฉันมีลักษณะดังนี้:

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 / รหัส / ท้องถิ่น / Mage / core / รุ่น / ไฟล์ / ตรวจสอบ / Image.php


คุณช่วยกรุณาเปิดปัญหาได้ที่github.com/OpenMage/magento-lts ?
sv3n

คุณช่วยฉันชั่วโมง! ขอบคุณ!
Michael Leiss

Btw หลังจากใช้สิ่งนี้กับ Image.php ของฉันการอัปโหลดภาพดูเหมือนจะติดอยู่กับ "กำลังอัปโหลด" ตลอดไป O__O ทุกคนประสบปัญหาเดียวกันหรือไม่
jehzlau

ฉันเคยเห็นไซต์ 1.9.2.3 ที่ไม่มีประสบการณ์การแก้ไขของ SUPEE-8788 ผู้ดูแลระบบอัปโหลดปัญหาหลังจากทำการปะแก้ด้วย SUPEE-9767
ทิมซัลลิแวน

1
@TimSullivan ฉันลองวิธีการแก้ปัญหาของคุณ แต่ไม่ได้ผลสำหรับฉัน
Deepak Mankotia

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 / รหัส / core / Mage / core / รุ่น / ไฟล์ / ตรวจสอบ / 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 ข้อผิดพลาดการขว้างปาหนึ่งของตัวแปรที่ไม่ได้กำหนด ฉันใช้ magento 1.9.3.1
Deepak Mankotia

คุณได้ลองใช้แพตช์ล่าสุดเต็มรูปแบบ SUPEE-9767 V2 หรือไม่?
sv3n

ฉันได้ลองหลังจากใช้ SUPEE-9767 V2 patch แล้ว
Deepak Mankotia

0

ฉันได้สร้างโมดูล Magento ตามคำตอบของ Tim Sullivan ที่แก้ไขปัญหานั้น:

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.