Ganti transparansi dalam gambar PNG dengan latar belakang putih

294

Saya punya beberapa gambar PNG dengan transparansi, dan saya perlu membuat versi dengan lapisan gambar tersusun pada latar belakang putih. Saya sudah mencoba berbagai hal dengan operasi "konversi" Image Magick, tetapi tidak ada yang terjadi sama sekali atau saya mendapatkan kesalahan. Saya tidak ingin pergi ke bentuk JPG perantara karena saya tidak ingin artefak. Tentu saja mudah untuk melakukan ini di Gimp atau Photoshop atau apa pun, tetapi saya benar-benar lebih suka skrip dari baris perintah karena ada banyak hal ini.

Contoh dari perintah Image Magick yang tidak berfungsi adalah:

convert img1.png -background white -flatten img1-white.png

Itu menghasilkan kesalahan.

Terima kasih!

Runcing
sumber
Dalam kasus khusus saya, lapisan transparansi di PNG mengalami konflik ketika melalui prosesor (Apache) FO untuk membuat PDF / A. PDF / A tidak memungkinkan transparansi. Peretasan yang saya gunakan adalah beralih ke JPG.
Wivani
3
"Itu menghasilkan kesalahan." Apa pesan kesalahannya?
Aaron McDaid
Perintah itu seharusnya bekerja dengan baik. Jika tidak, maka Anda mungkin memiliki instalasi buggy dari Imagemagick atau libpng atau versi Anda terlalu tua. Apa versi Imagemagick dan libpng Anda?
fmw42

Jawaban:

255

Ini bekerja untuk saya:

convert -flatten img1.png img1-white.png

Referensi dokumentasi:

remosu
sumber
3
Entah bagaimana ini tidak bekerja untuk saya ... Saya mencoba "-transparan-warna putih", tetapi mendapat pengecualian / peringatan.
William Niu
1
Ternyata saya perlu mengatur -background menjadi putih juga. Saya juga harus mengunduh colors.xml, yang hilang.
William Niu
9
Lihatlah jawaban saya di bawah ini. Itu ditambahkan 2 tahun setelah ini.
Rok Kralj
42
JANGAN mencoba mengonversi dokumen multi-halaman -flatten. Ini akan meratakan halaman menjadi satu halaman.
Tim S.
8
Jika Anda ingin melakukannya pada semua file dari folder Anda, Anda dapat melakukannya dengan cara ini: untuk mogrify -flatten *.pngberjaga-jaga, jangan lupa untuk melakukan backup. Info lebih lanjut di sini: imagemagick.org/script/mogrify.php
troyane
372
-background white -alpha remove -alpha off

Contoh:

convert image.png -background white -alpha remove -alpha off white.png

Silakan ganti white dengan warna lain yang Anda inginkan. Dokumentasi Imagemagick mengatakan ini tentang -alpha removeoperasi:

Operasi ini sederhana dan cepat, dan melakukan pekerjaan tanpa memerlukan penggunaan memori tambahan, atau efek samping lain yang mungkin terkait dengan teknik penghapusan transparansi alternatif. Dengan demikian cara yang disukai untuk menghapus transparansi gambar.

Rok Kralj
sumber
3
Tampaknya -background whitetidak diperlukan (kemungkinan untuk warna lain sekalipun).
Skippy le Grand Gourou
5
@ SkippyleGrandGourou: Ini diperlukan, karena warna fallback transparansi untuk PNG tidak selalu putih.
Rok Kralj
3
lebih baik daripada jawaban yang diterima (yang dalam hal lebih dari satu lapisan tidak melakukan hal yang benar)
axkibe
5
Gambar yang dihasilkan masih akan memiliki saluran alfa. Itu akan kosong tapi masih ada di sana. Untuk sepenuhnya menghapus saluran tambahkan -alpha off.
josch
2
Tidak bekerja Saya membuat PNG baru dengan latar belakang transparan dan titik merah di tengah. Selalu menghasilkan latar belakang hitam, tidak peduli warna apa yang saya tentukan. convert image.png -background white -alpha off white.pngmenghasilkan gambar dengan latar belakang hitam. convert image.png -background "#00ff33" -alpha off 00ff33.pngmenghasilkan latar belakang hitam
McNulty
46

Meratakan gambar dan menerapkan gambar latar lurus di ImageMagick

Namun, urutan perintah sangat penting

