ตั้งค่าพื้นหลังโปร่งใสโดยใช้ ImageMagick และ commandline prompt


120

สมมติว่าคุณมีรูปภาพใด ๆ (PNG หรือ JPG) ภาพนี้มีพื้นหลังสีขาวและฉันต้องทำให้พื้นหลังนี้โปร่งใส

ฉันได้ลองใช้ตัวอย่างเหล่านี้แล้ว:

  • convert original.png -background none transparent.png
  • convert original.png -background white -flatten -alpha off transparent.png

แต่ไม่มีผลลัพธ์ที่พึงปรารถนา

ฉันจะทำมันได้อย่างไร?

สำคัญ: การใช้convertบรรทัดคำสั่ง


แปลก - ฉันคิดว่าคำสั่งที่เกี่ยวข้องเป็นconvert original.png -transparent white new.pngแต่เมื่อลองแล้วไม่สามารถใช้งานได้ นอกจากนี้คุณแน่ใจหรือไม่ว่าพื้นหลังของคุณเป็นสีขาว (#FFFFFF) หรือเกือบจะเป็นสีขาว (เช่น #FEFEFE)
mathematical.coffee

@ mathematical.coffee ตกลงฉันเข้าใจให้ฉันตรวจสอบว่าไม่ใช่กรณีนี้หรือไม่และฉันจะดำเนินการต่อในหัวข้อนี้ ขอบคุณ.
อิสราเอล

@ mathematical.coffee สวัสดีอีกครั้งฉันได้ตรวจสอบสีและภาพนี้มีพื้นหลังเป็น #FFFFFF หรืออีกนัยหนึ่งคือ "สีขาว" :( นี่ไม่ใช่กรณี!
อิสราเอล

คำตอบ:


140

ฉันใช้ ImageMagick 6.6.9-7 บน Ubuntu 12.04
สิ่งที่ได้ผลสำหรับฉันมีดังต่อไปนี้:

convert test.png -transparent white transparent.png

นั่นเปลี่ยนสีขาวทั้งหมดใน test.png เป็นโปร่งใส


6
สิ่งนี้ไม่ได้ผลสำหรับฉันจนกว่าฉันจะรู้ว่า JPG จะไม่โปร่งใส พอเปลี่ยนมาใช้ PNG มันก็ทำได้ตามที่ต้องการเพียงแค่เปลี่ยน "white" เป็น "rgb ($ r, $ g, $ b)"
Roger Dueck

2
Goddamnit! มันเยี่ยมมาก!
agilob

2
สิ่งนี้จะไม่เพียง แต่แปลงพื้นหลังให้เป็นแบบโปร่งใส แต่ทุกพิกเซลสีขาว มีวิธีแปลงพื้นหลังเป็นแบบโปร่งใสหรือไม่?
Alejandro Lozdziejski

2
@AlejandroLozdziejski - คุณกำหนด "พื้นหลัง" อย่างไร?
Jules

1
@AlejandroLozdziejski: เป็นคำถามที่ดี โปรดดูวิธีแก้ปัญหาของฉันซึ่งใช้การเติมน้ำท่วมจากขอบโดยมองหาสีที่ใกล้เคียงกับพิกเซลด้านซ้ายบน
hackerb9

79

ผมมีปัญหาเหมือนกัน. ซึ่งฉันต้องลบพื้นหลังสีขาวออกจากรูปแบบภาพ jpg / png โดยใช้ ImageMagick

สิ่งที่ได้ผลสำหรับฉันคือ:

1) แปลงรูปแบบภาพเป็น png: convert input.jpg input.png

2) convert input.png -fuzz 2% -transparent white output.png


6
นี่เป็นสิ่งที่ดีที่จะมีขอบที่เรียบขึ้นระหว่างพื้นหลังโปร่งใสและพื้นหน้าทึบแสง หากคุณแปลงไอคอนที่มีเสียงดังใน JPG เป็น PNG และต้องการเพิ่มความโปร่งใสคุณสามารถเพิ่มการกรองค่ามัธยฐานได้ด้วย:mogrify -format png -median 2 -fuzz 5% -transparent white ico_*.jpg
Tomasz Gandor

44

สารละลาย

color=$( convert filename.png -format "%[pixel:p{0,0}]" info:- )
convert filename.png -alpha off -bordercolor $color -border 1 \
    \( +clone -fuzz 30% -fill none -floodfill +0+0 $color \
       -alpha extract -geometry 200% -blur 0x0.5 \
       -morphology erode square:1 -geometry 50% \) \
    -compose CopyOpacity -composite -shave 1 outputfilename.png

คำอธิบาย

