sclass Image2B implements MakesBufferedImage { int w, h; byte[] pixels; *() {} // for persistence *(RGBImage img) { w = img.getWidth(); h = img.getHeight(); pixels = new byte[(w*h+7)/8]; for y to h: for x to w: if (img.getPixel(x, y).getBrightness() >= 0.5f) { int i = y*w+x; pixels[i/8] |= 1 << (i & 7); } } *(BWImage img) { w = img.getWidth(); h = img.getHeight(); pixels = new byte[(w*h+7)/8]; for y to h: for x to w: if (img.getPixel(x, y) >= 0.5f) { int i = y*w+x; pixels[i/8] |= 1 << (i & 7); } } // initializes with black *(int *w, int *h) { pixels = new byte[(w*h+7)/8]; } RGBImage toRGB() { RGBImage img = new RGBImage(w, h, Color.black); for y to h: for x to w: { int i = y*w+x; if ((pixels[i/8] & (1 << (i & 7))) != 0) img.setPixel(x, y, Color.white); } ret img; } BWImage toBW() { BWImage img = new BWImage(w, h, 0f); for y to h: for x to w: { int i = y*w+x; if ((pixels[i/8] & (1 << (i & 7))) != 0) img.setPixel(x, y, 1f); } ret img; } BufferedImage getBufferedImage() { ret toBW().getBufferedImage(); } bool getPixel(int x, int y) { int i = y*w+x; ret (pixels[i/8] & (1 << (i & 7))) != 0; } void setPixel(int x, int y) { int i = y*w+x; pixels[i/8] |= 1 << (i & 7); } int w() { ret w; } int h() { ret h; } public int getWidth() { ret w; } public int getHeight() { ret h; } }