import com.badlogic.gdx.graphics.Pixmap; public class Blur { public static void blurImage(int radius, Pixmap pixmap, int width, int height, int rectx, int recty, int rectw, int recth) { int w = pixmap.getWidth(); int h = pixmap.getHeight(); int xoffset = 0; int yoffset = 0; if (width > w) { width = w; } if (height > h) { height = h; } w = width; h = height; if (rectx > width) { rectx = 0; } if (recty > height) { recty = 0; } if (rectx + rectw > width) { rectw = width - rectx; } if (recty + recth > height) { recth = height - recty; } xoffset = rectx; yoffset = recty; w = rectw; h = recth; // mwxx red border around //pixmap.setColor(1, 0, 0, 1); pixmap.drawRectangle(xoffset, yoffset, w, h); int wm = w - 1; int hm = h - 1; int wh = w * h; 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[(int) Math.max(w, h)]; 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 < h; y++) { rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0; for (i = -radius; i <= radius; i++) { int index = yi + Math.min(wm, (int) Math.max(i, 0)); int yy = (int) (index / w); int xx = (int) (index % h); // 32-bit RGBA8888 p = pixmap.getPixel(xx + xoffset, yy + yoffset); int mask = p & 0xFFFFFFFF; int rr = (mask >> 24) & 0xff; int gg = (mask >> 16) & 0xff; int bb = (mask >> 8) & 0xff; sir = stack[i + radius]; sir[0] = rr; sir[1] = gg; sir[2] = bb; rbs = r1 - (int) 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 < w; 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); } int index = yw + vmin[x]; int yy = (int) (index / w); int xx = (int) (index % h); // 32-bit RGBA8888 p = pixmap.getPixel(xx + xoffset, yy + yoffset); int mask = p & 0xFFFFFFFF; int rr = (mask >> 24) & 0xff; int gg = (mask >> 16) & 0xff; int bb = (mask >> 8) & 0xff; sir[0] = rr; sir[1] = gg; sir[2] = bb; 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 += w; } for (x = 0; x < w; x++) { rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0; yp = -radius * w; for (i = -radius; i <= radius; i++) { yi = (int) Math.max(0, yp) + x; sir = stack[i + radius]; sir[0] = r[yi]; sir[1] = g[yi]; sir[2] = b[yi]; rbs = r1 - (int) 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 += w; } } yi = x; stackpointer = radius; for (y = 0; y < h; y++) { int rr = dv[rsum]; int gg = dv[gsum]; int bb = dv[bsum]; pixmap.setColor(rr / 255f, gg / 255f, bb / 255f, 1f); int yy = (int) (yi / w); int xx = (int) (yi % h); pixmap.drawPixel(xx + xoffset, yy + yoffset); 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) * w; } 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]; rinsum -= sir[0]; ginsum -= sir[1]; binsum -= sir[2]; yi += w; } } } }
libGDX图片磨砂玻璃效果
猜你喜欢
转载自mwxx.iteye.com/blog/2081904
今日推荐
周排行