Libraryless. Click here for Pure Java version (6162L/38K).
final sclass BWIntegralImage implements MakesBufferedImage, IBWIntegralImage { int w, h; int[] data; // 1 entry per pixel ifdef BWIntegralImage_CountAccesses long accesses; endifdef *() {} *(File f) { this(loadImage2(f)); } *(MakesBufferedImage img) { this(toBufferedImage(img)); } //*(BufferedImage img) { this(BWImage(img)); } *(BufferedImage image) ctex { alloc(image.getWidth(), image.getHeight()); // Just grab directly into data array PixelGrabber pixelGrabber = new PixelGrabber(image, 0, 0, w, h, data, 0, w); if (!pixelGrabber.grabPixels()) fail("Could not grab pixels"); int sum = 0; for x to w: { int packed = data[x]; int brightness = packedToBrightness(packed); data[x] = (sum += brightness); } ifdef BWIntegralImage_useVectorAPI import jdk.incubator.vector.*; VectorSpecies<Int> species = IntVector.SPECIES_PREFERRED; int upperBound = species.loopBound(w); endifdef int i = w; for (int y = 1; y < h; y++) { sum = 0; ifdef BWIntegralImage_useVectorAPI int x = 0; for (; x < upperBound; x += species.length(), i += species.length()) { for (int sub = 0; sub < species.length(); sub++) { sum += packedToBrightness(data[i+sub]); data[i+sub] = sum; } IntVector v = IntVector.fromArray(species, data, i); IntVector v_last = IntVector.fromArray(species, data, i-w); v = v.add(v_last); v.intoArray(data, i); } for (; x < w; x++, i++) { int packed = data[i]; int brightness = packedToBrightness(packed); sum += brightness; data[i] = sum + data[i-w]; } endifdef ifndef BWIntegralImage_useVectorAPI for x to w: { int packed = data[i]; int brightness = packedToBrightness(packed); sum += brightness; data[i] = sum + data[i-w]; i++; } endifndef } // for y } *(BWImage img) { alloc(img.w(), img.h()); data = new int[w*h]; int i = 0; for y to h: { int sum = 0; for x to w: { sum += img.getByte(x, y) & 0xFF; data[i] = y > 0 ? sum + data[i-w] : sum; i++; } } } private void alloc(int w, int h) { this.w = w; this.h = h; if (w*h > 8*1024*1024) fail("Image too large (more than 8 MP): " + w + "*" + h); data = new int[w*h]; } // pixels outside of image are considered black int get(int x, int y) { ifdef BWIntegralImage_CountAccesses ++accesses; endifdef ret x < 0 || y < 0 || x >= w || y >= h ? 0 : data[min(y, h-1)*w+min(x, w-1)]; } public int getIIValue(int x, int y) { ret get(x, y); } public double getPixelAverage(int x1, int y1, int x2, int y2) { int area = (x2-x1)*(y2-y1); ret doubleRatio(bwIntegralImage_sumRect(this, x1, y1, x2, y2), area); } int getPixel(int x, int y) { ret bwIntegralImage_sumRect(this, x, y, x+1, y+1); } int getPixel(Pt p) { ret getPixel(p.x, p.y); } public int getWidth() { ret w; } public int getHeight() { ret h; } // unoptimized public BufferedImage getBufferedImage() { ret scaleDownUsingIntegralImageBW(this, w).getBufferedImage(); } int packedToBrightness(int packed) { int b = (packed & 0xFF); ifdef BWIntegralImage_brightnessCheat ret b; endifdef ifndef BWIntegralImage_brightnessCheat int r = ((packed >> 16) & 0xFF); int g = ((packed >> 8) & 0xFF); ret (r+g+b+1)/3; endifndef } }
Began life as a copy of #1019595
download show line numbers debug dex old transpilations
Travelled to 4 computer(s): bhatertpkbcr, mqqgnosmbjvj, pyentgdyhuwx, vouqrxazstgt
No comments. add comment
Snippet ID: | #1030545 |
Snippet name: | BWIntegralImage [backup before GrabbablePixels] |
Eternal ID of this version: | #1030545/1 |
Text MD5: | 9b80cf932d95a371c73e811552e5d1f8 |
Transpilation MD5: | a5d35c40c00259a827fd1c84d57e5a95 |
Author: | stefan |
Category: | javax / imaging |
Type: | JavaX fragment (include) |
Public (visible to everyone): | Yes |
Archived (hidden from active list): | No |
Created/modified: | 2021-01-07 01:05:37 |
Source code size: | 3809 bytes / 135 lines |
Pitched / IR pitched: | No / No |
Views / Downloads: | 208 / 282 |
Referenced in: | -