Hình mờ có nền đen khi trong suốt


23

Tôi đã cài đặt PATCH SUPEE 9767 trên cửa hàng magento 1.9.2.4 của mình.

Bây giờ tôi đã tải lên một Watermark mới nhưng nền thay đổi thành màu đen.

Đây có phải là một vấn đề kể từ khi cập nhật mới? Trên bản cài đặt magento 1.9.2.4 khác, nơi bản cập nhật không được cài đặt, nền vẫn còn trong suốt.

Câu trả lời:


29

Tôi gặp vấn đề tương tự sau khi vá 1.9.2.2 và 1.9.2.3. SUPEE-9767 thêm một phương thức xác nhận mở rộng trong

ứng dụng / mã / lõi / Mage / Core / Model / File / Trình xác thực / Image.php

Tôi đã:

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

Và đổi thành:

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

Vấn đề dường như là imagecopyresampledcuộc gọi mà không đặt độ trong suốt trước vì nó hợp nhất nền đen mặc định từ đó imagecreatetruecolor.

Những gì tôi đã làm là chuyển imagecopyresampledvào câu lệnh switch và thêm các cuộc gọi trong suốt trước đó imagecopysampledtrong trường hợp png (bạn cũng có thể sử dụng nó cho gif).

Vì vậy, bây giờ if / switch của tôi trông như thế này:

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

Điều này giữ cho sự minh bạch png của tôi trong quá trình tải lên hình ảnh sản phẩm. Không biết nếu điều này sẽ giúp với watermark và rõ ràng nếu bạn sử dụng bản sao này vào thư mục địa phương của bạn.

ứng dụng / mã / cục bộ / Mage / Core / Model / File / Trình xác thực / Image.php


Bạn có thể vui lòng mở một vấn đề tại github.com/OpenMage/magento-lts không?
sv3n

bạn đã tiết kiệm cho tôi hàng giờ! cám ơn!
Michael Leiss

Btw, sau khi áp dụng điều này cho Image.php của tôi, Tải lên hình ảnh dường như bị kẹt với "Tải lên". Mãi mãi. O__O Có ai gặp phải vấn đề tương tự không?
jehzlau

Tôi đã thấy một trang web 1.9.2.3 không có sự cố tải lên của quản trị viên trải nghiệm bản vá SUPEE-8788 sau khi vá với SUPEE-9767.
Tim Sullivan

1
@TimSullivan Tôi đã thử giải pháp của bạn nhưng không hiệu quả với tôi.
Deepak Mankotia

3

Tôi sẽ cố gắng lưu lại hình ảnh (có thể với một chương trình khác). Và nếu nó không giúp bạn có thể thử điều này:

ứng dụng / mã / cục bộ / Varien / Image / Adaptor / Gd2.php và sao chép nội dung của /lib/Varien/Image/Ad Module / Gd2.php

Thay đổi:

$this->_fillBackgroundColor($newImage);

Đến:

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

Thay đổi:

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

Đến:

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

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


Chỉnh sửa: điều này đã được sửa trong Magento 1.9.3.4 / SUPEE-9767 V2

ứng dụng / mã / lõi / Mage / Core / Model / File / Trình xác thực / Image.php

Thay đổi từ:

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

Đến:

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

Tôi đã thử cả hai cách giải quyết lỗi ném thứ nhất của bạn và biến thứ hai không hoạt động. Tôi đang sử dụng magento 1.9.3.1
Deepak Mankotia

Bạn đã thử áp dụng bản vá đầy đủ mới nhất SUPEE-9767 V2 chưa?
sv3n

Tôi đã thử sau khi áp dụng bản vá SUPEE-9767 V2
Deepak Mankotia

0

Tôi đã tạo một mô-đun Magento theo câu trả lời của Tim Sullivan để khắc phục vấn đề đó:

https://github.com/CopeX/PNGUploadFix


Cố gắng cung cấp một số chi tiết mã ở đây thay vì chỉ đăng một liên kết.
Priyank

@pointiA Tôi đã thử mô-đun của bạn và không khắc phục sự cố cho tôi
Deepak Mankotia


0

Tôi thấy rằng việc điều chỉnh các tệp Image.php và GD2.php như được đề xuất trong các câu trả lời ở trên có hiệu quả, nhưng đối với tôi, điều đó có nghĩa là hình thu nhỏ JPEG không hoàn toàn vuông đột nhiên có nền đen. Vì vậy, trong GD2.php tôi đã thay đổi

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

đến

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

để giữ tình trạng cũ cho JPEG.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.