java去除图片水印的解决办法
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                java去除图片水印的解决办法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                
                            
                            
                            原文地址:http://www.oicqzone.com/pc/2017062023844.html
[color=red]去除水印: 其實就是把水印的顏色替換為背景色(ARGB)
/**
*
* 分析
要實現這樣的一個程序首先要了解關于圖像的基本知識。我們平常所看到的JPG,PNG等圖像在顯示的時候是以像素為單位的。長300寬400像素的圖片所有像素為300×400=120000個像素點。在ARGB的圖像表示方法中,每個像素點有ARGB四個通道,
A代表透明度,取值范圍0~255,
R代表三原色中的紅,取值范圍0~255,
G代表三原色中的綠,取值范圍0~255,
B代表三原色中的藍,取值范圍0~255。
所以存儲這些數據只需要4個8位二進制在Java中也就是一個int類型就行啦。所以這張圖片顯示在屏幕上所占用的內存至少是120000×32個字節。每種顏色都有特定的ARGB取值,所以我們要去除水印就是要把圖片中特定范圍的ARGB取值改為四個通道取值都是255的白色就行了。有了以上理論知識,再結合Java圖像處理相關API,根據目標圖像的特征提取出適當ARGB取值范圍。可以使用qq或者納克小工,PS等工具查看水印像素所對應的范圍。
* */[/color]
打開圖片->選擇[color=blue]畫圖方式打開[/color],然后用[color=blue]吸管工具[/color]點你要的地方。右上方有個[color=blue] 編輯顏色[/color],點擊后看到的顏色就是你選取的。RGB值顯示了。
package com.ocr.demo;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriter;
import javax.imageio.stream.ImageOutputStream;
import javax.net.ssl.HttpsURLConnection;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Scanner;
public class ImageConverter {
private static List<File> fileList = new ArrayList<File>();
public static void main(String[] args) {
//圖片所在的根目錄 , 圖片去除水印后的存儲目錄
convertAllImages("F:\\images\\xunlian\\yzzz.png", "F:\\images\\xunlian\\yzzz2.png"); //支持批量去除圖片水印
// convertAllImages("F:\\images\\yyzz", "F:\\images\\yyzz2");
}
private static void convertAllImages(String dir, String saveDir) {
File dirFile = new File(dir);
File saveDirFile = new File(saveDir);
dir = dirFile.getAbsolutePath();
saveDir = saveDirFile.getAbsolutePath();
loadImages(new File(dir));
for (File file : fileList) {
String filePath = file.getAbsolutePath();
String dstPath = saveDir + filePath.substring(filePath.indexOf(dir) + dir.length(), filePath.length());
System.out.println("converting: " + filePath);
replaceColor(file.getAbsolutePath(), dstPath);
}
}
public static void loadImages(File f) {
if (f != null) {
if (f.isDirectory()) {
File[] fileArray = f.listFiles();
if (fileArray != null) {
for (int i = 0; i < fileArray.length; i++) {
//遞歸調用
loadImages(fileArray[i]);
}
}
} else {
String name = f.getName();
if (name.endsWith("png") || name.endsWith("jpg")) {
fileList.add(f);
}
}
}
}
private static void replaceFolderImages(String dir) {
File dirFile = new File(dir);
File[] files = dirFile.listFiles(new FileFilter() {
public boolean accept(File file) {
String name = file.getName();
if (name.endsWith("png") || name.endsWith("jpg")) {
return true;
}
return false;
}
});
for (File img : files) {
replaceColor(img.getAbsolutePath(), img.getAbsolutePath());
}
}
private static void replaceColor(String srcFile, String dstFile) {
try {
Color color = new Color(255, 195, 195);
replaceImageColor(srcFile, dstFile, color, Color.WHITE);
} catch (IOException e) {
e.printStackTrace();
}
}
public static void replaceImageColor(String file, String dstFile, Color srcColor, Color targetColor) throws IOException {
URL http;
if (file.trim().startsWith("https")) {
http = new URL(file);
HttpsURLConnection conn = (HttpsURLConnection) http.openConnection();
conn.setRequestMethod("GET");
} else if (file.trim().startsWith("http")) {
http = new URL(file);
HttpURLConnection conn = (HttpURLConnection) http.openConnection();
conn.setRequestMethod("GET");
} else {
http = new File(file).toURI().toURL();
}
BufferedImage bi = ImageIO.read(http.openStream());
if(bi == null){
return;
}
//Color wColor = new Color(255, 255, 255);//白色
Color wColor = new Color(238, 243, 249);//淺灰色
for (int i = 0; i < bi.getWidth(); i++) {
for (int j = 0; j < bi.getHeight(); j++) {
//System.out.println(bi.getRGB(i, j));
int color = bi.getRGB(i, j);
Color oriColor = new Color(color);
int red = oriColor.getRed();
int greed = oriColor.getGreen();
int blue = oriColor.getBlue();
//粉色
if (greed < 190 || blue < 190) {
} else {
//去掉粉色水印(粉色替換為白色)
// if (red == 255 && greed > 180 && blue > 180) {
// bi.setRGB(i, j, wColor.getRGB());
// }
//去掉灰色水印(灰色替換為白色)
// if (red == 229 && greed == 229 && blue == 229) {
// bi.setRGB(i, j, wColor.getRGB());
// }
//去掉淺灰色水印(灰色替換為白色或替換為淺灰色)
if (red >170 && greed > 170 && blue > 170) {
bi.setRGB(i, j, wColor.getRGB());
}
}
}
}
String type = file.substring(file.lastIndexOf(".") + 1, file.length());
Iterator<ImageWriter> it = ImageIO.getImageWritersByFormatName(type);
ImageWriter writer = it.next();
File f = new File(dstFile);
f.getParentFile().mkdirs();
ImageOutputStream ios = ImageIO.createImageOutputStream(f);
writer.setOutput(ios);
writer.write(bi);
bi.flush();
ios.flush();
ios.close();
}
}
                        
                        
                        [color=red]去除水印: 其實就是把水印的顏色替換為背景色(ARGB)
