PHP GD ปรับขนาดภาพโปร่งใสให้ขอบสีดำ

ฉันกำลังพยายามลดขนาดรูปภาพโปร่งใสบางส่วนใน PHP ด้วย GD และทุกครั้งที่ฉันทำ ก็จะมีเส้นขอบสีดำแปลกๆ เพิ่มเข้ามารอบๆ รูปภาพ

ก่อน before

หลัง ป้อนคำอธิบายรูปภาพที่นี่

รหัส

<?php
    $image = imagecreatefromstring(file_get_contents('logo.png'));
    $width = imagesx($image);
    $height = imagesy($image);

    $newWidth = $width - 1;
    $newHeight = $height - 1;
    $output = imagecreatetruecolor($newWidth, $newHeight);
    imagecolortransparent($output, imagecolorallocatealpha($output, 0, 0, 0, 127));
    imagealphablending($output, false);
    imagesavealpha($output, true);
    imagecopyresampled($output, $image, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height);

    header('Content-Type: image/png');
    imagepng($output);
?>

ดูเหมือนว่าถ้าฉันเปลี่ยนโค้ดสำหรับมิติใหม่ให้เหมือนกับอันเก่า (ลบ - 1 ออก) จะไม่มีเส้นขอบสีดำปรากฏขึ้น ดังนั้นการปรับขนาดจึงทำให้เกิดปัญหา

ไม่มีใครมีความคิดว่าสิ่งที่อาจจะผิด?

แก้ไข: ฉันเพิ่งรู้ว่ามันเกิดขึ้นกับ imagecopyresampled เท่านั้น และไม่ใช่ imagecopyresized อย่างไรก็ตาม imagecopyresampled ให้เอฟเฟ็กต์ภาพที่ดีกว่ามากและฉันต้องการทำให้มันใช้งานได้ถ้าเป็นไปได้


person Alex Turpin    schedule 15.11.2011    source แหล่งที่มา
comment
ดูเหมือนว่าการต่อต้านนามแฝงจะใช้สีดำเป็นสีด้าน   -  person Brad    schedule 15.11.2011
comment
@Brad มันเป็นเช่นนั้นจริงๆ อย่างไรก็ตาม หน้าเอกสารระบุว่าการป้องกันนามแฝงจะปิดอยู่ตามค่าเริ่มต้น และจะมาพร้อมกับ GD เวอร์ชันรวมเท่านั้น ซึ่งฉันไม่ได้ใช้ อาจมีฟังก์ชันอื่นที่เป็นสาเหตุ แต่ฉันไม่เห็นพารามิเตอร์อื่นใดเท่าที่ฉันสามารถบอกได้...   -  person Alex Turpin    schedule 15.11.2011
comment
ฉันเพิ่งรู้ว่ามันเกิดขึ้นกับ imagecopyresampled เท่านั้น ไม่ใช่ imagecopyresized. อย่างไรก็ตาม imagecopyresampled ให้เอฟเฟ็กต์ภาพที่ดีกว่ามากและฉันต้องการทำให้มันใช้งานได้ถ้าเป็นไปได้   -  person Alex Turpin    schedule 15.11.2011
comment
@ Xeon06 หากคุณพบวิธีแก้ปัญหาโปรดบอกฉันด้วย   -  person Ali Nouman    schedule 15.11.2011


คำตอบ (1)


ฉันคิดว่าปัญหาที่นี่คืออิมเมจต้นฉบับของคุณ

สิ่งที่คุณมีไม่ใช่ PNG สีจริงพร้อมช่องอัลฟ่า แต่เป็น PNG สีที่มีการจัดทำดัชนีซึ่งมีสีโปร่งใส สิ่งนี้จะปรากฏชัดเจนหากคุณเปิดภาพใน Photoshop:

รูปภาพตามที่เห็นใน Photoshop

รูปภาพนี้ถูกสร้างขึ้นด้วยการลดรอยหยักอยู่แล้ว (ซึ่งให้ข้อความสีเหลืองตามเส้นขอบสีขาวที่เห็นที่นี่) แต่เมื่อคุณปรับขนาดใหม่ การคำนวณพิกเซลย่อยอาจออกนอกขอบเขตเล็กน้อย

ฉันสงสัยว่าถ้าคุณแก้ไขภาพโดยทำให้เป็น RGB เต็มรูปแบบพร้อมช่องอัลฟ่า คุณจะไม่มีปัญหานี้

person Brad    schedule 15.11.2011
comment
ขอบคุณสำหรับคำตอบ. คุณจะรู้วิธีใด ๆ ที่จะทำให้มันทำงานโดยทางโปรแกรมหรือเลิกทำได้? - person Alex Turpin; 15.11.2011
comment
สิ่งที่ดีที่สุดที่ควรทำคือการได้อิมเมจต้นฉบับที่ดี นี่เป็นเรื่องง่ายที่จะแก้ไขสำหรับคุณใน Photoshop ส่งอีเมลถึงฉันที่ [email protected] แล้วฉันจะส่งไฟล์ที่อัปเดตไปให้คุณ - person Brad; 16.11.2011
comment
ขอบคุณมากสำหรับความช่วยเหลือของคุณ ปัญหาคือลูกค้าของเราทำสิ่งนี้บนเว็บอินเตอร์เฟส ฉันคิดว่าพวกเขาจะต้องทำ ขอบคุณอีกครั้ง. - person Alex Turpin; 16.11.2011
comment
@ Xeon06 บางทีคุณอาจยอมรับได้เฉพาะภาพสีจริงเท่านั้น? หรืออาจมีวิธีแปลงรูปภาพนี้เป็นรูปภาพ RGB แบบเต็มที่ไม่ได้จัดทำดัชนีก่อนที่จะปรับขนาด - person Brad; 16.11.2011
comment
นั่นคือสิ่งที่ฉันสงสัย ไม่ว่าจะมีวิธีแปลงมันไว้ล่วงหน้าหรือไม่ - person Alex Turpin; 16.11.2011
comment
@ Xeon06 จะเป็นอย่างไรถ้าคุณทำ imagecreatefrompng() จากนั้น imagesavealpha() และทันที imagepng() ไม่มีการปรับขนาด แค่เปิด ตั้งค่าการบันทึกอัลฟ่า แล้วส่งออกใช่ไหม หากคุณนำผลลัพธ์นั้นมาปรับขนาด คุณจะพบปัญหาเดียวกันหรือไม่ จะเป็นอย่างไรหากคุณลอง imagesavealpha() บนอิมเมจต้นฉบับก่อน - person Brad; 16.11.2011
comment
ในทั้งสองกรณีฉันได้รับปัญหาเดียวกัน - person Alex Turpin; 16.11.2011
comment
@ Xeon06 ในกรณีนั้น ฉันสงสัยว่ารูปภาพจะต้องอยู่ในรูปแบบที่ถูกต้องล่วงหน้า คุณอาจใช้สคริปต์ Gimp ได้ แต่ฉันก็แค่ตรวจสอบรูปภาพที่มีสีจริงตั้งแต่แรก และอย่ายอมรับไฟล์ที่มีลักษณะแปลก ๆ แบบนี้ - person Brad; 16.11.2011