ฉันได้ติดตั้ง PATCH SUPEE 9767 ในร้านค้าคุณภาพเยี่ยม 1.9.2.4
ตอนนี้ฉันได้อัปโหลดลายน้ำใหม่แล้ว แต่พื้นหลังเปลี่ยนเป็นสีดำ
นี่เป็นปัญหาตั้งแต่การอัพเดทใหม่หรือไม่? ในการติดตั้ง magento 1.9.2.4 อื่น ๆ ที่ไม่ได้ติดตั้งการอัปเดตมีพื้นหลังยังคงโปร่งใส
ฉันได้ติดตั้ง PATCH SUPEE 9767 ในร้านค้าคุณภาพเยี่ยม 1.9.2.4
ตอนนี้ฉันได้อัปโหลดลายน้ำใหม่แล้ว แต่พื้นหลังเปลี่ยนเป็นสีดำ
นี่เป็นปัญหาตั้งแต่การอัพเดทใหม่หรือไม่? ในการติดตั้ง magento 1.9.2.4 อื่น ๆ ที่ไม่ได้ติดตั้งการอัปเดตมีพื้นหลังยังคงโปร่งใส
คำตอบ:
ฉันมีปัญหาเดียวกันหลังจากทำการปะ 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.'));
}
ปัญหาที่เกิดขึ้นน่าจะเป็นโทรโดยไม่ต้องตั้งความโปร่งใสเป็นครั้งแรกที่มันผสานพื้นหลังสีดำเริ่มต้นจากimagecopyresampled
imagecreatetruecolor
สิ่งที่ฉันทำก็คือย้าย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
ฉันพยายามบันทึกภาพอีกครั้ง (อาจเป็นกับโปรแกรมอื่น) และถ้ามันไม่ช่วยคุณลองได้:
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;
}
ฉันได้สร้างโมดูล Magento ตามคำตอบของ Tim Sullivan ที่แก้ไขปัญหานั้น:
ฉันได้สร้างไฟล์ปะแก้ติดตั้งได้ง่ายในโฟลเดอร์ root ของวีโอไอพี
URL: ดาวน์โหลดจากที่นี่
ฉันพบว่าการปรับไฟล์ 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