// We compress horizontally first, then vertically // which I think may be the fastest way. // // Up to 7 pixel columns and 7 pixel rows may be discarded // (those not fitting in an 8x8 block). The discarded pixels are // along the right and bottom border of the image, respectively. 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 = this.w2 = w/scaleX, h2 = this.h2 = h/scaleY; int[] newPixels = horizontallyScaledPixels = new int[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 } void scaleVertically { int scaleX = 8, scaleY = scaleX; int[] pixels = horizontallyScaledPixels; int[] newPixels = finalPixels = new int[w2*h2]; int iRow = 0, iOut = 0; for (int y = 0; y < h2; y++) { int iIn = iRow; for x to w2: { int r = 0, g = 0, b = 0; int iIn2 = iIn; for subY to 8: { int rgb = pixels[iIn2]; iIn2 += w2; r += (rgb >> 16) & 0xFF; g += (rgb >> 8) & 0xFF; b += rgb & 0xFF; } iIn++; newPixels[iOut++] = rgbIntFullAlpha(r/scaleX, g/scaleX, b/scaleX); } iRow += w2*scaleY; } // for y } BufferedImage get(BufferedImage img) { scaleHorizontally(img); scaleVertically(); ret get(); } BufferedImage get() { ret bufferedImage(w2, h2, finalPixels); } }
Began life as a copy of #1035216
download show line numbers debug dex old transpilations
Travelled to 3 computer(s): bhatertpkbcr, mowyntqkapby, mqqgnosmbjvj
No comments. add comment
Snippet ID: | #1035218 |
Snippet name: | FastDownscale8x8 (working backup) - downscales each 8x8 block of a color BufferedImage to one pixel |
Eternal ID of this version: | #1035218/1 |
Text MD5: | 7f49a33074b81b2abcbb9d9a3ec1bb50 |
Author: | stefan |
Category: | javax |
Type: | JavaX fragment (include) |
Public (visible to everyone): | Yes |
Archived (hidden from active list): | No |
Created/modified: | 2022-04-15 18:14:52 |
Source code size: | 2233 bytes / 87 lines |
Pitched / IR pitched: | No / No |
Views / Downloads: | 140 / 153 |
Referenced in: | [show references] |