sinterface IBWImage extends MakesBufferedImage, IRGBImage { float getFloatPixel(int x, int y); // usually between 0 and 1 default int getInt(int x, int y) { ret iround(getFloatPixel(x, y)*255f); } // implementing IRGBImage default int getIntPixel(int x, int y) { ret rgbIntFromGrayscale(getInt(x, y)); } default float getFloatPixel(Pt p) { ret getFloatPixel(p.x, p.y); } default float getFloatPixel(int index) { int w = w(); ret getFloatPixel(index % w, index / w); } default float[] toFloatArray() { float[] data = new[w()*h()]; for i over data: data[i] = getFloatPixel(i); ret data; } public default BufferedImage getBufferedImage() { ret grayImageFromIBWImage(this); } default BWImage toBWImage() { ret this instanceof BWImage ? (BWImage) this : iBWImageToBWImage(this); } }