private static ImageIcon makeGrayImageIcon1(Image img) { BufferedImage source = new BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_ARGB); Graphics g = source.createGraphics(); g.drawImage(img, 0, 0, null); g.dispose(); ColorConvertOp colorConvert = new ColorConvertOp(ColorSpace.getInstance(ColorSpace.CS_GRAY), null); BufferedImage destination = colorConvert.filter(source, null); return new ImageIcon(destination); }
private static ImageIcon makeGrayImageIcon2(Image img) { int w = img.getWidth(null); int h = img.getHeight(null); BufferedImage destination = new BufferedImage(w, h, BufferedImage.TYPE_BYTE_GRAY); Graphics g = destination.createGraphics(); //// g.setColor(Color.WHITE); // https://community.oracle.com/thread/1373262 Color to Grayscale to Binary // g.fillRect(0, 0, w, h); // need to pre-fill(alpha?) g.drawImage(img, 0, 0, null); g.dispose(); return new ImageIcon(destination); }
/** Convert standard img to a buffered image. */ public static BufferedImage convertImage(Image img) { int height = img.getHeight(null), width = img.getWidth(null); // FloatMatrix fm = new FloatMatrix( height, width ) ; PixelGrabber grabber = new PixelGrabber(img, 0, 0, width, height, false); try { grabber.grabPixels(); } catch (InterruptedException e) { System.out.println(e); } Object pixels = grabber.getPixels(); ColorModel cm = grabber.getColorModel(); BufferedImage bimg = null; // REVISIT Makes some unwarranted assumptions about the layout of the PixelGrabber data // as being either int (ARGB?) or byte (gray scale?) if (pixels instanceof int[]) { int[] arr = (int[]) pixels; byte[] barray = new byte[arr.length * 3]; int k = 0; for (int j = 0; j < arr.length; j++) { int l = arr[j]; barray[k++] = (byte) (l & 0xFF); barray[k++] = (byte) ((l >>> 8) & 0xFF); barray[k++] = (byte) ((l >>> 16) & 0xFF); } ColorModel ccm = new ComponentColorModel( ICC_ColorSpace.getInstance(ICC_ColorSpace.CS_sRGB), new int[] {8, 8, 8}, false, false, Transparency.OPAQUE, DataBuffer.TYPE_BYTE); DataBuffer bbuf = new DataBufferByte(barray, barray.length); SampleModel bmodel = new PixelInterleavedSampleModel( DataBuffer.TYPE_BYTE, width, height, 3, 3 * width, new int[] {2, 1, 0}); WritableRaster raster = Raster.createWritableRaster(bmodel, bbuf, new Point(0, 0)); bimg = new BufferedImage(ccm, raster, false, new Hashtable()); } else if (pixels instanceof byte[]) { // Assume gray scale model? byte[] arr = (byte[]) pixels; byte[] barray = new byte[arr.length * 3]; int k = 0; for (int j = 0; j < arr.length; j++) { byte l = arr[j]; barray[k++] = l; barray[k++] = l; barray[k++] = l; } ColorModel ccm = new ComponentColorModel( ICC_ColorSpace.getInstance(ICC_ColorSpace.CS_sRGB), new int[] {8, 8, 8}, false, false, Transparency.OPAQUE, DataBuffer.TYPE_BYTE); DataBuffer bbuf = new DataBufferByte(barray, barray.length); SampleModel bmodel = new PixelInterleavedSampleModel( DataBuffer.TYPE_BYTE, width, height, 3, 3 * width, new int[] {2, 1, 0}); WritableRaster raster = Raster.createWritableRaster(bmodel, bbuf, new Point(0, 0)); bimg = new BufferedImage(ccm, raster, false, new Hashtable()); } else { throw new RuntimeException("Unexpected data."); } return bimg; }