Removing Watermark with Java using Pixel Color proximity
I had to replace watermark from the image below,
Step 1. Create the area to replace i created this image using photoshop,
Here is the complete code,
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FilenameFilter;
import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriteParam;
import javax.imageio.stream.FileImageOutputStream;
import com.sun.imageio.plugins.jpeg.JPEGImageWriter;
public class Main {
public static void main(String[] args) throws Exception {
new Main().execute();
}
private void execute() throws Exception {
init();
new File("c:\\src\\").list(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
filter(new File("c:\\src\\" + name), new File("c:\\src\\removed\\" + name));
return false;
}
});
}
public void filter(File src, File dest) {
try {
BufferedImage img = ImageIO.read(src);
int[] rgbArray = new int[420 * 420];
img.getRGB(0, 0, 420, 420, rgbArray, 0, 420);
BufferedImage finalImage = new BufferedImage(420, 420, BufferedImage.TYPE_INT_RGB);
for (int i = 0; i < rgbArray.length; i++) {
if (findProximity(rgbArray[i], watermarkPx[i])) {
rgbArray[i] = 0xffffff;
}
}
finalImage.setRGB(0, 0, 420, 420, rgbArray, 0, 420);
JPEGImageWriter writer = (JPEGImageWriter) ImageIO.getImageWritersByFormatName("jpeg").next();
ImageWriteParam iwp = writer.getDefaultWriteParam();
iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
iwp.setCompressionQuality(1);
FileImageOutputStream output = new FileImageOutputStream(dest);
writer.setOutput(output);
IIOImage iimage = new IIOImage(finalImage, null, null);
writer.write(null, iimage, iwp);
writer.reset();
} catch (Exception e) {
// TODO: handle exception
}
}
private boolean findProximity(int rgb1, int rgb2) {
int r1 = (rgb1 >> 16 ) & 0xff;
int g1 = (rgb1 >> 8 ) & 0xff;
int b1 = (rgb1) & 0xff;
int r2 = (rgb2 >> 16 ) & 0xff;
int g2 = (rgb2 >> 8 ) & 0xff;
int b2 = (rgb2 ) & 0xff;
int r = Math.abs(r1 - r2);
int g = Math.abs(g1 - g2);
int b = Math.abs(b1 - b2);
int k = 20;
return (r < k) && (b < k) && (g < k);
}
private int[] watermarkPx = new int[420 * 420];
private void init() throws Exception {
BufferedImage watermark = ImageIO.read(new File("green-alfa.jpg"));
watermark.getRGB(0, 0, 420, 420, watermarkPx, 0, 420);
}
}
Here is the result,