สิ่งนี้ค่อนข้างยาวกว่าคำตอบง่ายๆที่ให้ไว้ก่อนหน้านี้เล็กน้อย แต่ให้ผลลัพธ์ที่ดีกว่ามาก : (1) คุณภาพดีกว่าเนื่องจากแอลฟาลบรอยหยักและ (2) เฉพาะพื้นหลังเท่านั้นที่จะถูกลบออกเมื่อเทียบกับสีเดียว ("พื้นหลัง" ถูกกำหนดให้มีสีเดียวกับพิกเซลด้านซ้ายบนโดยใช้การเติมน้ำท่วมจากขอบภาพ)

นอกจากนี้ช่องอัลฟายังถูกกัดเซาะครึ่งพิกเซลเพื่อหลีกเลี่ยงรัศมี แน่นอนว่าการดำเนินการทางสัณฐานวิทยาของ ImageMagick ยังไม่ทำงานในระดับพิกเซลย่อยดังนั้นคุณจะเห็นว่าฉันกำลังขยายช่องอัลฟาเป็น 200% ก่อนที่จะสึกกร่อน

การเปรียบเทียบผลลัพธ์

นี่คือการเปรียบเทียบวิธีการที่เรียบง่าย ( "-fuzz 2% โปร่งใสสีขาว") เมื่อเทียบกับวิธีการแก้ปัญหาของฉันเมื่อทำงานบน โลโก้ ImageMagick ฉันได้แบนภาพโปร่งใสทั้งสองลงบนพื้นหลังสีน้ำตาลอานม้าเพื่อให้เห็นความแตกต่าง (คลิกเพื่อดูต้นฉบับ)

การเปลี่ยนสีขาวให้เป็นสีโปร่งใสไม่ได้ผลเสมอไป ช่องอัลฟาและช่องเติมน้ำท่วมดูดีกว่ามาก

สังเกตว่าเคราของพ่อมดหายไปได้อย่างไรด้วยวิธีง่ายๆ เปรียบเทียบขอบของ Wizard เพื่อดูว่าอัลฟ่าที่ลดรอยหยักช่วยให้ภาพกลมกลืนกับพื้นหลังได้อย่างไร

แน่นอนฉันยอมรับอย่างสมบูรณ์ว่ามีหลายครั้งที่คุณอาจต้องการใช้โซลูชันที่ง่ายกว่านี้ (ตัวอย่างเช่นการจำง่ายกว่ามากและถ้าคุณแปลงเป็น GIF คุณจะ จำกัด อัลฟ่า 1 บิตอย่างไรก็ตาม)

mktrans เชลล์สคริปต์

เนื่องจากไม่น่าจะเป็นไปได้ที่คุณจะต้องการพิมพ์คำสั่งนี้ซ้ำ ๆ ฉันขอแนะนำให้รวมไว้ในสคริปต์ คุณสามารถดาวน์โหลด BASH shell script จาก githubซึ่งดำเนินการตามคำแนะนำของฉัน สามารถเรียกใช้กับไฟล์หลายไฟล์ในไดเร็กทอรีและมีความคิดเห็นที่เป็นประโยชน์ในกรณีที่คุณต้องการปรับแต่งสิ่งต่างๆ

สคริปต์ bg_removal

อย่างไรก็ตาม ImageMagick มาพร้อมกับสคริปต์ที่เรียกว่า "bg_removal" ซึ่งใช้การเติมน้ำท่วมในลักษณะที่คล้ายกันกับโซลูชันของฉัน อย่างไรก็ตามผลลัพธ์ไม่ดีนักเนื่องจากยังคงใช้อัลฟ่า 1 บิต นอกจากนี้สคริปต์ bg_removal ยังทำงานช้ากว่าและใช้งานยากกว่าเล็กน้อย (คุณต้องระบุค่า fuzz สองค่าที่แตกต่างกัน) นี่คือตัวอย่างของผลลัพธ์จาก bg_removal

สคริปต์ bg_removal: มีเครา แต่ไม่มีการลดรอยหยัก


2
ฉันจำเป็นต้องแก้ไขฟัซซ์เป็น 2% เนื่องจากรูปภาพมีเครื่องสีขาวที่มีพื้นหลังสีขาว และแม้ว่านี่จะไม่สมบูรณ์แบบ 100% แต่ก็เป็นทางออกที่ดีที่สุดที่ฉันพบเพราะฉันไม่ต้องการทำแบบแมนนวลgimpหรืออะไรก็ตาม :)
tukusejssirs

1
ทางออกที่ยอดเยี่ยม !
0x01 ชม.

29

สิ่งนี้ใช้ได้กับฉัน:

convert original.png -fuzz 10% -transparent white transparent.png

โดยที่% ฟัซซ์ยิ่งเล็กลงใกล้กับสีขาวจริงมากขึ้นหรือในทางกลับกัน% ยิ่งมีขนาดใหญ่การเปลี่ยนแปลงจากสีขาวก็จะกลายเป็นโปร่งใสมากขึ้นเท่านั้น


1
ว้าว! นี่คือสิ่งที่ฉันต้องการ! before: i.imgur.com/2Rd7w1N.pngหลัง: i.imgur.com/4RTYygo.png
Dorian

