2010-11-10 4 views

Antwort

5

weiß, dass ich die Antwort, aber vielleicht, wenn einige haben andere bessere Lösung ..

public Bitmap toSephia(Bitmap bmpOriginal) 
{   
    int width, height, r,g, b, c, gry; 
    height = bmpOriginal.getHeight(); 
    width = bmpOriginal.getWidth(); 
    int depth = 20; 

    Bitmap bmpSephia = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); 
    Canvas canvas = new Canvas(bmpSephia); 
    Paint paint = new Paint(); 
    ColorMatrix cm = new ColorMatrix(); 
    cm.setScale(.3f, .3f, .3f, 1.0f); 
    ColorMatrixColorFilter f = new ColorMatrixColorFilter(cm); 
    paint.setColorFilter(f); 
    canvas.drawBitmap(bmpOriginal, 0, 0, paint); 
    for(int x=0; x < width; x++) { 
     for(int y=0; y < height; y++) { 
      c = bmpOriginal.getPixel(x, y); 

      r = Color.red(c); 
      g = Color.green(c); 
      b = Color.blue(c); 

      gry = (r + g + b)/3; 
      r = g = b = gry; 

      r = r + (depth * 2); 
      g = g + depth; 

      if(r > 255) { 
       r = 255; 
      } 
      if(g > 255) { 
       g = 255; 
      } 
      bmpSephia.setPixel(x, y, Color.rgb(r, g, b)); 
     } 
    }  
    return bmpSephia; 
} 
+1

Dies wird zu mehr Verarbeitungszeit, wenn das Bildpixel ist mehr so ​​jeder andere Weg ist da? – blackjack

+1

View this Gist https://gist.github.com/pmcfernandes/8261130 – pedrofernandes

+0

Diese Methode schlägt auf transparente Pixel –

18

Wenn Sie Instanz Bild haben, dann können Sie ColorMartix verwenden es in Sepia zu ziehen. Lassen Sie mich beschreiben, wie Sie Drawable verwenden können.

public static void setSepiaColorFilter(Drawable drawable) { 
    if (drawable == null) 
    return; 

    final ColorMatrix matrixA = new ColorMatrix(); 
    // making image B&W 
    matrixA.setSaturation(0); 

    final ColorMatrix matrixB = new ColorMatrix(); 
    // applying scales for RGB color values 
    matrixB.setScale(1f, .95f, .82f, 1.0f); 
    matrixA.setConcat(matrixB, matrixA); 

    final ColorMatrixColorFilter filter = new ColorMatrixColorFilter(matrixA); 
    drawable.setColorFilter(filter); 
} 

Beispielprojekt wurde Bitbucket-GitHub bewegt. Bitte überprüfen Sie Release section, APK-Binärdatei zum Testen ohne Kompilierung herunterladen.

enter image description here

+0

Wie bekomme ich ColorMatric für mehr Effekte, wie Neon, Indiglow, Aqua, lebendige, etc, warten auf verwandten Link/hinweis/guide ... –

+0

Sie müssen entsprechende Farbmatrixwerte finden, um diesen Effekt zu erhalten. Sorry, aber ich kenne keine Ressource, wo Sie es finden können. Bitte posten Sie es hier, wenn Sie etwas Nützliches finden. Danke – rude

+2

Ich fand das für ColorMatrix, und setze simillar Werte für meine erforderlichen Farbeffekte. http://docs.rainmeter.net/tips/colormatrix-guide –

0

Ich habe auf the OP's answer verbessert. Dies läuft kompetitiv schnell im Vergleich zu the ColorMatrix method, aber produziert einen schöneren braunen Ton. (meiner Meinung nach)

public Bitmap toSepiaNice(Bitmap color) { 
    int red, green, blue, pixel, gry; 
    int height = color.getHeight(); 
    int width = color.getWidth(); 
    int depth = 20; 

    Bitmap sepia = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); 

    int[] pixels = new int[width * height]; 
    color.getPixels(pixels, 0, width, 0, 0, width, height); 
    for (int i = 0; i < pixels.length; i++) { 
     pixel = pixels[i]; 

     red = (pixel >> 16) & 0xFF; 
     green = (pixel >> 8) & 0xFF; 
     blue = pixel & 0xFF; 

     red = green = blue = (red + green + blue)/3; 

     red += (depth * 2); 
     green += depth; 

     if (red > 255) 
      red = 255; 
     if (green > 255) 
      green = 255; 
     pixels[i] = (0xFF << 24) | (red << 16) | (green << 8) | blue; 
    } 
    sepia.setPixels(pixels, 0, width, 0, 0, width, height); 
    return sepia; 
}