Быстрое размытие

  1. public static Image smooth(Image img, int blurHor, int blurVer) {
  2.     int w = img.getWidth();
  3.     int h = img.getHeight();
  4.     int[] pix = new int[w * h];
  5.  
  6.     img.getRGB(pix, 0, w, 0, 0, w, h);
  7.  
  8.     int[] pixel = new int[pix.length];
  9.  
  10.     pixel = BoxBlur(pix, pixel, w, h, blurHor);
  11.     pix = BoxBlur(pixel, pix, h, w, blurVer);
  12.  
  13.     return Image.createRGBImage(pix, w, h, false);
  14. }
  15.  
  16. private static int[] BoxBlur(int[] in, int[] out, int width, int height, int radius) {
  17.     if (radius <= 0) {
  18.         return in;
  19.     }
  20.  
  21.     int widthMinus1 = width - 1;
  22.     int tableSize = 2 * radius + 1;
  23.     int divideLength = 256 * tableSize;
  24.     int[] divide = new int[divideLength];
  25.  
  26.     for (int i = 0; i < divideLength; i++) {
  27.         divide[i] = i / tableSize;
  28.     }
  29.  
  30.     int inIndex = 0;
  31.  
  32.     for (int y = 0; y < height; y++) {
  33.         int outIndex = y;
  34.         int tr = 0, tg = 0, tb = 0;
  35.  
  36.         for (int i = -radius; i <= radius; i++) {
  37.             int rgb = in[inIndex + clamp(i, 0, widthMinus1)];
  38.  
  39.             tr += (rgb >> 16) & 0xff;
  40.             tg += (rgb >> 8) & 0xff;
  41.             tb += rgb & 0xff;
  42.         }
  43.  
  44.         for (int x = 0; x < width; x++) {
  45.             out[outIndex] = (255 << 24) | (divide[tr] << 16) | (divide[tg] << 8) | divide[tb];
  46.  
  47.             int i1 = x + radius + 1;
  48.             if (i1 > widthMinus1) i1 = widthMinus1;
  49.  
  50.             int i2 = x - radius;
  51.             if (i2 < 0) i2 = 0;
  52.  
  53.             int rgb1 = in[inIndex + i1];
  54.             int rgb2 = in[inIndex + i2];
  55.  
  56.             tr += ((rgb1 & 0xff0000) - (rgb2 & 0xff0000)) >> 16;
  57.             tg += ((rgb1 & 0xff00) - (rgb2 & 0xff00)) >> 8;
  58.             tb += (rgb1 & 0xff) - (rgb2 & 0xff);
  59.             outIndex += height;
  60.         }
  61.  
  62.         inIndex += width;
  63.     }
  64.  
  65.     return out;
  66. }
  67.  
  68. private static int clamp(int x, int a, int b) {
  69.     return (x < a) ? a : (x > b) ? b : x;
  70. }
BoxBlur - один из самых быстрых алгоритмов размытия. Можно заметно ускорить процесс, если убрать один из проходов размытия (вертикальный или горизонтальный).

Реклама

Мы в соцсетях

tw tg yt gt