Масштабирование картинки

  1. public Image scale(Image src, int width, int height, boolean useAntialiasing) {
  2.     int y, c1, startY, endY, ceilY, x, startX, endX, ceilX;
  3.     int alpha, r, g, b;
  4.     int pixCount, yy, c2, factorY, xx, source, factorX, factor;
  5.     int srcw = src.getWidth();
  6.     int srch = src.getHeight();
  7.     if (srcw == width && srch == height) return src;
  8.     int[] buf = new int[srcw * srch];
  9.     int[] buf2 = new int[width * height];
  10.     src.getRGB(buf, 0, srcw, 0, 0, srcw, srch);
  11.     int scaleX = (srcw << 10) / width;
  12.     int scaleY = (srch << 10) / height;
  13.     for (y = 0; y < height; y++) {
  14.         c1 = y * width;
  15.         startY = y * scaleY;
  16.         endY = startY + scaleY;
  17.         ceilY = Math.min(endY + 1023 >> 10, srch);
  18.         for (x = 0; x < width; x++) {
  19.             if (useAntialiasing) {
  20.                 startX = x * scaleX;
  21.                 endX = startX + scaleX;
  22.                 ceilX = Math.min(endX + 1023 >> 10, srcw);
  23.                 alpha = 0;
  24.                 r = 0;
  25.                 g = 0;
  26.                 b = 0;
  27.                 pixCount = 0;
  28.                 for (yy = startY >> 10; yy < ceilY; yy++) {
  29.                     c2 = yy * srcw;
  30.                     factorY = (yy << 10 < startY) ? (startY - (yy << 10)) : ((yy > ceilY) ? (yy - ceilY << 10) : 1024);
  31.                     for (xx = startX >> 10; xx < ceilX; xx++) {
  32.                         source = buf[c2 + xx];
  33.                         factorX = (xx << 10 < startX) ? (startX - (xx << 10)) : ((xx > ceilX) ? (xx - ceilX << 10) : 1024);
  34.                         factor = Math.max(1, factorX * factorY >> 10);
  35.                         alpha += (source >> 24 & 255) * factor;
  36.                         r += (source >> 16 & 255) * factor;
  37.                         g += (source >> 8 & 255) * factor;
  38.                         b += (source & 255) * factor;
  39.                         pixCount += factor;
  40.                     }
  41.                 }
  42.                 alpha /= pixCount;
  43.                 r /= pixCount;
  44.                 g /= pixCount;
  45.                 b /= pixCount;
  46.                 buf2[c1 + x] = (alpha << 24) + (r << 16) + (g << 8) + b;
  47.             }
  48.             else buf2[c1 + x] = buf[(startY >> 10) * srcw + x * (scaleX >> 10)];
  49.         }
  50.     }
  51.     buf = null;
  52.     return Image.createRGBImage(buf2, width, height, true);
  53. }
Хочу предоставить код для масштабтирования картинки. Код вполне ясен и удобен в использлвании

Реклама

Мы в соцсетях

tw tg yt gt