2017-12-16 117 views
5

Có thể thay đổi số dư màu của bản vẽ?Thay đổi số dư màu của một Có thể rút ra

Ví dụ, tôi muốn chuyển đổi
enter image description here to =>enter image description here

tôi cố gắng này, nhưng nó thay đổi tất cả các màu sắc của drawable của tôi để một màu duy nhất:

 Drawable drawable; // my drawable 
     float r = Color.red(110)/255f; 
     float g = Color.green(150)/255f; 
     float b = Color.blue(200)/255f; 

     ColorMatrix cm = new ColorMatrix(new float[] { 
       // Change red channel 
       r, 0, 0, 0, 0, 
       // Change green channel 
       0, g, 0, 0, 0, 
       // Change blue channel 
       0, 0, b, 0, 0, 
       // Keep alpha channel 
       0, 0, 0, 1, 0, 
     }); 
     ColorMatrixColorFilter cf = new ColorMatrixColorFilter(cm); 

     drawable.setColorFilter(cf); 

tôi chỉ định Tôi không muốn để chia hình ảnh src của tôi thành 2 hoặc nhiều lớp và tô màu một trong số chúng.

+1

bạn cần phải chia ảnh src thành 2 hoặc nhiều lớp và tô màu một trong số chúng – pskink

+0

đó là cách duy nhất? :( –

+0

tôi cũng nghĩ rằng có một số thuật toán cho điều đó nhưng tôi không nghĩ rằng họ là đơn giản và ngắn ... – pskink

Trả lời

1

Bạn có thể áp dụng một màu với màu sắc mong muốn hình ảnh của bạn sử dụng mutate().setColorFilter(), và thiết lập các drawable với màu sắc mới vào ImageView của bạn:

ImageView imgImagen = (ImageView)findViewById(R.id.myImageView); 
    Drawable myImage = getResources().getDrawable(R.drawable.boy); 
    //Using red color. 
    myImage.mutate().setColorFilter(0xffff0000, PorterDuff.Mode.MULTIPLY); 
    imgImagen.setImageDrawable(myImage); 

Ví dụ sử dụng ImageView này,

<ImageView 
     android:id="@+id/myImageView" 
     android:layout_width="150dp" 
     android:layout_height="150dp" 
     android:src="@drawable/boy" 
     android:contentDescription="" /> 

bạn sẽ có hình ảnh này như là kết quả:

enter image description here

Bạn có thể sử dụng quá màu sắc được xác định trong ví dụ của bạn:

myImage.mutate().setColorFilter(Color.argb(255, 110, 150, 200), PorterDuff.Mode.MULTIPLY); 
0

Tôi có thể thấy rằng nhân vật của bạn có mắt và một số thuộc tính mà cần phải được an toàn trong quá trình thay đổi màu sắc, vì vậy chúng ta cần kiểm soát nhiều hơn về tài nguyên mà do đó chúng tôi sẽ chuyển nó sang bitmap:

Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.brown_man); 

bitmap của bạn có thể không có thể thay đổi như vậy để làm cho nó có thể thay đổi:

Bitmap myBitmap = bitmap.copy(Bitmap.Config.RGB_565, true); 

Sau đó, chúng ta phải getPixels() Và lại setPixels() với màu sắc đã chỉ định:

int[] pixels = new int[myBitmap.getHeight() * myBitmap.getWidth()]; 
    myBitmap.getPixels(pixels, 0, myBitmap.getWidth(), 0, 0, myBitmap.getWidth(), myBitmap.getHeight()); 

    for (int i = 0; i < pixels.length; i++) { 

     if (pixels[i] == color /*Color to change int value*/) 
      pixels[i] = newColor /*The new color you want to change*/; 
    } 
    myBitmap.setPixels(pixels, 0, myBitmap.getWidth(), 0, 0, myBitmap.getWidth(), myBitmap.getHeight()); 

Vì vậy, bạn có thể sử dụng bitmap này như bạn muốn.

Một số điều cần xem xét đưa:

  • nhân vật tài nguyên của bạn phải có một màu độ phân giải cao để làm cho nó dễ dàng để xác định và thay đổi.
Các vấn đề liên quan