Saya sedang mengerjakan UI untuk sebuah aplikasi, dan saya mencoba menggunakan ikon skala abu-abu, dan mengizinkan pengguna untuk mengubah tema menjadi warna pilihan mereka. Untuk melakukan ini, saya mencoba menerapkan semacam ColorFilter untuk melapisi warna di atas drawable. Saya sudah mencoba menggunakan PorterDuff.Mode.MULTIPLY, dan bekerja hampir persis seperti yang saya butuhkan, kecuali bahwa warna putih juga dilapisi dengan warna. Idealnya, saya mencari sesuatu seperti mode pencampuran "Warna" di Photoshop, di mana grafik mempertahankan transparansi dan luminositasnya, dan hanya mengubah warna gambar. Misalnya:
menjadi
Setelah melakukan beberapa penelitian, tampaknya kelas ColorMatrixColorFilter dapat melakukan apa yang saya butuhkan, tetapi saya tidak dapat menemukan sumber daya yang menunjuk ke bagaimana matriks digunakan. Ini adalah matriks 4x5, tapi yang perlu saya ketahui adalah bagaimana saya mendesain matriks. Ada ide?
EDIT: Jadi oke, apa yang saya temukan sejauh ini tentang ini adalah sebagai berikut:
1 0 0 0 0 //red
0 1 0 0 0 //green
0 0 1 0 0 //blue
0 0 0 1 0 //alpha
Dimana matriks ini merupakan matriks identitas (bila diterapkan, tidak membuat perubahan), dan jumlahnya berkisar dari 0 hingga 1 (float). Matriks ini akan dikalikan dengan setiap piksel untuk diubah menjadi warna baru. Jadi di sinilah mulai kabur bagi saya. Jadi saya akan berpikir setiap piksel akan menjadi vektor 1 x 4 yang berisi nilai argb (misalnya 0.2, 0.5, 0.8, 1
) yang akan dihiasi dengan matriks transformasi. Jadi untuk menggandakan intensitas merah suatu gambar, Anda akan menggunakan matriks seperti:
2 0 0 0 0
0 1 0 0 0
0 0 1 0 0
0 0 0 1 0
yang akan memberi Anda vektor (warna) 0.4, 0.5, 0.8, 1
. Dari pengujian terbatas, ini tampaknya menjadi kasusnya, dan berfungsi dengan baik, tetapi saya sebenarnya masih berakhir dengan masalah yang sama (yaitu warna putih mendapatkan pewarnaan). Bacaan lebih lanjut memberi tahu saya bahwa ini karena ini melakukan konversi pada nilai RGB, sedangkan untuk pergeseran rona, nilai-nilai tersebut harus terlebih dahulu dikonversi ke nilai HSL. Jadi mungkin saya bisa menulis kelas yang akan membaca gambar dan mengubah warna, dan menggambar ulang gambar dengan warna baru. Ini menciptakan masalah LAIN dengan StateListDrawables, karena saya tidak yakin bagaimana saya akan mendapatkan masing-masing dalam kode dan memodifikasi semuanya, dan seberapa lambat prosesnya. : /
Hmm, oke, jadi saya kira pertanyaan lain yang akan saya miliki adalah apakah sebuah matriks dapat digunakan untuk mengubah RGB ke ruang warna lain dengan informasi luminositas, seperti L a b atau HSL? Jika demikian, saya bisa mengalikan matriks untuk percakapan itu, lalu membuat penyesuaian rona ke matriks ITU, lalu menerapkan matriks itu sebagai Filter Warna.
sumber
Jawaban:
Inilah yang saya gunakan untuk permainan saya. Ini adalah kompilasi dari berbagai bagian yang ditemukan di berbagai artikel di situs web. Penghargaan diberikan kepada penulis asli dari tautan @see. Perhatikan bahwa lebih banyak lagi yang dapat dilakukan dengan matriks warna. Termasuk pembalik, dll ...
Untuk menyelesaikan ini saya harus menambahkan contoh:
sumber
mat
dalam kode Anda memiliki 5 baris? Bukankah seharusnya hanya 4 baris (satu untuk setiap RGBA)?ColorMatrix
, saya mengambilnya kembali. Baris terakhirmat
tidak pernah digunakan sama sekali. TheColorMatrix
konstruktor hanya membutuhkan waktu pertama 4 baris (salinan 20 mengapung pertama dari matriks sumber tertentu).berikut adalah kode lengkapnya jika ingin mengatur bright, contrast, saturation dan hue. Nikmati! Terima kasih banyak kepada @RichardLalancette
sumber
adjustContrast
metode Anda : (1) ekspresivalue<<0
tampak berlebihan, karena akan selalu sama dengan (hanya)value
. (2) Sebagaivalue
integer, bukankahvalue % 1
selalu sama dengan 0?Untuk siapa saja yang tertarik dengan cara menggunakan ColorMatrixColorFilter. Sampel yang saya gunakan di sini, mengubah setiap piksel menjadi merah ketika saya menggambar bitmap di kanvas.
Komentar di kelas berasal dari: http://developer.android.com/reference/android/graphics/ColorMatrix.html ini memberi Anda beberapa wawasan tentang cara kerjanya
sumber
Kelas di bawah ini merupakan perbaikan dari jawaban yang telah diposting. Ini membuatnya lebih mudah untuk membaca dan membuat
ColorFilter
dariBitmap
.Contoh penggunaan:
sumber
Tidak ada hubungan linier antara Hue dan RGB. Hue didefinisikan sedikit demi sedikit dalam potongan 60 ° ( http://en.wikipedia.org/wiki/HSL_color_space#General_approach ), dan oleh karena itu tidak ada konversi matriks sederhana antara HSV dan RGB. Untuk mengubah corak suatu gambar, Anda dapat menggunakan cara berikut:
sumber
Saya pikir metode ini akan memberi Anda apa yang Anda inginkan:
http://android.okhelp.cz/hue-color-colored-filter-bitmap-image-android-example/
sumber
Seperti jawaban lainnya, saya menggunakan matriks warna untuk mengimplementasikan perilaku ini, tetapi Anda bisa meneruskan sumber daya warna Android biasa. Matriks, memetakan warna ke dalam rentang antara nilai gambar dan putih.
sumber
Saya membuat penguji ColorMatrixFilter kecil, berdasarkan cuplikan berikut:
Anda dapat memeriksanya di sini: https://play.google.com/store/apps/details?id=org.vaelostudio.colormatrixtester
sumber
Meskipun banyak efek berguna dapat dicapai dengan menggunakan
ColorMatrix
saya pribadi akan mempertimbangkan untuk menggunakanColorMap[]
bersamaImageAttributes
. Dengan melakukan ini kita dapat menentukan warna mana yang harus diganti dengan warna mana.sumber
ColorMap
? Saya rasa tidak ada kelas seperti itu yang tersedia di java / android libs standar.Cara saya menyelesaikannya adalah memulai dengan gambar skala abu-abu.
asli ---> gambar abu-abu
Anda dapat melakukannya dengan mudah di photoshop, atau jika Anda perlu melakukannya dalam kode Anda dapat menggunakan metode berikut.
Setelah Anda memiliki gambar GrayScale, Anda dapat menggunakan mode PorterDuff OVERLAY untuk menambahkan Warna yang diinginkan.
Hasil di atas adalah sebagai berikut randomColorGif
sumber