SORU
4 Aralık 2010, CUMARTESİ


ColorMatrix Kullanımı anlayış ve Drawable Değiştirmek için ColorMatrixColorFilter'in Hue

Bir uygulama için bir kullanıcı arabirimi üzerinde çalışıyorum, ve gri simgeleri kullanın, ve kullanıcı kendi seçtiğiniz bir renk temasını değiştirmek için izin vermek için girişimde bulundum. Bunu yapmak için, sadece bir tür ColorFilter bu drawable üstünde bir renk kaplaması uygulamak için çalışıyorum. PorterDuff kullanarak denedim.Mod.ÇARPMA, ve ihtiyacım var, hemen hemen tam olarak beyaz renk ile yerleştirilmiştir almak haricinde iyi çalışıyor. İdeal olarak aradığım şey "Renk grafik şeffaflığı ve parlaklığı korur ve yalnızca resmin renk değiştirir." Photoshop karıştırma modu gibi bir şey. Örneğin:

alt text alt text olur

Biraz araştırma yaptıktan sonra, ColorMatrixColorFilter sınıfı ihtiyacım var ne olabilir gibi görünüyor, ama herhangi bir kaynak matrisi nasıl kullanıldığını işaret bulmak için görünmüyor olabilir. 4x5 matris, ama bilmek istediğim şey matris tasarımı hakkında gitmek nasıl. Herhangi bir fikir?

EDİT: şimdiye kadar ne buldum Peki, bu aşağıdaki gibidir:

1 0 0 0 0 //red
0 1 0 0 0 //green
0 0 1 0 0 //blue
0 0 0 1 0 //alpha

Bu matris matrisini (zaman, hiçbir değişiklik uygulamalı yapar) ve Numaraları 1 ile 0 arasında değişir (yüzer). Bu matris, her bir piksel ile yeni bir renge dönüştürmek için çarpılacaktır. Bu benim için bulanmaya başlıyor. Her piksel x 4 vektör 1 olur dönüşüm matrisi ile noktalı olacağını türlerinin değerleri (*örneğin 5*) içeren düşünürdüm. Böylece görüntünün kırmızı yoğunluğu iki katına, bir matris gibi kullanabilirsiniz:

2 0 0 0 0 
0 1 0 0 0 
0 0 1 0 0 
0 0 0 1 0 

bir vektör (renk) 0.4, 0.5, 0.8, 1 verecek. Sınırlı test, bu durum gibi görünüyor ve düzgün çalışıyor, ama aslında hala aynı sorun (yani beyazlar elde boyama) ile sonuna kadar. Daha fazla okuma bu RGB değerlerini, dönüşüm yapıyor, renk tonu için ise değişen çünkü, değerleri ilk amaçla kullanılan değerlere dönüştürülmesi gerektiğini söyledi. Bu yüzden muhtemelen resim okuma ve renkleri dönüştürmek ve yeni renkleri ile resim çizmeye bir sınıf yazabilirim. Bu kod, bunların her biri ve hepsi de değiştirme hakkında gitmek nasıl emin değilim gibi StateListDrawables BAŞKA bir sorun oluşturur ve yavaş bir süreç olacaktır. :/

Peki, ben bir soru matrisi başka bir renk alanı için RGB dönüştürmek için kullanılabilir olup olmadığını parlaklığı bilgileri, L**b ya da bir amaçla kullanılan ile sanırım? Eğer öyleyse, sadece o dönüşümü için matris çarpma, matris renk düzeltme yapmak, ColorFilter olarak bu matrisi uygulayın.

CEVAP
27 EKİM 2011, PERŞEMBE


Bu benim oyun için kullanıyorum. Bu bölüm çeşitli derleme web sitelerinde çeşitli yazılar bulundu. Kredi @bağlantılara bakın orijinal yazarı için de geçerli. Çok fazla renk matris ile yapılabilir unutmayın. Tersine çevirme, vb dahil olmak üzere...

public class ColorFilterGenerator
{
    /**
 * Creates a HUE ajustment ColorFilter
 * @see http://groups.google.com/group/android-developers/browse_thread/thread/9e215c83c3819953
 * @see http://gskinner.com/blog/archives/2007/12/colormatrix_cla.html
 * @param value degrees to shift the hue.
 * @return
 */
public static ColorFilter adjustHue( float value )
{
    ColorMatrix cm = new ColorMatrix();

    adjustHue(cm, value);

    return new ColorMatrixColorFilter(cm);
}

/**
 * @see http://groups.google.com/group/android-developers/browse_thread/thread/9e215c83c3819953
 * @see http://gskinner.com/blog/archives/2007/12/colormatrix_cla.html
 * @param cm
 * @param value
 */
public static void adjustHue(ColorMatrix cm, float value)
{
    value = cleanValue(value, 180f) / 180f * (float) Math.PI;
    if (value == 0)
    {
        return;
    }
    float cosVal = (float) Math.cos(value);
    float sinVal = (float) Math.sin(value);
    float lumR = 0.213f;
    float lumG = 0.715f;
    float lumB = 0.072f;
    float[] mat = new float[]
    { 
            lumR   cosVal * (1 - lumR)   sinVal * (-lumR), lumG   cosVal * (-lumG)   sinVal * (-lumG), lumB   cosVal * (-lumB)   sinVal * (1 - lumB), 0, 0, 
            lumR   cosVal * (-lumR)   sinVal * (0.143f), lumG   cosVal * (1 - lumG)   sinVal * (0.140f), lumB   cosVal * (-lumB)   sinVal * (-0.283f), 0, 0,
            lumR   cosVal * (-lumR)   sinVal * (-(1 - lumR)), lumG   cosVal * (-lumG)   sinVal * (lumG), lumB   cosVal * (1 - lumB)   sinVal * (lumB), 0, 0, 
            0f, 0f, 0f, 1f, 0f, 
            0f, 0f, 0f, 0f, 1f };
    cm.postConcat(new ColorMatrix(mat));
}

protected static float cleanValue(float p_val, float p_limit)
{
    return Math.min(p_limit, Math.max(-p_limit, p_val));
}
}

Bu tam bir örnek eklemek gerekir:

ImageView Sun = (ImageView)findViewById(R.id.sun);
Sun.setColorFilter(ColorFilterGenerator.adjustHue(162));

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Amir Parmar

    Amir Parmar

    25 Kasım 2010
  • DominicFear

    DominicFear

    30 Kasım 2006
  • Google Chrome

    Google Chrom

    1 EYLÜL 2008