Thay thế độ trong suốt của hình ảnh PNG bằng nền trắng


294

Tôi đã có một số hình ảnh PNG có độ trong suốt và tôi cần tạo các phiên bản với lớp hình ảnh được tạo trên nền trắng. Tôi đã thử nhiều cách với các thao tác "chuyển đổi" Image Magick, nhưng không có gì xảy ra hoặc tôi gặp lỗi. Tôi không muốn chuyển sang dạng JPG trung gian vì tôi không muốn tạo tác. Tất nhiên thật dễ dàng để làm điều này trong Gimp hoặc Photoshop hoặc bất cứ điều gì, nhưng tôi thực sự thích kịch bản nó từ dòng lệnh vì có nhiều thứ trong số này.

Một ví dụ về lệnh Image Magick không hoạt động là:

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

Điều đó dẫn đến một lỗi.

Cảm ơn!


Trong trường hợp cụ thể của tôi, lớp trong suốt trong PNG bị xung đột khi đi qua bộ xử lý FO (Apache) để tạo PDF / A. PDF / A không cho phép minh bạch. Cách hack tôi đã sử dụng là chuyển sang JPG thay thế.
Wivani

3
"Điều đó dẫn đến một lỗi." Thông báo lỗi là gì?
Aaron McDaid

Lệnh đó sẽ hoạt động tốt. Nếu không, thì bạn có thể có một bản cài đặt lỗi của Imagemagick hoặc libpng hoặc các phiên bản của bạn đã quá cũ. Phiên bản Imagemagick và libpng của bạn là gì?
fmw42

Câu trả lời:


255

Điều này làm việc cho tôi:

convert -flatten img1.png img1-white.png

Tài liệu tham khảo:


3
Bằng cách nào đó, điều này không phù hợp với tôi ... Tôi đã thử "màu trắng trung tính", nhưng có một ngoại lệ / cảnh báo.
William Niu

1
Hóa ra tôi cũng cần thiết lập -background thành màu trắng. Tôi cũng đã phải tải xuống tệp màu.
William Niu

9
Kiểm tra câu trả lời của tôi dưới đây. Nó đã được thêm 2 năm sau cái này.
Rok Kralj

42
KHÔNG cố gắng chuyển đổi các tài liệu nhiều trang với -flatten. Nó sẽ san phẳng các trang thành một trang.
Tim S.

8
Nếu bạn muốn làm điều đó trên tất cả các tệp từ thư mục của mình, bạn có thể thực hiện theo cách này: mogrify -flatten *.pngchỉ trong trường hợp, đừng quên sao lưu. Xem thêm thông tin ở đây: imagemagick.org/script/mogrify.php
troyane

372
-background white -alpha remove -alpha off

Thí dụ:

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

Hãy thay thế whitebằng bất kỳ màu nào khác mà bạn muốn. Tài liệu của Imagemagick nói điều này về -alpha removehoạt động:

Thao tác này đơn giản và nhanh chóng, và thực hiện công việc mà không cần sử dụng thêm bộ nhớ hoặc các tác dụng phụ khác có thể liên quan đến các kỹ thuật loại bỏ độ trong suốt thay thế. Do đó, đó là cách ưa thích để loại bỏ độ trong suốt của hình ảnh.


3
Có vẻ như -background whitekhông cần thiết (có khả năng là cho các màu khác).
Skippy le Grand Gourou

5
@SkippyleGrandGourou: Cần thiết, vì màu dự phòng trong suốt cho PNG không phải lúc nào cũng là màu trắng.
Rok Kralj

3
tốt hơn câu trả lời được chấp nhận (trong trường hợp có nhiều hơn một lớp không làm đúng)
axkibe

5
Hình ảnh thu được vẫn sẽ có một kênh alpha. Nó sẽ trống rỗng nhưng nó vẫn sẽ ở đó. Để loại bỏ hoàn toàn các kênh thêm -alpha off.
josch

2
Không hoạt động. Tôi đã tạo một PNG mới với nền trong suốt và một chấm đỏ ở giữa. Luôn tạo ra một nền đen, bất kể tôi chỉ định màu gì. convert image.png -background white -alpha off white.pngtạo ra một hình ảnh với một nền đen. convert image.png -background "#00ff33" -alpha off 00ff33.pngtạo ra một nền đen
McN Khoa

46

Làm phẳng hình ảnh và áp dụng hình nền là điều dễ dàng trong ImageMagick

Tuy nhiên, thứ tự của các lệnh là rất quan trọng

