sclass FastDownscale8x8 { int w, h, w2, h2; int[] horizontallyScaledPixels, finalPixels; void scaleHorizontally(BufferedImage img) { scaleHorizontally(grabbableIntPixels(img)); } void scaleHorizontally(GrabbableIntPixels gp) { int scaleX = 8, scaleY = scaleX; w = gp.w; int h = this.h = gp.h; int w2 = w/scaleX, h2 = h/scaleY; int[] newPixels = horizontallyScaledPixels = new[w2*h]; int iRow = gp.offset, iOut = 0; int[] pixels = gp.data; for (int y = 0; y < h; y++) { int iIn = iRow; for x to w2: { int r = 0, g = 0, b = 0; for subX to 8: { int rgb = pixels[iIn+subX]; r += (rgb >> 16) & 0xFF; g += (rgb >> 8) & 0xFF; b += rgb & 0xFF; } iIn += 8; newPixels[iOut++] = rgbIntFullAlpha(r/scaleX, g/scaleX, b/scaleX); } iRow += gp.scanlineStride; } // for y } BufferedImage get(BufferedImage img) { scaleHorizontally(img); scaleVertically(); ret get(); } BufferedImage get() { ret bufferedImage(w2, h2, finalPixels); }