본문 바로가기
Development/Android

[안드로이드][이미지처리] 이미지 블러처리

by 푸민 2015. 11. 11.
반응형


안녕하세요 푸민입니다.

이미지 블러 처리하는 메소드 공유합니다.

아직 제가 완전히 분석하지는 못했는데요.

아마도 가우시안 블러로 하지 않았나 싶네요!

나중에 분석하면 분석한 자료도 올리겠습니다!


private void colorSetBlurJava(int radius) {

int wm = WIDTH -1;

int hm = HEIGHT -1;

int wh = WIDTH * HEIGHT;

int div = radius + radius +1;


int r[] = new int[wh];

int g[] = new int[wh];

int b[] = new int[wh];

int rsum,gsum,bsum,x,y,i,p,yp,yi,yw;

int vmin[] = new int[Math.max(WIDTH, HEIGHT)];


int divsum = (div + 1) >> 1;

divsum *= divsum;

int dv[] = new int[256 * divsum];

for (i = 0; i < 256 * divsum; i++) {

dv[i] = (i / divsum);

}


yw = yi = 0;


int[][] stack = new int[div][3];

int stackpointer;

int stackstart;

int[] sir;

int rbs;

int r1 = radius + 1;

int routsum, goutsum, boutsum;

int rinsum, ginsum, binsum;


for (y = 0; y < HEIGHT; y++) {

rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0;

for (i = -radius; i <= radius; i++) {

p = pixels[yi + Math.min(wm, Math.max(i, 0))];

sir = stack[i + radius];

sir[0] = (p & 0xff0000) >> 16;

sir[1] = (p & 0x00ff00) >> 8;

sir[2] = (p & 0x0000ff);

rbs = r1 - Math.abs(i);

rsum += sir[0] * rbs;

gsum += sir[1] * rbs;

bsum += sir[2] * rbs;

if (i > 0) {

rinsum += sir[0];

ginsum += sir[1];

binsum += sir[2];

} else {

routsum += sir[0];

goutsum += sir[1];

boutsum += sir[2];

}

}

stackpointer = radius;


for (x = 0; x < WIDTH; x++) {

r[yi] = dv[rsum];

g[yi] = dv[gsum];

b[yi] = dv[bsum];


rsum -= routsum;

gsum -= goutsum;

bsum -= boutsum;


stackstart = stackpointer - radius + div;

sir = stack[stackstart % div];


routsum -= sir[0];

goutsum -= sir[1];

boutsum -= sir[2];


if (y == 0) {

vmin[x] = Math.min(x + radius + 1, wm);

}

p = pixels[yw + vmin[x]];


sir[0] = (p & 0xff0000) >> 16;

sir[1] = (p & 0x00ff00) >> 8;

sir[2] = (p & 0x0000ff);


rinsum += sir[0];

ginsum += sir[1];

binsum += sir[2];


rsum += rinsum;

gsum += ginsum;

bsum += binsum;


stackpointer = (stackpointer + 1) % div;

sir = stack[(stackpointer) % div];


routsum += sir[0];

goutsum += sir[1];

boutsum += sir[2];


rinsum -= sir[0];

ginsum -= sir[1];

binsum -= sir[2];


yi++;

}

yw += WIDTH;

}


for (x = 0; x < WIDTH; x++) {

rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0;

yp = -radius * WIDTH;

for (i = -radius; i <= radius; i++) {

yi = Math.max(0, yp) + x;


sir = stack[i + radius];


sir[0] = r[yi];

sir[1] = g[yi];

sir[2] = b[yi];


rbs = r1 - Math.abs(i);


rsum += r[yi] * rbs;

gsum += g[yi] * rbs;

bsum += b[yi] * rbs;


if (i > 0) {

rinsum += sir[0];

ginsum += sir[1];

binsum += sir[2];

} else {

routsum += sir[0];

goutsum += sir[1];

boutsum += sir[2];

}


if (i < hm) {

yp += WIDTH;

}

}

yi = x;

stackpointer = radius;

for (y = 0; y < HEIGHT; y++) {

// Preserve alpha channel: ( 0xff000000 & pix[yi] )

dumy[yi] = (0xff000000 & pixels[yi]) | (dv[rsum] << 16) | (dv[gsum] << 8) | dv[bsum];


rsum -= routsum;

gsum -= goutsum;

bsum -= boutsum;


stackstart = stackpointer - radius + div;

sir = stack[stackstart % div];


routsum -= sir[0];

goutsum -= sir[1];

boutsum -= sir[2];


if (x == 0) {

vmin[y] = Math.min(y + r1, hm) * WIDTH;

}

p = x + vmin[y];


sir[0] = r[p];

sir[1] = g[p];

sir[2] = b[p];


rinsum += sir[0];

ginsum += sir[1];

binsum += sir[2];


rsum += rinsum;

gsum += ginsum;

bsum += binsum;


stackpointer = (stackpointer + 1) % div;

sir = stack[stackpointer];


routsum += sir[0];

goutsum += sir[1];

boutsum += sir[2];


insum -= sir[0];

ginsum -= sir[1];

binsum -= sir[2];


yi += WIDTH;

}

}

}


반응형

댓글