ImageMagick ve komut satırı istemini kullanarak şeffaf arka plan ayarlayın


120

Herhangi bir resminiz (PNG veya JPG) olduğunu varsayalım. Bu resmin beyaz bir arka planı var ve bu arka planı şeffaf yapmam gerekiyor.

Bu örneklerle denedim:

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

ancak arzu edilen sonuçlar yoktur.

Nasıl yapabilirim

ÖNEMLİ: convertKomut satırını kullanma .


Garip - İlgili komutun olduğunu sanıyordum, convert original.png -transparent white new.pngancak bunu denedikten sonra çalışmasını sağlayamıyorum. Bir kenara, arka planınızın gerçekten beyaz (#FFFFFF) olduğundan emin misiniz, yoksa neredeyse beyaz mı (örneğin #FEFEFE)?
mathematical.coffee

@ mathematical.coffee Tamam anladım, durumun böyle olup olmadığını kontrol edeyim ve bu konuya devam edeceğim. Teşekkür ederim.
İsrail

@ mathematical.coffee Tekrar merhaba, renkleri kontrol ettim ve bu resmin arka planı #FFFFFF, başka bir deyişle "beyaz". :( Durum böyle değil!
İsrail

Yanıtlar:


140

Ubuntu 12.04'te ImageMagick 6.6.9-7 kullanıyorum.
Benim için işe yarayan şuydu:

convert test.png -transparent white transparent.png

Bu, test.png'deki tüm beyazı şeffaf olarak değiştirdi.


6
JPG'nin şeffaf olmayacağını fark edene kadar bu benim için işe yaramadı. PNG'ye geçtikten sonra tam olarak istediğimi yaptı - sadece "beyaz" ı "rgb ($ r, $ g, $ b)" olarak değiştirmem gerekiyordu.
Roger Dueck

2
Allah kahretsin! bu harika!
agilob

2
Bu yalnızca arka planı saydam hale getirmekle kalmaz, her beyaz pikseli de dönüştürür. Arka planı yalnızca şeffaf hale getirmenin bir yolu var mı?
Alejandro Lozdziejski

2
@AlejandroLozdziejski - "arka planı" nasıl tanımlıyorsunuz?
Jules

1
@AlejandroLozdziejski: Güzel soru. Lütfen sol üst pikselle yaklaşık olarak aynı renkleri arayan, kenarlardan su baskını kullanan çözümüme bakın.
hackerb9

79

Ben de aynı sorunu yaşadım. ImageMagick kullanarak jpg / png resim formatından beyaz arka planı kaldırmam gerekiyor.

Benim için işe yarayan şuydu:

1) Görüntü formatını png'ye dönüştürün: convert input.jpg input.png

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


6
Şeffaf arka plan ile opak ön plan arasında daha yumuşak bir kenar olması iyidir. mogrify -format png -median 2 -fuzz 5% -transparent white ico_*.jpg
JPG'deki

44

Çözüm

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

açıklama

Bu, daha önce verilen basit cevaplardan biraz daha uzundur, ancak çok daha iyi sonuçlar verir : (1) Kalite, kenar yumuşatılmış alfa nedeniyle üstündür ve (2) tek bir rengin aksine yalnızca arka plan kaldırılır. ("Arka plan", resmin kenarlarından bir su baskını kullanılarak, sol üst pikselle yaklaşık aynı renk olarak tanımlanır.)

Ek olarak, haleleri önlemek için alfa kanalı da yarım piksel aşınmıştır. Elbette, ImageMagick'in morfolojik işlemleri alt piksel düzeyinde (henüz?) Çalışmıyor, bu nedenle aşınmadan önce alfa kanalını% 200'e kadar patlattığımı görebilirsiniz.

Sonuçların karşılaştırılması

ImageMagick logosu üzerinde çalıştırıldığında benim çözümüm ile basit yaklaşımın ("-fuzz% 2 - şeffaf beyaz") bir karşılaştırması . Farklılıkları belirgin hale getirmek için her iki saydam resmi de kahverengi bir arka plan üzerinde düzleştirdim (orijinaller için tıklayın).

Beyazın şeffaf olarak basit bir şekilde değiştirilmesi her zaman işe yaramaz Antialiased alphachannel ve floodfill çok daha iyi görünüyor

Büyücünün sakalının basit yaklaşımla nasıl kaybolduğuna dikkat edin. Kenarları yumuşatılmış alfa'nın şeklin arka plana sorunsuz bir şekilde karışmasına nasıl yardımcı olduğunu görmek için Sihirbazın kenarlarını karşılaştırın.