มันทำงานได้ไม่สมบูรณ์เนื่องจากไม่สามารถจัดการกับภาพที่มีสีขาวและพื้นหลังสีขาวได้ ชอบรูปถ่ายคนดี
หัวหน้าทีมโปรแกรมเมอร์ซีเนียร์ PHP

สำหรับสีขาวบนสีขาวลองใช้วิธีการแก้ปัญหาน้ำท่วมเติมผมโพสต์ดังกล่าวข้างต้น หรือใช้mktransเชลล์สคริปต์ของฉัน: github.com/hackerb9/mktrans
hackerb9

12

คุณสามารถใช้สิ่งนี้เพื่อทำให้พื้นหลังโปร่งใส

convert test.png -background rgba(0,0,0,0) test1.png

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


4
เปลือกอาจต้องการการอ้างถึง(): convert more-icon.png -gravity center -background 'rgba(0,0,0,0)' -extent 27x27 new-more-icon.png
Jim K.

7

การใช้ ImageMagick สิ่งนี้คล้ายกับรหัสและผลลัพธ์ของแฮ็กเกอร์b9มาก แต่เป็นบรรทัดคำสั่งที่ง่ายกว่าเล็กน้อย สมมติว่าพิกเซลด้านซ้ายบนเป็นสีพื้นหลัง ฉันแค่ทำให้พื้นหลังเต็มไปด้วยความโปร่งใสจากนั้นเลือกช่องอัลฟาและเบลอและลบครึ่งหนึ่งของพื้นที่เบลอโดยใช้ -level 50x100% จากนั้นเปิดช่องทั้งหมดอีกครั้งแล้วประกบกับสีน้ำตาล -blur 0x1 -level 50x100% ทำหน้าที่ในการต่อต้านขอบเขตของความโปร่งใสของช่องอัลฟา คุณสามารถปรับค่า fuzz จำนวนเบลอและค่า -level 50% เพื่อเปลี่ยนระดับการลบรอยหยัก

convert logo: -fuzz 25% -fill none -draw "matte 0,0 floodfill" -channel alpha -blur 0x1 -level 50x100% +channel -background saddlebrown -flatten result.jpg

ใส่คำอธิบายภาพที่นี่


ดี ฉันชอบที่คุณมีส่วนสำคัญของมันในแนวสั้น ๆ นี่คล้ายกับขั้นตอนกลางขั้นตอนหนึ่งของฉันขณะที่ฉันกำลังเขียนสคริปต์ ฉันตัดสินใจต่อต้านเพราะ (a) มันสูญเสียรายละเอียดที่คมชัดมากเกินไป (b) ฉันต้องการให้การเลือกสีที่ชัดเจนเพื่อให้สามารถเปลี่ยนได้ง่ายและ (c) ฉันต้องการเติมน้ำท่วมจากขอบทั้งหมดไม่ใช่แค่ด้านบน - มุมซ้าย (อาจมีเรื่องอื่นที่ฉันลืมไปในตอนนี้)
hackerb9

2
ปล. ผมจะเดาเอาเองว่า "fmw" ย่อมาจาก Fred M. Weinhaus ถ้าเป็นเช่นนั้นทักทาย Dr. Weinhaus! สำหรับใครก็ตามที่ไม่รู้ว่าเขาคือใครเขาเขียนงานวิจัยเกี่ยวกับความหมายในคอมพิวเตอร์กราฟิกเริ่มตั้งแต่ปี 1970 ทุกคนควรตรวจสอบ conucopia น่าทึ่งของเขาของสคริปต์ ImageMagick เปลือกที่fmwconcepts.com/imagemagick
hackerb9

1
@ hackerb9: ใช่นั่นคือฉัน เรารู้จักกันหรือเปล่า? ส่งอีเมลถึงฉันหากคุณต้องการ ที่อยู่อีเมลของฉันอยู่บนหน้าเว็บที่คุณเชื่อมโยง
fmw42

4

หากคุณต้องการควบคุมระดับความโปร่งใสคุณสามารถใช้ rgba โดยที่ a คืออัลฟ่า 0 สำหรับโปร่งใสและ 1 สำหรับทึบแสง ตรวจสอบให้แน่ใจว่าไฟล์ผลลัพธ์สุดท้ายต้องมีนามสกุล. png เพื่อความโปร่งใส

convert 
  test.png 
    -channel rgba 
    -matte 
    -fuzz 40% 
    -fill "rgba(255,255,255,0.5)" 
    -opaque "rgb(255,255,255)" 
       semi_transparent.png

1

อ๋อ มีปัญหาเดียวกันนี้ด้วย นี่คือคำสั่งที่ฉันเรียกใช้และทำงานได้อย่างสมบูรณ์: convert transparent-img1.png transparent-img2.png transparent-img3.png -channel Alpha favicon.ico

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.