2011-07-19 5 views
3

の画像は、私が使用:ブラーは、私は、画像をぼかしたいアンドロイド

public Bitmap mohu(Bitmap bmpOriginal,int hRadius,int vRadius) { 
    int width, height, r,g, b, c,a, gry,c1,a1,r1,g1,b1,red,green,blue; 
    height = bmpOriginal.getHeight(); 
    width = bmpOriginal.getWidth(); 


    int iterations = 5; 
    int[] inPixels = new int[width*height]; 
    int[] outPixels = new int[width*height]; 
     Bitmap bmpSephia = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565); 
     Canvas canvas = new Canvas(bmpSephia); 
     Paint paint = new Paint(); 
     int i=0; 
     canvas.drawBitmap(bmpOriginal, 0, 0, null); 
     for(int x=0; x < width; x++) { 
      for(int y=0; y< height; y++) { 
       c = bmpOriginal.getPixel(x, y); 
       inPixels[i]=c; 
       i++; 
      } 
     }  

     for (int k = 0; k< iterations; k++) { 
      blur(inPixels, outPixels, width, height, hRadius); 
      blur(outPixels, inPixels, height, width, vRadius); 
     } 
     bmpSephia.setPixels(outPixels, 0, width, 0, 0, width, height); 
     return bmpSephia; 
    } 
public static void blur(int[] in, int[] out, int width, int height, int radius) { 
    int widthMinus1 = width-1; 
    int tableSize = 2*radius+1; 
    int divide[] = new int[256*tableSize]; 

    for (int i = 0; i < 256*tableSize; i++) 
     divide[i] = i/tableSize; 

    int inIndex = 0; 

    for (int y = 0; y < height; y++) { 
     int outIndex = y; 
     int ta = 0, tr = 0, tg = 0, tb = 0; 

     for (int i = -radius; i <= radius; i++) { 
      int rgb = in[inIndex + ImageMath.clamp(i, 0, width-1)]; 
      ta += (rgb >> 24) & 0xff; 
      tr += (rgb >> 16) & 0xff; 
      tg += (rgb >> 8) & 0xff; 
      tb += rgb & 0xff; 
     } 

     for (int x = 0; x < width; x++) { 
      out[ outIndex ] = (divide[ta] << 24) | (divide[tr] << 16) | (divide[tg] << 8) | divide[tb]; 

      int i1 = x+radius+1; 
      if (i1 > widthMinus1) 
       i1 = widthMinus1; 
      int i2 = x-radius; 
      if (i2 < 0) 
       i2 = 0; 
      int rgb1 = in[inIndex+i1]; 
      int rgb2 = in[inIndex+i2]; 

      ta += ((rgb1 >> 24) & 0xff)-((rgb2 >> 24) & 0xff); 
      tr += ((rgb1 & 0xff0000)-(rgb2 & 0xff0000)) >> 16; 
      tg += ((rgb1 & 0xff00)-(rgb2 & 0xff00)) >> 8; 
      tb += (rgb1 & 0xff)-(rgb2 & 0xff); 
      outIndex += height; 
     } 
     inIndex += width; 

    } 
} 
/// 
    public static float clamp(float x, float a, float b) { 
    return (x < a) ? a : (x > b) ? b : x; 
} 

一部の画像のための方法は、.theの効果がないだけでなく、OT非常に失礼に見えるいくつかのイメージのために、あなたが私に与えることができ、良いですいくつかのアドバイス、私はhttp://www.jhlabs.com/ip/blurring.htmlhttp://java.sun.com/products/java-media/jai/forDevelopers/jai1_0_1guide-unc/Image-enhance.doc.html#51172を読んだが、私はアンドロイドのための良い方法が見つかりません

+1

あなたがこれを確認しましたか? http://stackoverflow.com/questions/4276967/blurring-an-image-in-android –

+0

はい、私はそれを読むが、donotはそれを修正する方法を知っている – pengwang

+0

@pengwangあなたが私に "ImageMath " –

答えて

2

あなたの中間イメージはRGB565です。これは、16ビット、Rの場合は5ビット、Gの場合は6ビット、Bの場合は5ビットを意味します。元の画像がRGB888の場合、ぼかし後は悪く見えます。元の画像と同じ形式で中間画像を作成できませんか?

また、元の画像がRGB888の場合、565にどのように変換されますか?あなたのコードは:

c = bmpOriginal.getPixel(x, y); 
inPixels[i]=c; 

制御された変換がないようです。

あなたのぼかし機能はARGB画像用です。 565のためにハードコードされているので非効率的であるだけでなく、元の画像がARGB8888の場合、RGB565への変換はアルファチャンネルで奇妙なことをするでしょう。

この回答では不十分な場合は、このコードで作成されたいくつかの「悪い」画像を確認すると役立ちます。

+0

あなたの答えをありがとう、私はあなたが正しいと思います、それは画像の種類に対処できるように他の方法を与えることができますか? – pengwang

+0

Android APIについてはわかりませんが、このコードを改善できると思います。たとえば、「ビットマップbmpSephia = Bitmap.createBitmap(width、height、bmpOriginal.GetConfig());」というように変更します。また、アルファチャンネルをぼかすかどうかを検討してください(存在する場合)。 – koan

+0

ありがとう、設定は4つ、私はすべての1つをテストするが、結果はよく、私はまたあなたに感謝。私は他の方法を見つける必要があります、ありがとう – pengwang

関連する問題