Untuk menerapkan latar belakang apa pun pada gambar transparan dan meratakannya, pertama-tama menerapkan latar belakang daripada meratakannya. Kebalikannya tidak bekerja.

$ convert sourceimage.png -background BackgroundColor -flatten destinationimage.png
acpmasquerade
sumber
Untuk alasan apa pun, ini bekerja dengan baik untuk saya. Tidak yakin mengapa upaya awal Anda tidak berhasil.
Anthony
23

Satu-satunya yang bekerja untuk saya adalah campuran dari semua jawaban:

convert in.png -background white -alpha remove -flatten -alpha off out.png
db0
sumber
4
Keren, itu berhasil. Saya sebenarnya membutuhkan warna lain dari putih dan Anda dapat menggunakan ... -background "#010203" ...daripada menggunakan putih.
Alexis Wilke
inilah cara mengganti gambar yang sama di semua folder dalam direktorimogrify -background white -flatten */*.png
Julian
-alpha removeadalah apa yang terjadi pada saya
Stefan Dragnev
13

inilah cara mengganti gambar yang sama di semua folder dalam direktori dengan warna putih alih-alih transparan:

mogrify -background white -flatten */*.png

Julian
sumber
10

Menggunakan -flatten membuat saya benar-benar marah karena -flatten dalam kombinasi dengan crop mogrify dan mengubah ukuran tidak berfungsi. Cara resmi dan bagi saya satu-satunya cara yang benar adalah "menghapus" saluran alfa.

-alpha hapus -alpha off (tidak diperlukan dengan JPG)

Lihat dokumentasi: http://www.imagemagick.org/Usage/masking/#remove

Tjarko Rikkerink
sumber
jadi bagaimana menjadi perintah? ini tidak bekerja di sini:convert imgWithTranspBkg.png -alpha remove -alpha off bkg.jpg resultImg.png
Aquarius Power
Saya hanya ingin menghapus alpha. Konversi ke JPG melakukannya, bagus dan mudah. Terima kasih atas tipnya.
Roger CS Wernersson
Ini adalah satu-satunya solusi di atas yang berhasil untuk saya. Sekarang toko iTunes puas dengan gambar saya.
Bill Cheswick
7

Bagian Alpha Remove pada Panduan Penggunaan ImageMagick menyarankan penggunaan -alpha removeopsi, misalnya:

convert in.png  -background white  -alpha remove  out.png

...menggunakan -background warna yang Anda pilih.

Panduan menyatakan:

Operasi ini sederhana dan cepat, dan melakukan pekerjaan tanpa memerlukan penggunaan memori tambahan, atau efek samping lain yang mungkin terkait dengan teknik penghapusan transparansi alternatif. Dengan demikian cara yang disukai untuk menghapus transparansi gambar.

Itu juga menambahkan catatan:

Perhatikan bahwa sementara transparansi 'dihapus' saluran alpha akan tetap dihidupkan, tetapi sekarang akan sepenuhnya buram. Jika Anda tidak lagi membutuhkan saluran alfa, Anda dapat menggunakan Alpha Off untuk menonaktifkannya.

Jadi, jika Anda tidak membutuhkan saluran alfa, Anda dapat membuat ukuran gambar output Anda lebih kecil dengan menambahkan -alpha offopsi, misalnya:

convert in.png  -background white  -alpha remove  -alpha off  out.png

Ada lebih banyak rincian tentang teknik lain yang sering digunakan untuk menghapus transparansi yang dijelaskan dalam Menghapus Transparansi dari Gambar .

Termasuk dalam bagian itu menyebutkan peringatan penting untuk penggunaan -flattensebagai teknik untuk menghilangkan transparansi:

Namun ini tidak akan bekerja dengan "mogrify" atau dengan urutan beberapa gambar, pada dasarnya karena "-flatten" operator benar-benar dirancang untuk menggabungkan banyak gambar menjadi satu gambar.

Jadi, jika Anda mengonversi beberapa gambar sekaligus, misalnya membuat thumbnail dari file PDF, -flattentidak akan melakukan apa yang Anda inginkan (itu akan meratakan semua gambar untuk semua halaman menjadi satu gambar). Di sisi lain, menggunakan -alpha removeteknik masih akan menghasilkan banyak gambar, masing-masing memiliki transparansi dihapus.

Gary
sumber
5

Tampaknya perintah Anda benar sehingga masalahnya mungkin karena tidak adanya dukungan untuk PNG (). Anda dapat memeriksa convert -list configureatau hanya mencoba yang berikut:

