2011-12-05 15 views
24

Witajcie, potrzebuję waszej pomocy, staram się przekonwertować obraz kolorowy na skalę szarości, korzystając ze średniej czerwieni, zieleni i błękitu. Ale to wychodzi z błędami,Android: Konwersja obrazu kolorowego na skalę szarości

Oto mój kod

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); 

ale gdy uruchomię mojej aplikacji na emulatorze, to siła blisko. Dowolny pomysł?

Mam rozwiązać mój problem należy użyć następującego kodu:

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

Co to jest dziennik błędów po błędzie. – user370305

+0

Czy otrzymujesz dokładny błąd w dzienniku? takie jak stackoverflow? – doNotCheckMyBlog

Odpowiedz

29

Spróbuj rozwiązanie 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

Jak mogę rozjaśnić obraz? Obraz jest teraz szary, ale jest również ciemny ze względu na kolory w oryginalnym obrazie. – Andrew

+0

, więc po konwersji na czarno-biały zmniejszysz rozmiar obrazu? (rozmiar w kb) –

+0

Lalit może mi powiedzieć, jak możemy wydobyć postać z obrazu w skali szarości? –

11

Lalit ma odpowiedź najbardziej praktyczne. Jednak, chciałeś otrzymany szary być średnią z czerwonym, zielonym i niebieskim i powinien skonfigurować macierz tak:

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); 

I wreszcie, jak mam do czynienia z problemem konwersję obrazu do skali szarości przed - najbardziej wizualnie przyjemny wynik we wszystkich przypadkach uzyskuje się przez nie przyjmując średnią, ale poprzez dawanie każdy kolor inną wagę w zależności od jego percieved jasności, staram się korzystać z tych wartości:

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 opieki do opracowania? – Jave

65

można to zrobić też:

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

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

Czy jest możliwe, aby był tylko całkowicie czarny (0xff000000) i całkowicie biały (0xffffffff)? –

+0

@androiddeveloper Możesz to zrobić za pomocą wbudowanej w ImageView metody setColorFilter (kolor, tryb) lub zwykłego PorterDuffColorFilter. http://developer.android.com/reference/android/graphics/PorterDuffColorFilter.html – Pkmmte

+0

@Pkmmte Co to jest zwykły PorterDuffColorFilter? –

Powiązane problemy