Setel latar belakang transparan menggunakan ImageMagick dan prompt baris perintah


120

Misalkan Anda memiliki gambar apa pun (PNG atau JPG). Gambar ini memiliki latar belakang putih dan saya perlu membuat latar belakang ini transparan.

Saya telah mencoba dengan contoh-contoh ini:

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

tetapi tanpa hasil yang diinginkan.

Bagaimana saya bisa membuatnya?

PENTING: Menggunakan convertbaris perintah.


Aneh - Saya pikir perintah yang relevan adalah convert original.png -transparent white new.pngtetapi setelah mencobanya, tidak dapat membuatnya berfungsi. Selain itu, apakah Anda yakin latar belakang Anda benar-benar putih (#FFFFFF), atau hampir putih (mis. #FEFEFE)?
mathematical.coffee

@ mathematical.coffee Ok saya mengerti, izinkan saya memeriksa apakah ini tidak terjadi dan saya akan melanjutkan utas ini. Terima kasih.
Israel

@ mathematical.coffee Hai lagi, saya telah memeriksa warna dan gambar ini berlatar belakang #FFFFFF, dengan kata lain "putih". :( Bukan ini masalahnya!
Israel

Jawaban:


140

Saya menggunakan ImageMagick 6.6.9-7 di Ubuntu 12.04.
Apa yang berhasil bagi saya adalah sebagai berikut:

convert test.png -transparent white transparent.png

Itu mengubah semua putih di test.png menjadi transparan.


6
Ini tidak berhasil untuk saya sampai saya menyadari JPG tidak akan melakukan transparan. Setelah saya beralih ke PNG, ia melakukan apa yang saya inginkan - hanya perlu mengubah "putih" menjadi "rgb ($ r, $ g, $ b)".
Roger Dueck

2
Persetan! ini bagus!
agilob

2
Ini tidak hanya akan mengubah latar belakang menjadi transparan, tetapi setiap piksel putih. Apakah ada cara untuk hanya mengubah latar belakang menjadi transparan?
Alejandro Lozdziejski

2
@AlejandroLozdziejski - bagaimana Anda mendefinisikan "latar belakang"?
Jules

1
@AlejandroLozdziejski: Pertanyaan bagus. Silakan lihat solusi saya yang menggunakan isi banjir dari tepi, mencari warna yang kira-kira sama dengan piksel kiri atas.
hackerb9

79

Saya memiliki masalah yang sama. Di mana saya harus menghapus latar belakang putih dari format gambar jpg / png menggunakan ImageMagick.

Apa yang berhasil bagi saya adalah:

1) Ubah format gambar menjadi png: convert input.jpg input.png

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


6
Ini bagus, untuk memiliki tepi yang lebih halus antara latar belakang transparan dan latar depan buram. Jika Anda mengonversi ikon berisik dalam JPG ke PNG, dan ingin menambahkan transparansi, Anda juga dapat menambahkan beberapa pemfilteran median:mogrify -format png -median 2 -fuzz 5% -transparent white ico_*.jpg
Tomasz Gandor

44

Larutan

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

Penjelasan

Ini agak lebih panjang daripada jawaban sederhana yang diberikan sebelumnya, tetapi memberikan hasil yang jauh lebih baik: (1) Kualitas lebih unggul karena alfa antialiased, dan (2) hanya latar belakang yang dihilangkan dibandingkan dengan satu warna. ("Latar Belakang" didefinisikan sebagai warna yang kira-kira sama dengan piksel kiri atas, menggunakan isi banjir dari tepi gambar.)

Selain itu, saluran alfa juga terkikis setengah piksel untuk menghindari lingkaran cahaya. Tentu saja, operasi morfologi ImageMagick belum (belum?) Bekerja pada tingkat subpiksel, jadi Anda dapat melihat saya meledakkan saluran alfa hingga 200% sebelum terkikis.

Perbandingan hasil

Berikut adalah perbandingan pendekatan sederhana ("-fuzz 2% -transparent white") versus solusi saya, saat dijalankan pada logo ImageMagick . Saya telah meratakan kedua gambar transparan ke latar belakang coklat pelana untuk membuat perbedaan terlihat jelas (klik untuk aslinya).

Penggantian sederhana putih transparan tidak selalu berfungsi Alphachannel antialias dan penimbunan banjir terlihat jauh lebih baik

Perhatikan bagaimana janggut Wizard menghilang dalam pendekatan sederhana. Bandingkan tepi Wizard untuk melihat bagaimana antialiased alpha membantu gambar berbaur dengan mulus ke latar belakang.

Tentu saja, saya sepenuhnya mengakui ada kalanya Anda mungkin ingin menggunakan solusi yang lebih sederhana. (Misalnya: Jauh lebih mudah untuk diingat dan jika Anda mengonversi ke GIF, Anda terbatas pada alfa 1-bit.)

mktrans shell script