sudo yum install libpng libpng-devel
Alastair
sumber
1
Ya terima kasih; masalah (lama) ini adalah bug di "graphicks magick", yang merupakan garpu / penulisan ulang / apa pun dari "image magick '.
Runcing
@Pointy, saya mengerti! Karena penasaran, apa sebenarnya penyebab masalah ini (itu hanya dalam satu versi)?
Alastair
Ya saya benar-benar tidak tahu persis; itu hanya bug. Saya bukan pengelola Graphicks Magick, jadi saya tidak memiliki wawasan tentang kode mereka. Saya perlu mencoba lagi di beberapa titik saya kira.
Runcing
ubuntu tidak memilikinya? di sini adalah libpng12-0 tetapi masih tidak berhasil :(
Aquarius Power
Saya menggunakan Ubuntu 13.04 dengan libpng12-0terinstal dan berfungsi. Bisakah Anda melihat png jika Anda menjalankan ini? convert -list configure | grep \png
Alastair
5

Ini bukan jawaban untuk pertanyaan Anda, tetapi saya menemukan pertanyaan Anda saat mencoba mencari cara menghapus saluran alpha, jadi saya memutuskan untuk menambahkan jawaban ini di sini:

Jika Anda ingin menghapus saluran alpha menggunakan imagemagick, Anda dapat menggunakan perintah ini:

mogrify -alpha off ./*.png
FreeNickname
sumber
3

Yah sepertinya keputusan saya untuk menginstal "grafis magick" di atas "gambar magick" memiliki beberapa tepi yang kasar - ketika saya menginstal ulang "gambar ajaib" lama yang asli, maka perintah di atas berfungsi dengan baik.

sunting , lama kemudian - Suatu hari saya akan memeriksa untuk melihat apakah "grafik ajaib" telah memperbaiki masalah ini.

Runcing
sumber
2

Saya membutuhkan: keduanya -alpha backgrounddan -flatten, atau -fill.

Saya membuat PNG baru dengan latar belakang transparan dan titik merah di tengah.

convert image.png -background green -alpha off green.png gagal: menghasilkan gambar dengan latar belakang hitam

convert image.png -background green -alpha background -flatten green.png menghasilkan gambar dengan latar belakang hijau yang benar.

Tentu saja, dengan file lain yang saya ganti namanya image.png, gagal melakukan apa pun. Untuk file itu, saya menemukan bahwa warna piksel transparan adalah "# d5d5d5" jadi saya mengisi warna itu dengan hijau:

convert image.png -fill green -opaque "#d5d5d5" green.png mengganti piksel transparan dengan warna hijau yang benar.

McNulty
sumber
perintah yang tepat dengan ImageMagick saat akan convert image.png -background green -alpha background -alpha off green.pngatau convert image.png -background green -alpha background -alpha remove green.pngatau convert image.png -background green -flatten green.png
fmw42
1

Opsi baris non-perintah: buka file PNG di Windows Paint dan klik Simpan.

Hbere
sumber
0

ini menciptakan gambar hanya menempatkan 1 dengan transparansi di atas ke-2

composite -gravity center ImgWithTransp.png BackgroundSameSizeOfImg.png ResultImg.png

awalnya menemukan tip di posting ini

Aquarius Power
sumber
0

Untuk benar-benar menghapus saluran alpha dari file, gunakan opsi alpha off :

convert in.png -background white -alpha off out.png
Nick Dowell
sumber
1
Sebenarnya, tautan yang Anda berikan mengatakan: "Itu tidak benar-benar menghapus atau merusak saluran alfa yang dilampirkan pada gambar, itu hanya mematikan efek yang dimiliki saluran pada gambar." Untuk benar-benar menghapus saluran alfa, lihat jawaban saya.
Rok Kralj
0

Saya melihat pertanyaan dan jawaban ini yang sangat membantu saya, tetapi kemudian saya harus melakukannya untuk banyak file, Jadi jika Anda memiliki banyak gambar (gambar PNG) dalam satu folder dan Anda ingin melakukannya untuk semua:

find ./ -name "*.png" -exec convert {} -flatten {} \;
taliboni
sumber
-1

Ini -alpha off, BUKAN -alpha hapus! Unggah toko aplikasi iOS gagal ketika ada saluran alfa di ikon apa pun !!

Inilah cara melakukannya: mogrify -alpha off * .png

railsfanatic
sumber