Để áp dụng bất kỳ nền nào trên một hình ảnh trong suốt và làm phẳng nó, trước tiên hãy áp dụng nền hơn là làm phẳng nó. Điều ngược lại không hoạt động.

$ convert sourceimage.png -background BackgroundColor -flatten destinationimage.png

Vì lý do gì, điều này làm việc tốt cho tôi. Không chắc chắn tại sao nỗ lực ban đầu của bạn không hoạt động.
Anthony

23

Người duy nhất làm việc cho tôi là một hỗn hợp của tất cả các câu trả lời:

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

4
Thật tuyệt, điều đó đã làm việc. Tôi thực sự cần một màu khác ngoài màu trắng và bạn có thể sử dụng ... -background "#010203" ...thay vì sử dụng màu trắng.
Alexis Wilke

Dưới đây là cách thay thế cùng một hình ảnh trong tất cả các thư mục trong một thư mụcmogrify -background white -flatten */*.png
Julian

-alpha removelà những gì đã làm cho tôi
Stefan Dragnev

13

Dưới đây là cách thay thế cùng một hình ảnh trong tất cả các thư mục trong một thư mục bằng màu trắng thay vì trong suốt:

mogrify -background white -flatten */*.png


10

Sử dụng -flatten làm tôi hoàn toàn phát điên vì -flatten kết hợp với cây trồng không phù hợp và thay đổi kích thước đơn giản là không hiệu quả. Cách chính thức và đối với tôi chỉ là cách "loại bỏ" kênh alpha.

-alpha loại bỏ -alpha tắt (không cần với JPG)

Xem tài liệu: http://www.imagemagick.org/Usage/masking/#remove


Vậy làm thế nào để trở thành chỉ huy? điều này không hoạt động ở đây:convert imgWithTranspBkg.png -alpha remove -alpha off bkg.jpg resultImg.png
Sức mạnh của Bảo Bình

Tôi chỉ muốn loại bỏ alpha. Chuyển đổi sang JPG đã làm điều đó, tốt đẹp và dễ dàng. Cảm ơn vì tiền hỗ trợ.
Roger CS Wernersson

Đây là giải pháp duy nhất ở trên đã làm việc cho tôi. Bây giờ các cửa hàng iTunes hài lòng với hình ảnh của tôi.
Bill Cheswick

7

Phần Alpha Remove trong Hướng dẫn sử dụng ImageMagick gợi ý sử dụng -alpha removetùy chọn, ví dụ:

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

... Sử dụng -backgroundmàu bạn chọn.

Hướng dẫn nêu:

Thao tác này đơn giản và nhanh chóng và thực hiện công việc mà không cần sử dụng thêm bộ nhớ hoặc các tác dụng phụ khác có thể liên quan đến các kỹ thuật loại bỏ độ trong suốt thay thế. Do đó, đó là cách ưa thích để loại bỏ độ trong suốt của hình ảnh.

Nó cũng thêm ghi chú:

Lưu ý rằng mặc dù độ trong suốt bị 'loại bỏ', kênh alpha sẽ vẫn được bật, nhưng bây giờ sẽ hoàn toàn mờ đục. Nếu bạn không còn cần kênh alpha, bạn có thể sử dụng Alpha Off để tắt kênh đó.

Do đó, nếu bạn không cần kênh alpha, bạn có thể làm cho kích thước hình ảnh đầu ra của mình nhỏ hơn bằng cách thêm -alpha offtùy chọn, ví dụ:

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

Có nhiều chi tiết hơn về các kỹ thuật khác, thường được sử dụng để loại bỏ độ trong suốt được mô tả trong phần Xóa Độ trong suốt khỏi Hình ảnh .

Bao gồm trong phần đó là đề cập đến một cảnh báo quan trọng đối với việc sử dụng -flattennhư một kỹ thuật để loại bỏ tính minh bạch:

Tuy nhiên, điều này sẽ không hoạt động với "mogrify" hoặc với một chuỗi nhiều hình ảnh, về cơ bản vì toán tử "-flatten" thực sự được thiết kế để hợp nhất nhiều hình ảnh thành một hình ảnh.

Vì vậy, nếu bạn đang chuyển đổi nhiều hình ảnh cùng một lúc, ví dụ: tạo hình thu nhỏ từ tệp PDF, -flattensẽ không làm những gì bạn muốn (nó sẽ làm phẳng tất cả hình ảnh cho tất cả các trang thành một hình ảnh). Mặt khác, sử dụng -alpha removekỹ thuật này vẫn sẽ tạo ra nhiều hình ảnh, mỗi hình ảnh đều bị loại bỏ độ trong suốt.


5