/**
*
* 分析
要實現這樣的一個程序首先要了解關于圖像的基本知識。我們平常所看到的JPG,PNG等圖像在顯示的時候是以像素為單位的。長300寬400像素的圖片所有像素為300×400=120000個像素點。在ARGB的圖像表示方法中,每個像素點有ARGB四個通道,
A代表透明度,取值范圍0~255,
R代表三原色中的紅,取值范圍0~255,
G代表三原色中的綠,取值范圍0~255,
B代表三原色中的藍,取值范圍0~255。
所以存儲這些數據只需要4個8位二進制在Java中也就是一個int類型就行啦。所以這張圖片顯示在屏幕上所占用的內存至少是120000×32個字節。每種顏色都有特定的ARGB取值,所以我們要去除水印就是要把圖片中特定范圍的ARGB取值改為四個通道取值都是255的白色就行了。有了以上理論知識,再結合Java圖像處理相關API,根據目標圖像的特征提取出適當ARGB取值范圍。可以使用qq或者納克小工,PS等工具查看水印像素所對應的范圍。
* */[/color]
打開圖片->選擇[color=blue]畫圖方式打開[/color],然后用[color=blue]吸管工具[/color]點你要的地方。右上方有個[color=blue] 編輯顏色[/color],點擊后看到的顏色就是你選取的。RGB值顯示了。
package com.ocr.demo;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriter;
import javax.imageio.stream.ImageOutputStream;
import javax.net.ssl.HttpsURLConnection;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Scanner;
public class ImageConverter {
private static List<File> fileList = new ArrayList<File>();
public static void main(String[] args) {
//圖片所在的根目錄 , 圖片去除水印后的存儲目錄
convertAllImages("F:\\images\\xunlian\\yzzz.png", "F:\\images\\xunlian\\yzzz2.png"); //支持批量去除圖片水印
// convertAllImages("F:\\images\\yyzz", "F:\\images\\yyzz2");
}
private static void convertAllImages(String dir, String saveDir) {
File dirFile = new File(dir);
File saveDirFile = new File(saveDir);
dir = dirFile.getAbsolutePath();
saveDir = saveDirFile.getAbsolutePath();
loadImages(new File(dir));
for (File file : fileList) {
String filePath = file.getAbsolutePath();
String dstPath = saveDir + filePath.substring(filePath.indexOf(dir) + dir.length(), filePath.length());
System.out.println("converting: " + filePath);
replaceColor(file.getAbsolutePath(), dstPath);
}
}
public static void loadImages(File f) {
if (f != null) {
if (f.isDirectory()) {
File[] fileArray = f.listFiles();
if (fileArray != null) {
for (int i = 0; i < fileArray.length; i++) {
//遞歸調用
loadImages(fileArray[i]);
}
}
} else {
String name = f.getName();
if (name.endsWith("png") || name.endsWith("jpg")) {
fileList.add(f);
}
}
}
}
private static void replaceFolderImages(String dir) {
File dirFile = new File(dir);
File[] files = dirFile.listFiles(new FileFilter() {
public boolean accept(File file) {
String name = file.getName();
if (name.endsWith("png") || name.endsWith("jpg")) {
return true;
}
return false;
}
});
for (File img : files) {
replaceColor(img.getAbsolutePath(), img.getAbsolutePath());
}
}
private static void replaceColor(String srcFile, String dstFile) {
try {
Color color = new Color(255, 195, 195);
replaceImageColor(srcFile, dstFile, color, Color.WHITE);
} catch (IOException e) {
e.printStackTrace();
}
}
public static void replaceImageColor(String file, String dstFile, Color srcColor, Color targetColor) throws IOException {
URL http;
if (file.trim().startsWith("https")) {
http = new URL(file);
HttpsURLConnection conn = (HttpsURLConnection) http.openConnection();
conn.setRequestMethod("GET");
} else if (file.trim().startsWith("http")) {
http = new URL(file);
HttpURLConnection conn = (HttpURLConnection) http.openConnection();
conn.setRequestMethod("GET");
} else {
http = new File(file).toURI().toURL();
}
BufferedImage bi = ImageIO.read(http.openStream());
if(bi == null){
return;
}
//Color wColor = new Color(255, 255, 255);//白色
Color wColor = new Color(238, 243, 249);//淺灰色
for (int i = 0; i < bi.getWidth(); i++) {
for (int j = 0; j < bi.getHeight(); j++) {
//System.out.println(bi.getRGB(i, j));
int color = bi.getRGB(i, j);
Color oriColor = new Color(color);
int red = oriColor.getRed();
int greed = oriColor.getGreen();
int blue = oriColor.getBlue();
//粉色
if (greed < 190 || blue < 190) {
} else {
//去掉粉色水印(粉色替換為白色)
// if (red == 255 && greed > 180 && blue > 180) {
// bi.setRGB(i, j, wColor.getRGB());
// }
//去掉灰色水印(灰色替換為白色)
// if (red == 229 && greed == 229 && blue == 229) {
// bi.setRGB(i, j, wColor.getRGB());
// }
//去掉淺灰色水印(灰色替換為白色或替換為淺灰色)
if (red >170 && greed > 170 && blue > 170) {
bi.setRGB(i, j, wColor.getRGB());
}
}
}
}
String type = file.substring(file.lastIndexOf(".") + 1, file.length());
Iterator<ImageWriter> it = ImageIO.getImageWritersByFormatName(type);
ImageWriter writer = it.next();
File f = new File(dstFile);
f.getParentFile().mkdirs();
ImageOutputStream ios = ImageIO.createImageOutputStream(f);
writer.setOutput(ios);
writer.write(bi);
bi.flush();
ios.flush();
ios.close();
}
}
總結
以上是生活随笔為你收集整理的java去除图片水印的解决办法的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 微信小程序学习打卡(2)
- 下一篇: 植物大战僵尸:查找植物叠加种植CALL