Karena tidak mungkin Anda ingin mengetik perintah ini berulang kali, saya sarankan untuk membungkusnya dalam skrip. Anda dapat mengunduh skrip shell BASH dari github yang melakukan solusi yang saya sarankan. Ini dapat dijalankan pada banyak file dalam sebuah direktori dan menyertakan komentar yang berguna jika Anda ingin mengubah sesuatu.

bg_removal script

Ngomong-ngomong, ImageMagick sebenarnya hadir dengan skrip bernama "bg_removal" yang menggunakan floodfill dengan cara yang sama seperti solusi saya. Namun hasilnya kurang bagus karena masih menggunakan alpha 1-bit. Selain itu, skrip bg_removal berjalan lebih lambat dan sedikit lebih rumit untuk digunakan (Anda harus menentukan dua nilai fuzz yang berbeda). Berikut adalah contoh keluaran dari bg_removal.

Skrip bg_removal: memiliki jenggot, tetapi tidak memiliki antialiasing


2
Saya perlu memodifikasi fuzz menjadi 2%, karena gambar tersebut berisi mesin putih dengan latar belakang putih. Dan meskipun ini tidak 100% sempurna, ini adalah solusi terbaik yang saya temukan karena saya tidak ingin melakukannya secara manual gimpatau apa pun. :)
tukusejssirs

1
Mengagumkan solusi!
0x01h

29

Ini bekerja untuk saya:

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

di mana semakin kecil% fuzz, semakin mendekati putih sejati atau sebaliknya, semakin besar%, semakin banyak variasi dari putih yang diizinkan untuk menjadi transparan


1
Wow! Inilah yang saya butuhkan! sebelum: i.imgur.com/2Rd7w1N.png , setelah: i.imgur.com/4RTYygo.png
Dorian

Ini tidak berfungsi dengan sempurna karena tidak dapat menangani gambar dengan warna putih dan latar belakang putih. seperti foto truf.
Sr. Pemimpin Tim Programmer PHP

Untuk putih di atas putih, coba gunakan solusi pengisian banjir yang saya posting di atas . Atau gunakan mktransskrip shell saya : github.com/hackerb9/mktrans
hackerb9

12

Anda dapat menggunakan ini untuk membuat latar belakang transparan

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

Di atas memberikan latar belakang transparan prefek


4
Shell mungkin memerlukan beberapa kutipan dari (): convert more-icon.png -gravity center -background 'rgba(0,0,0,0)' -extent 27x27 new-more-icon.png
Jim K.

7

Menggunakan ImageMagick, ini sangat mirip dengan kode dan hasil hackerb9, tetapi merupakan baris perintah yang sedikit lebih sederhana. Itu mengasumsikan bahwa piksel kiri atas adalah warna latar belakang. Saya hanya mengisi latar belakang dengan transparansi, lalu memilih saluran alfa dan mengaburkannya dan menghapus setengah dari area yang diburamkan menggunakan -tingkat 50x100%. Kemudian hidupkan kembali semua saluran dan ratakan dengan warna coklat. -Blur 0x1 -tingkat 50x100% bertindak untuk antialias batas-batas transparansi saluran alfa. Anda dapat menyesuaikan nilai fuzz, jumlah blur dan nilai -tingkat 50% untuk mengubah derajat antialiasing.

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

masukkan deskripsi gambar di sini


Bagus. Saya suka bahwa Anda mendapatkan intinya dalam baris yang ringkas. Ini mirip dengan salah satu langkah perantara saya saat saya menulis skrip. Saya memutuskan untuk tidak melakukannya karena (a) kehilangan terlalu banyak detail tajam, (b) Saya ingin membuat pemilihan warna menjadi jelas sehingga dapat dengan mudah diubah, dan (c) Saya ingin mengisi dari semua tepi, bukan hanya bagian atas -sudut kiri. (Mungkin ada hal lain yang saya lupakan sekarang).
hackerb9

2
PS Saya akan menebak dengan liar bahwa "fmw" adalah singkatan dari Fred M. Weinhaus. Jika demikian, salam, Dr. Weinhaus! Kepada siapa pun yang tidak tahu siapa dia, dia menulis beberapa penelitian penting dalam grafik komputer yang dimulai pada tahun 1970-an. Setiap orang harus memeriksa skrip shell ImageMagick yang menakjubkan di fmwconcepts.com/imagemagick .
hackerb9

1
@ hackerb9: Ya, itu saya. Apakah kita saling mengenal? Kirimi saya email jika Anda mau. Alamat email saya ada di halaman web saya yang Anda tautkan.
fmw42

4

Jika Anda ingin mengontrol tingkat transparansi Anda dapat menggunakan rgba. dimana a adalah alpha. 0 untuk transparan dan 1 untuk buram. Pastikan file hasil akhir harus memiliki ekstensi .png untuk transparansi.

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

1

Ya. Punya masalah yang sama juga. Inilah perintah yang saya jalankan dan berfungsi dengan sempurna: convert transparent-img1.png transparent-img2.png transparent-img3.png -channel Alpha favicon.ico

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.