2011-12-05 43 views
24

Xin chào các bạn Tôi cần sự giúp đỡ của bạn, tôi đang cố gắng chuyển đổi hình ảnh màu thành màu xám bằng cách sử dụng trung bình của màu đỏ, xanh lục, xanh lam. Nhưng nói ra có lỗi,Android: Chuyển đổi hình ảnh màu thành màu xám

Đây là mã của tôi

imgWidth = myBitmap.getWidth(); 
imgHeight = myBitmap.getHeight(); 

for(int i =0;i<imgWidth;i++) { 
    for(int j=0;j<imgHeight;j++) { 
    int s = myBitmap.getPixel(i, j)/3; 
    myBitmap.setPixel(i, j, s); 
    } 
} 

ImageView img = (ImageView)findViewById(R.id.image1); 
img.setImageBitmap(myBitmap); 

Nhưng khi tôi chạy ứng dụng của tôi trên Emulator, đó là lực lượng chặt chẽ. Bất kỳ ý tưởng?

Tôi đã giải quyết vấn đề của tôi sử dụng đoạn mã sau:

for(int x = 0; x < width; ++x) { 
      for(int y = 0; y < height; ++y) { 
       // get one pixel color 
       pixel = src.getPixel(x, y); 
       // retrieve color of all channels 
       A = Color.alpha(pixel); 
       R = Color.red(pixel); 
       G = Color.green(pixel); 
       B = Color.blue(pixel); 
       // take conversion up to one single value 
       R = G = B = (int)(0.299 * R + 0.587 * G + 0.114 * B); 
       // set new pixel color to output bitmap 
       bmOut.setPixel(x, y, Color.argb(A, R, G, B)); 
      } 
     } 
+1

Nhật ký lỗi đăng bài lỗi là gì. – user370305

+0

Bạn có gặp phải lỗi chính xác nào trong nhật ký không? chẳng hạn như stackoverflow? – doNotCheckMyBlog

Trả lời

29

Hãy thử giải pháp from this previous answer by leparlon:

public Bitmap toGrayscale(Bitmap bmpOriginal) 
    {   
     int width, height; 
     height = bmpOriginal.getHeight(); 
     width = bmpOriginal.getWidth();  

     Bitmap bmpGrayscale = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565); 
     Canvas c = new Canvas(bmpGrayscale); 
     Paint paint = new Paint(); 
     ColorMatrix cm = new ColorMatrix(); 
     cm.setSaturation(0); 
     ColorMatrixColorFilter f = new ColorMatrixColorFilter(cm); 
     paint.setColorFilter(f); 
     c.drawBitmap(bmpOriginal, 0, 0, paint); 
     return bmpGrayscale; 
    } 
+1

Làm cách nào để tôi có thể làm sáng hình ảnh? Hình ảnh hiện có màu xám, nhưng nó cũng tối vì các màu trong hình ảnh gốc. – Andrew

+0

vì vậy sau khi chuyển đổi sang màu đen và trắng, kích thước hình ảnh sẽ giảm? (size in kb) –

+0

Lalit có thể cho tôi biết làm thế nào chúng ta có thể trích xuất nhân vật từ hình ảnh thang độ xám? –

11

Lalit có câu trả lời thiết thực nhất. Tuy nhiên, bạn muốn kết quả xám là mức trung bình của màu đỏ, xanh lá cây và xanh da trời và nên thiết lập ma trận của bạn như vậy:

float oneThird = 1/3f; 
    float[] mat = new float[]{ 
      oneThird, oneThird, oneThird, 0, 0, 
      oneThird, oneThird, oneThird, 0, 0, 
      oneThird, oneThird, oneThird, 0, 0, 
      0, 0, 0, 1, 0,}; 
    ColorMatrixColorFilter filter = new ColorMatrixColorFilter(mat); 
    paint.setColorFilter(filter); 
    c.drawBitmap(original, 0, 0, paint); 

Và cuối cùng, như tôi đã phải đối mặt với vấn đề chuyển đổi một hình ảnh để trắng đen trước - kết quả làm hài lòng thị giác nhất trong tất cả các trường hợp được thực hiện bằng cách không lấy trung bình, nhưng bằng cách cho mỗi màu trọng lượng khác nhau tùy thuộc vào độ sáng percieved của nó, tôi có xu hướng sử dụng các giá trị:

float[] mat = new float[]{ 
      0.3f, 0.59f, 0.11f, 0, 0, 
      0.3f, 0.59f, 0.11f, 0, 0, 
      0.3f, 0.59f, 0.11f, 0, 0, 
      0, 0, 0, 1, 0,}; 
+0

@ user1324936 cẩn thận để xây dựng? – Jave

65

Bạn có thể làm điều này quá:

ColorMatrix matrix = new ColorMatrix(); 
    matrix.setSaturation(0); 

    ColorMatrixColorFilter filter = new ColorMatrixColorFilter(matrix); 
    imageview.setColorFilter(filter); 
+0

Có thể làm cho nó chỉ toàn màu đen (0xff000000) và đầy đủ màu trắng (0xffffffff)? –

+0

@androiddeveloper Bạn có thể làm điều đó với phương pháp setColorFilter (màu, chế độ) tích hợp của ImageView hoặc một PorterDuffColorFilter thông thường. http://developer.android.com/reference/android/graphics/PorterDuffColorFilter.html – Pkmmte

+0

@Pkmmte PorterDuffColorFilter thông thường là gì? –

Các vấn đề liên quan