package nbtool.gui.logviews.images; import java.awt.image.BufferedImage; import java.awt.image.ColorModel; import java.awt.image.Raster; import java.awt.image.WritableRaster; public class GrayscaleLib { public static BufferedImage copy(BufferedImage img) { ColorModel cm = img.getColorModel(); WritableRaster raster = img.copyData(null); boolean isAlphaPremultiplied = cm.isAlphaPremultiplied(); return new BufferedImage(cm, raster, isAlphaPremultiplied, null); } public static BufferedImage and(BufferedImage img1, BufferedImage img2) { BufferedImage anded = copy(img1); WritableRaster andedRaster = anded.getRaster(); Raster img1Raster = img1.getRaster(); Raster img2Raster = img2.getRaster(); for (int i = 0; i < img1.getHeight(); i++) { for (int j = 0; j < img1.getWidth(); j += 1) { int[] img1Pixel = new int[1]; img1Pixel = img1Raster.getPixel(j, i, img1Pixel); int[] img2Pixel = new int[1]; img2Pixel = img2Raster.getPixel(j, i, img2Pixel); int[] newPixel = new int[1]; newPixel[0] = Math.min(img1Pixel[0], img2Pixel[0]); andedRaster.setPixel(j, i, newPixel); } } return anded; } public static BufferedImage or(BufferedImage img1, BufferedImage img2) { BufferedImage ored = copy(img1); WritableRaster oredRaster = ored.getRaster(); Raster img1Raster = img1.getRaster(); Raster img2Raster = img2.getRaster(); for (int i = 0; i < img1.getHeight(); i++) { for (int j = 0; j < img1.getWidth(); j += 1) { int[] img1Pixel = new int[1]; img1Pixel = img1Raster.getPixel(j, i, img1Pixel); int[] img2Pixel = new int[1]; img2Pixel = img2Raster.getPixel(j, i, img2Pixel); int[] newPixel = new int[1]; newPixel[0] = Math.max(img1Pixel[0], img2Pixel[0]); oredRaster.setPixel(j, i, newPixel); } } return ored; } public static BufferedImage add(BufferedImage img1, BufferedImage img2) { BufferedImage added = copy(img1); WritableRaster addedRaster = added.getRaster(); Raster img1Raster = img1.getRaster(); Raster img2Raster = img2.getRaster(); for (int i = 0; i < img1.getHeight(); i++) { for (int j = 0; j < img1.getWidth(); j += 1) { int[] img1Pixel = new int[1]; img1Pixel = img1Raster.getPixel(j, i, img1Pixel); int[] img2Pixel = new int[1]; img2Pixel = img2Raster.getPixel(j, i, img2Pixel); int[] newPixel = new int[1]; newPixel[0] = (img1Pixel[0] + img2Pixel[0]) / 2; addedRaster.setPixel(j, i, newPixel); } } return added; } public static BufferedImage subtract(BufferedImage img1, BufferedImage img2) { BufferedImage subtracted = copy(img1); WritableRaster subtractedRaster = subtracted.getRaster(); Raster img1Raster = img1.getRaster(); Raster img2Raster = img2.getRaster(); for (int i = 0; i < img1.getHeight(); i++) { for (int j = 0; j < img1.getWidth(); j += 1) { int[] img1Pixel = new int[1]; img1Pixel = img1Raster.getPixel(j, i, img1Pixel); int[] img2Pixel = new int[1]; img2Pixel = img2Raster.getPixel(j, i, img2Pixel); int[] newPixel = new int[1]; newPixel[0] = (img1Pixel[0] - img2Pixel[0]) / 2 + 127; subtractedRaster.setPixel(j, i, newPixel); } } return subtracted; } public static BufferedImage threshold(BufferedImage img, FuzzyThreshold sigma) { BufferedImage thresholded = copy(img); WritableRaster raster = thresholded.getRaster(); for (int i = 0; i < img.getHeight(); i++) { for (int j = 0; j < img.getWidth(); j += 1) { int[] oldPixel = new int[1]; oldPixel = raster.getPixel(j, i, oldPixel); int[] newPixel = new int[1]; newPixel[0] = (int)(255*sigma.f((double)oldPixel[0])); raster.setPixel(j, i, newPixel); } } return thresholded; } }