在android上模糊图像

在android上模糊图像,android,graphics,image-processing,Android,Graphics,Image Processing,我想要模糊图像,我使用: 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 iteration

我想要模糊图像,我使用:

    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;
}
公共位图mohu(位图bmpOriginal、int hRadius、int vRadius){
内部宽度、高度、r、g、b、c、a、gry、c1、a1、r1、g1、b1、红色、绿色、蓝色;
高度=bmpOriginal.getHeight();
宽度=bmpOriginal.getWidth();
int迭代次数=5;
int[]inPixels=新int[宽度*高度];
int[]输出像素=新的int[宽度*高度];
位图bmpSephia=Bitmap.createBitmap(宽度、高度、Bitmap.Config.RGB_565);
画布=新画布(bmpSephia);
油漆=新油漆();
int i=0;
drawBitmap(bmpOriginal,0,0,null);
对于(int x=0;x24)&0xff;
tr+=(rgb>>16)&0xff;
tg+=(rgb>>8)&0xff;
tb+=rgb&0xff;
}
对于(int x=0;x>24)和0xff);
tr+=((rgb1&0xff0000)-(rgb2&0xff0000))>>16;
tg+=((rgb1&0xff00)-(rgb2&0xff00))>>8;
tb+=(rgb1和0xff)-(rgb2和0xff);
OUTIDEX+=高度;
}
inIndex+=宽度;
}
}
///
公共静态浮子夹(浮子x、浮子a、浮子b){
返回(xb)~b:x;
}
有些图片的方法很好,有些图片效果不好,ot看起来很粗鲁,你能给我一些建议吗,我已经读过了
还有,但是我找不到适合android的好方法

您的中间图像是RGB565。这意味着16位,R为5位,G为6位,B为5位。如果原始图像是RGB888,则模糊后看起来会很糟糕。不能以与原始图像相同的格式创建中间图像吗

另外,如果原始图像是RGB888,如何将其转换为565?您的代码有:

c = bmpOriginal.getPixel(x, y);
inPixels[i]=c;
看起来没有受控转换

模糊函数用于ARGB图像。由于您硬编码了565,因此效率低下,如果原始图像是argb888,那么您转换为RGB565会对alpha通道产生奇怪的影响


如果这个答案还不够,那么看看这段代码创建的一些“坏”图像会很有帮助。

你看到了吗?是的,我读过,但我不知道如何修改it@pengwang你能告诉我在哪里可以找到“ImageMath”。谢谢你的回答,我认为你是对的,你能给一个其他的方法,使它可以处理各种图像吗?我不知道Android API,但我认为这段代码可以改进。例如,更改为
Bitmap bmpSephia=Bitmap.createBitmap(宽度、高度、bmpOriginal.GetConfig())或类似的东西。此外,考虑是否要模糊alpha通道,如果它存在。谢谢,配置只四,我测试每一个,但结果不好,我也谢谢你。我需要找到其他方法,谢谢你。