Có vẻ như lệnh của bạn là chính xác nên vấn đề có thể là do thiếu hỗ trợ cho PNG (). Bạn có thể kiểm tra với convert -list configurehoặc chỉ thử các cách sau:

sudo yum install libpng libpng-devel

1
Vâng cảm ơn; vấn đề (cũ) này là một lỗi trong "graphicks magick", đó là một ngã ba / viết lại / bất cứ điều gì của "magick hình ảnh".
Pointy

@Pointy tôi hiểu rồi! Vì tò mò, nguyên nhân thực sự của vấn đề là gì (chỉ có trong một phiên bản)?
Alastair

Vâng, tôi thực sự không biết chính xác; nó chỉ là một lỗi Tôi không phải là người duy trì Graphicks Magick nên tôi không có cái nhìn sâu sắc về mã của họ. Tôi cần phải thử lại tại một số điểm tôi đoán.
Pointy

Ubuntu không có nó? đây là libpng12-0 nhưng vẫn không hoạt động :(
Sức mạnh của Bảo Bình

Tôi đang sử dụng Ubuntu 13.04 với libpng12-0cài đặt và hoạt động. Bạn có thể thấy png nếu bạn chạy này? convert -list configure | grep \png
Alastair

5

Đây không chính xác là câu trả lời cho câu hỏi của bạn, nhưng tôi đã tìm thấy câu hỏi của bạn trong khi cố gắng tìm ra cách loại bỏ kênh alpha, vì vậy tôi quyết định thêm câu trả lời này vào đây:

Nếu bạn muốn xóa kênh alpha bằng hình ảnh, bạn có thể sử dụng lệnh này:

mogrify -alpha off ./*.png

3

Có vẻ như quyết định của tôi về việc cài đặt "magick đồ họa" trên "magick hình ảnh" có một số cạnh khó khăn - khi tôi cài đặt lại "magick hình ảnh" cũ nát, thì lệnh trên hoạt động rất tốt.

chỉnh sửa , một thời gian dài sau - Một trong những ngày này tôi sẽ kiểm tra xem liệu "ảo thuật đồ họa" đã khắc phục vấn đề này chưa.


2

Tôi cần một trong hai: cả hai -alpha background-flattenhay -fill.

Tôi đã tạo một PNG mới với nền trong suốt và một chấm đỏ ở giữa.

convert image.png -background green -alpha off green.png thất bại: nó tạo ra một hình ảnh với nền đen

convert image.png -background green -alpha background -flatten green.png tạo ra một hình ảnh với nền màu xanh lá cây chính xác.

Tất nhiên, với một tập tin khác mà tôi đã đổi tên image.png, nó không thể làm được gì. Đối với tệp đó, tôi thấy rằng màu của các pixel trong suốt là "# d5d5d5" vì vậy tôi đã tô màu đó bằng màu xanh lá cây:

convert image.png -fill green -opaque "#d5d5d5" green.png thay thế các pixel trong suốt bằng màu xanh lá cây chính xác.


lệnh thích hợp với ImageMagick hiện tại sẽ là convert image.png -background green -alpha background -alpha off green.pnghay convert image.png -background green -alpha background -alpha remove green.pnghay convert image.png -background green -flatten green.png
fmw42

1

Tùy chọn dòng lệnh: mở tệp PNG trong Windows Paint và nhấp vào Lưu.


0

điều này tạo ra một hình ảnh chỉ cần đặt số 1 với độ trong suốt lên trên thứ 2

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

ban đầu tìm thấy lời khuyên trên bài đăng này


0

Để thực sự xóa kênh alpha khỏi tệp, hãy sử dụng tùy chọn tắt alpha :

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

1
Trên thực tế, liên kết bạn cung cấp cho biết: "Nó không thực sự xóa hoặc phá hủy kênh alpha được gắn vào hình ảnh, nó chỉ tắt bất kỳ hiệu ứng nào mà kênh có trên hình ảnh." Để thực sự loại bỏ kênh alpha, xem câu trả lời của tôi.
Rok Kralj

0

Tôi đã thấy câu hỏi và câu trả lời này thực sự giúp ích cho tôi nhưng sau đó tôi cần phải thực hiện nó cho rất nhiều tệp, vì vậy trong trường hợp bạn có nhiều hình ảnh (hình ảnh PNG) trong một thư mục và bạn muốn làm tất cả:

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

-1

Đó là -alpha tắt, KHÔNG -alpha loại bỏ! Tải lên cửa hàng ứng dụng iOS không thành công khi có kênh alpha trong bất kỳ biểu tượng nào !!

Đây là cách thực hiện: mogrify -alpha tắt * .png

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.