Elbette, daha basit çözümü kullanmak isteyebileceğiniz zamanlar olduğunu tamamen kabul ediyorum. (Örneğin: Hatırlaması çok daha kolay ve GIF'e dönüştürüyorsanız, zaten 1 bit alfa ile sınırlısınız.)

mktrans kabuk betiği

Muhtemelen bu komutu tekrar tekrar yazmak istemeyeceğiniz için, onu bir betiğe sarmanızı tavsiye ederim. Şunları yapabilirsiniz github bir BASH shell script indir , önermiş çözüm gerçekleştirir. Bir dizindeki birden fazla dosyada çalıştırılabilir ve bir şeyler ince ayar yapmak istemeniz durumunda yararlı yorumlar içerir.

bg_removal komut dosyası

Bu arada, ImageMagick aslında benim çözümümle benzer şekilde floodfill kullanan "bg_removal" adlı bir komut dosyasıyla birlikte geliyor . Ancak sonuçlar hala 1 bitlik alfa kullandığı için harika değil. Ayrıca, bg_removal betiği daha yavaş çalışır ve kullanımı biraz daha zordur (iki farklı fuzz değeri belirlemenizi gerektirir). İşte bg_removal'ın çıktısına bir örnek.

Bg_removal betiği: sakalı var, ancak kenar yumuşatma yok


2
Görüntüde beyaz arka plana sahip beyaz bir makine bulunduğu için tüyü% 2'ye değiştirmem gerekiyordu. Ve bu% 100 mükemmel olmasa da, manuel olarak yapmak istemediğim için bulduğum en iyi çözüm gimp. :)
tukusejssirs

1
Harika çözüm!
0x01h

29

Bu benim için çalışıyor:

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

tüy yüzdesi ne kadar küçükse, gerçek beyaza ne kadar yakınsa veya tersine, yüzde o kadar büyükse, beyazdan daha fazla varyasyonun şeffaf hale gelmesine izin verilir


1
Vaov! Bu tam olarak ihtiyacım olan şey! önce: i.imgur.com/2Rd7w1N.png , sonra: i.imgur.com/4RTYygo.png
Dorian

Mükemmel çalışmıyor çünkü beyaz renkli ve beyaz arka plana sahip görüntüleri işleyemiyor. koz fotoğrafları gibi.
Sr. PHP Programmer Team Lead

Beyaz üzerine beyaz için, yukarıda yayınladığım sel dolgu çözümünü kullanmayı deneyin . Veya mktranskabuk betiğimi
hackerb9

12

Arka planı saydam yapmak için bunu kullanabilirsiniz

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

Yukarıdakiler kaymakamın şeffaf arka planını verir


4
Kabuk için bazı alıntılar gerekebilir (): convert more-icon.png -gravity center -background 'rgba(0,0,0,0)' -extent 27x27 new-more-icon.png
Jim K.

7

ImageMagick kullanıldığında, bu hackerb9 koduna ve sonucuna çok benzer, ancak biraz daha basit bir komut satırıdır. Sol üst pikselin arka plan rengi olduğunu varsayar. Arka planı şeffaflıkla doldurup, ardından alfa kanalını seçip bulanıklaştırıyorum ve% 50x100 düzeyini kullanarak bulanık alanın yarısını kaldırıyorum. Ardından tüm kanalları açın ve kahverengi renge doğru düzleştirin. -Bulanıklık 0x1-seviyesi% 50x100, alfa kanalı şeffaflığının sınırlarını yumuşatır. Antialiasing derecesini değiştirmek için fuzz değerini, bulanıklaştırma miktarını ve -level% 50 değerini ayarlayabilirsiniz.

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

görüntü açıklamasını buraya girin


Güzel. Özünü kısa ve öz bir satırda öğrenmiş olman hoşuma gitti. Bu, senaryoyu yazarken ara adımlarımdan birine benzer. Buna karşı karar verdim çünkü (a) çok fazla keskin ayrıntıyı kaybediyor, (b) Kolayca değiştirilebilmesi için renk seçimini açık hale getirmek istedim ve (c) sadece üstten değil, tüm kenarlardan doldurmak istedim -sol köşe. (Şu anda unuttuğum başka şeyler de olabilir).
hackerb9

2
Not: "fmw" nin Fred M. Weinhaus anlamına geldiği konusunda çılgınca bir tahminde bulunacağım. Öyleyse, selamlar, Dr. Weinhaus! Kim olduğunu bilmeyen birine, 1970'lerden başlayarak bilgisayar grafikleri üzerine çığır açan bazı araştırmaları yazdı. Herkes, fmwconcepts.com/imagemagick adresinde ImageMagick kabuk betiklerinden oluşan muhteşem konkopisine bakmalıdır .
hackerb9

1
@ hackerb9: Evet, bu benim. Birbirimizi tanıyor muyuz? İsterseniz bana bir e-posta gönderin. E-posta adresim bağladığınız web sayfamda.
fmw42

4

Şeffaflık seviyesini kontrol etmek istiyorsanız, rgba'yı kullanabilirsiniz. alfa nerede. Şeffaf için 0 ve opak için 1. Şeffaflık için son çıktı dosyasının .png uzantısına sahip olması gerektiğinden emin olun.

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

1

Evet. Aynı sorunu da yaşadım. İşte çalıştırdığım komut ve mükemmel çalıştı: convert transparent-img1.png transparent-img2.png transparent-img3.png -channel Alpha favicon.ico

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.