2012-04-20 33 views
14

Tôi đang cố giải quyết sự cố với android ColorFilters. Tài liệu rất kém, vì vậy phương pháp chính là thử các biến thể khác nhau.Android ColorFilter - Chế độ Porter-Duff

Sự cố:

Có một ảnh bitmap. Một số pixel có alpha = 255, các pixel khác có alpha = 0. Tôi đang cố gắng vẽ một vòng tròn với một màu cụ thể. Tôi muốn kênh alpha không thay đổi trong bitmap, nhưng trong khi vẽ, tôi muốn nhân một màu với bitmap-alpha.

Vì vậy, trong khi vẽ hình tròn, tôi muốn pixel có alpha = 0 không được vẽ, nhưng pixel với alpha = 255 sẽ được tô màu mà tôi muốn. Kênh alpha không được thay đổi.

Tôi đang cố gắng sử dụng porter-duff ColorFilter (lớp PorterDuffColorFilter trong sdk android).

có quá nhiều chế độ và không thể hiểu được mô tả trên trang web chính thức ở đây: http://developer.android.com/reference/android/graphics/PorterDuff.Mode.html

Tôi nghĩ rằng tôi nên sử dụng DST_ATOP hoặc SRC_ATOP, nhưng họ không làm việc như tôi đã mô tả.

Ngoài ra, có một tham số lạ srcColor trong hàm tạo của bộ lọc màu porter-duff.

Tôi không thể hiểu "Sa" và "Sc" có nghĩa là gì trong công thức [Da, Sc * Da + (1 - Sa) * Dc]. Nó có thể là từ màu sắc đã được truyền vào constructor colorfilter và nó cũng có thể được thiết lập màu bởi "paint.setColor".

Mọi người đều biết, cách hoạt động?

+0

Bạn có thể google porter duff để xem ý nghĩa của các chế độ này. – Renard

+1

Tài liệu tuyệt vời này giải thích các chế độ PorterDuff với hình ảnh: http://ssp.impulsetrain.com/porterduff.html Chỉ cần lưu ý rằng nó không thêm "src_" như android: vì vậy "IN" = "SRC_IN" –

Trả lời

10

SaSc là quần short cho "nguồn alpha" và "nguồn màu", tương ứng. Tham số srcColor trong hàm tạo PorterDuffColorFilter là màu được sử dụng cho các giá trị này.

Đối với trường hợp của bạn, Mode.MULTIPLY có thể hoạt động tốt nhất.

+0

Nhưng cách paint.setColor ảnh hưởng đến nó? Tôi đã cố gắng thay đổi nó và hiểu rằng nó ảnh hưởng đến! Tôi nghĩ rằng nó nên được trong công thức pha trộn như vậy? – user1038085

+0

Ngoài ra, chế độ nhân không hoạt động trong trường hợp này. Các điểm ảnh có kênh alpha không được vẽ: ( – user1038085

+0

) Tôi không hoàn toàn chắc chắn về phần này, nhưng tôi nghĩ rằng nếu bạn đặt màu cho sơn, giá trị này sẽ được bao gồm trong một trong các đối số src/dst tại một số điểm Có vẻ như màu alpha cũng được đưa vào các tính toán trong trường hợp của bạn, làm cho mọi thứ trở nên vững chắc 1.0-alpha. Bạn nên cố gắng vẽ bitmap mà không cần thiết lập một màu trên sơn nữa. – Jave

5

Lưu ý rằng chế độ Porter-Duff chỉ được xác định để hoạt động bình thường với alpha được xử lý trước. Điều đó có nghĩa là không có thành phần R, G hoặc B nào có thể vượt quá giá trị alpha.

GitHub project cho dự án Android hiển thị tất cả các chế độ Porter-Duff. Các Android App cũng có sẵn trên Playstore.

+0

ứng dụng hiển thị cách thức các công thức ảnh hưởng đến hình ảnh một cách độc đáo sẽ tốt hơn nếu bạn bao gồm một số hình ảnh đơn giản hơn Như là một lựa chọn. –

1

Sau khi một số nghiên cứu tôi đến kết luận sau đây liên quan đến chế độ PorterDuff Màu trong Android,

  • Sa và Sc là Nguồn Alpha và Nguồn Màu, ví dụ nếu tôi đặt ColorFilter thành một drawable như myDrawable.setColorFilter (desiredColor, Mode.SRC_ATOP) thì giá trị Sa và Sc sẽ được lấy từ mong muốnColor không phải từ myDrawable. Da và Dc sẽ là các giá trị alpha và màu gốc của myDrawable.
  • Tôi đã có Hình ảnh và tôi muốn áp dụng một số màu nhất định với giá trị alpha từ đầu vào của người dùng. Tôi đã cố gắng sử dụng các chế độ PorterDuff, myDrawable ban đầu của tôi là một bản vá chín có thể vẽ được và nó có nền trong suốt và các góc trang như hình tam giác nhắn tin bong bóng. Khi tôi sử dụng

    PorterDuff cuối cùng tĩnh công cộng.Chế độ SRC [Sa, Sc]

áp dụng màu Source và Source Alpha, mà tôi cho là giá trị màu và Alpha của setColorFilter phương pháp nêu trên desiredColor, tôi có giá trị màu đúng nghĩa màu và alpha đã được áp dụng một cách chính xác để mới Có thể vẽ được nhưng hình tam giác trên hình ảnh đó đã được xóa hoàn toàn/xóa. Vì vậy, tôi đã phải sử dụng ColorMatrixFilter và thiết lập ma trận và thiết lập giá trị alpha riêng biệt để drawable.