sclass Image2B is IBinaryImage { 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.getInt(x, y) >= 128) { int i = y*w+x; pixels[i/8] |= 1 << (i & 7); } } *(BufferedImage img) { this(BWImage(img)); } // 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; } public BufferedImage getBufferedImage() { ret toBW().getBufferedImage(); } public bool getPixel aka getBoolPixel(int x, int y) { int i = y*w+x; ret (pixels[i/8] & (1 << (i & 7))) != 0; } public void setPixel(int x, int y, bool b) { int i = y*w+x; byte val = pixels[i/8], shifted = (byte) (1 << (i & 7)); val = (byte) (b ? val | shifted : val & ~shifted); pixels[i/8] = val; } void setPixel(int x, int y) { int i = y*w+x; pixels[i/8] |= 1 << (i & 7); } public int getWidth() { ret w; } public int getHeight() { ret h; } }