數(shù)字水印的不可見性
金平ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18980820575(備注:SSL證書合作)期待與您的合作!
數(shù)字水印的不可見性就是數(shù)字水印嵌入到媒體中后通過人的感知系統(tǒng)是察覺不到的,對于圖像數(shù)字水印來說就是嵌入水印的圖像和原始圖像看起來是一樣的。
數(shù)字水印的魯棒性
數(shù)字水印的魯棒性是指在經(jīng)歷多種無意或有意的信號處理過程后,數(shù)字水印仍能保持部分完整性并能被準(zhǔn)確鑒別??赡艿男盘柼幚磉^程包括信道噪聲、濾波、數(shù)/模與模/數(shù)轉(zhuǎn)換、重采樣、剪切、位移、尺度變化以及有損壓縮編碼等。對于圖像數(shù)字水印來說,就是嵌入水印的圖像在經(jīng)過另存、拉伸、扭曲等操作后任然能夠提取水印。
jpg文件上的水印的清除方法:
如果需要將帶水印的JPG轉(zhuǎn)換成05H的PDG:
1、 將PDG批量更名為JPG。如果下載的時候就已經(jīng)是JPG,則此步省略。
2、用ComicEnhancer Pro打開帶水印的JPG,色彩選“單色”,水印沒了吧?不過這個時候文字多半也會變得很細(xì),可以通過增加“Gamma校正”值,或用“曲線”來加黑。注意“Gamma校正”和“曲線”選一個足矣。調(diào)節(jié)好以后,轉(zhuǎn)換成TIFF。
3、將TIFF文件更名為PDG,并且符合PDG文件命名規(guī)范,然后用高版本DjVuToy的“PDG壓縮”功能轉(zhuǎn)換成05H的PDG。注意轉(zhuǎn)換的時候把“轉(zhuǎn)換為快速版”選項去掉。
如果不需要轉(zhuǎn)換成PDG,而是希望在去掉水印的同時盡可能保持清晰:
1、將PDG批量更名為JPG。如果下載的時候就已經(jīng)是JPG,則此步省略。
2、用ComicEnhancer Pro打開帶水印的JPG,將“高亮度”設(shè)置為125,看到那神奇的效果了嗎?如果希望對文字的影響盡可能小,還可以嘗試將“高亮值”設(shè)置為210。
3、下面就看你高興了,可以直接存為JPG,也可以在色彩選“16級灰度”、“8級灰度”、“4級灰度”,然后轉(zhuǎn)換成PNG?;叶燃墧?shù)越少,圖像損失越多,文件越小,16級灰度基本上肉眼看不出文字部分有任何損失,4級灰度則很明顯,可以結(jié)合“曲線”或“Gamma校正”等加以改善。
package?com.aspectj;
import?java.awt.Color;
import?java.awt.Graphics2D;
import?java.awt.Image;
import?java.awt.image.BufferedImage;
import?java.io.File;
import?java.io.FileOutputStream;
import?javax.swing.ImageIcon;
import?com.sun.image.codec.jpeg.JPEGCodec;
import?com.sun.image.codec.jpeg.JPEGEncodeParam;
import?com.sun.image.codec.jpeg.JPEGImageEncoder;
/**
*?@author?Administrator
*?
*?????????TODO?要更改此生成的類型注釋的模板,請轉(zhuǎn)至?窗口?-?首選項?-?Java?-?代碼樣式?-?代碼模板
*?
*?????????添加水印,?filePath?源圖片路徑?含圖片名,?watermark?水印圖片路徑?savePath
*?????????為你添加水印后的圖片保存路徑文件夾?words?要添加的文字
*/
//?添加水印,filePath?源圖片路徑,?watermark?水印圖片路徑
public?class?Mark?{
private?static?int?wid?=?0;
private?static?int?het?=?0;
public?static?boolean?createMark(String?filePath,?String?watermark,
String?words,?String?savePath)?{
ImageIcon?imgIcon?=?new?ImageIcon(filePath);
Image?theImg?=?imgIcon.getImage();
ImageIcon?waterIcon?=?new?ImageIcon(watermark);
Image?waterImg?=?waterIcon.getImage();
//?/////////////////////////////////////////////////////////////////////
File?f?=?new?File(filePath);
String?picname?=?f.getName();//?取得圖片名
if?(watermark?!=?null??!watermark.equals(""))?{//?當(dāng)水印圖標(biāo)為空時
ImageIcon?markIcon?=?new?ImageIcon(watermark);?//?要添加的水印圖標(biāo)
Image?markImg?=?markIcon.getImage();
wid?=?markImg.getWidth(null);?//?水印圖標(biāo)寬度
het?=?markImg.getHeight(null);?//?水印圖標(biāo)高度
}
//?////////////////////////////////////////////////////////////////////
int?width?=?theImg.getWidth(null);?//?源圖片寬度
int?height?=?theImg.getHeight(null);?//?源圖片高度
if?(savePath.equals(""))
savePath?=?filePath;//?如果未指定保存路徑則保存回原路徑
else
savePath?=?savePath?+?"指定保存文件夾時,拼接出保存路徑";
BufferedImage?bimage?=?new?BufferedImage(width,?height,
BufferedImage.TYPE_INT_RGB);
Graphics2D?g?=?bimage.createGraphics();
g.setColor(Color.red);?//?設(shè)置顏色
g.setBackground(Color.white);
g.drawImage(theImg,?0,?0,?null);
g.drawImage(waterImg,?width?-?wid?+?5,?height?-?het?+?5,?null);?//?添加圖標(biāo)中間兩個數(shù)字參數(shù)
//?是設(shè)定位置
g.drawString(words,?width?-?120,?height?-?10);?//?添加文字
try?{
FileOutputStream?out?=?new?FileOutputStream(savePath);
JPEGImageEncoder?encoder?=?JPEGCodec.createJPEGEncoder(out);
JPEGEncodeParam?param?=?encoder.getDefaultJPEGEncodeParam(bimage);
param.setQuality(50f,?true);?//?圖片質(zhì)量
encoder.encode(bimage,?param);
out.close();
}?catch?(Exception?e)?{
e.printStackTrace();
System.out.println("===========水印失敗");
return?false;
}?finally?{
System.gc();//?清理?垃圾對象
}
System.out.println("===========水印成功");
return?true;
}
//?/測試主程序
public?static?void?main(String[]?args)?{
createMark("dcc451da81cb39dbfa76de3ad2160924ab183023.jpg",?"u=4038692558,3024950167fm=21gp=0.jpg",?"aas",?"");
}
}
檢測水印很難做到,但是加上水印還是比較簡單的
package com.jc.ts.services;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.sun.image.codec.jpeg.ImageFormatException;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
/**
*添加圖片水印的服務(wù)類
* */
public class WaterMark {
/**
* @param sizeContext添加水印文字
* @param request 請求流對象
* @param request 響應(yīng)流對象
* */
@SuppressWarnings("deprecation")
public static void createMarkSize(String sizeContext,HttpServletRequest request,HttpServletResponse response) {
try {
String path=request.getRealPath(request.getServletPath());
FileInputStream in=new FileInputStream(path);
Image src=ImageIO.read(in);
int w=src.getWidth(null);
int h=src.getHeight(null);
BufferedImage img=new BufferedImage(w,h,BufferedImage.TYPE_INT_RGB);//構(gòu)建畫板
Graphics g=img.getGraphics();//得到畫筆
g.drawImage(src,0,0,w,h,null);//把源圖片寫入畫板
g.setColor(Color.red);
g.drawString(sizeContext,10,5); // 添加文字
g.dispose();//生成圖片
JPEGImageEncoder e=JPEGCodec.createJPEGEncoder(response.getOutputStream());
e.encode(img);
response.getOutputStream().close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ImageFormatException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* @param localPath 添加水印LOGO路徑
* @param request 請求流對象
* @param request 響應(yīng)流對象
**/
@SuppressWarnings("deprecation")
public static void createMarkLogo(String localPath,HttpServletRequest request,HttpServletResponse response) {
try {
FileInputStream file=new FileInputStream(localPath);
Image fimg=ImageIO.read(file);
int fw=fimg.getWidth(null);
int fh=fimg.getHeight(null);
String path=request.getRealPath(request.getServletPath());
FileInputStream in=new FileInputStream(path);
Image src=ImageIO.read(in);
int w=src.getWidth(null);
int h=src.getHeight(null);
BufferedImage img=new BufferedImage(w,h,BufferedImage.TYPE_INT_RGB);//構(gòu)建畫板
Graphics g=img.getGraphics();//得到畫筆
g.drawImage(src,0,0,w,h,null);//把原圖片寫入畫板
g.drawImage(fimg,w-20,h-15,fw,fh,null);//把水印圖片寫入畫板
g.dispose();//生成圖片
JPEGImageEncoder e=JPEGCodec.createJPEGEncoder(response.getOutputStream());
e.encode(img);
response.getOutputStream().close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ImageFormatException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/**
* @param localPath 添加水印圖片路徑
* @param request 請求流對象
* @param request 響應(yīng)流對象
* @param width 水印圖片的寬度
* @param height 水印圖片的長度
**/
@SuppressWarnings("deprecation")
public static void createMarkLogo(String localPath,HttpServletRequest request,HttpServletResponse response,int width,int height) {
try {
FileInputStream file=new FileInputStream(localPath);
Image fimg=ImageIO.read(file);
int fw=fimg.getWidth(null);
int fh=fimg.getHeight(null);
String path=request.getRealPath(request.getServletPath());
FileInputStream in=new FileInputStream(path);
Image src=ImageIO.read(in);
int w=src.getWidth(null);//w為你過濾圖片的寬度
int h=src.getHeight(null);//h為你過濾圖片的長度
BufferedImage img=new BufferedImage(w+width,h+height,BufferedImage.TYPE_INT_RGB);//構(gòu)建畫板(畫板的寬度為兩個圖片之和)
Graphics g=img.getGraphics();//得到畫筆
g.drawImage(src,0,0,w,h,null);//把原圖片寫入畫板
g.drawImage(fimg,width,height,fw,fh,null);//把水印圖片寫入畫板
g.dispose();//生成圖片
JPEGImageEncoder e=JPEGCodec.createJPEGEncoder(response.getOutputStream());
e.encode(img);
response.getOutputStream().close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ImageFormatException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
注意第三個方法的注釋地方g.drawImage(fimg,width,height,fw,fh,null);根據(jù)參數(shù)你在調(diào)調(diào)(放原圖下面的)
過濾器調(diào)用
package com.jc.ts.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.jc.ts.services.WaterMark;
public class WaterFilter implements Filter {
public void destroy() {
// TODO Auto-generated method stub
}
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
HttpServletRequest request=(HttpServletRequest)arg0;
HttpServletResponse response=(HttpServletResponse)arg1;
//WaterMark.createMarkSize("南京ts", request, response);
//WaterMark.createMarkLogo("D:\\workspace\\mybook\\WebRoot\\images\\logo\\book.jpg", request, response);
WaterMark.createMarkLogo("D:\\workspace\\mybook\\WebRoot\\images\\logo\\book.jpg", request, response,20,30);
//注意路徑為絕對路徑且三個效果不能同時執(zhí)行
}
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}
web.xml配置(寫在servlet上面)
filter
descriptionThis is the description of my J2EE component/description
display-nameThis is the display name of my J2EE component/display-name
filter-nameWaterFilter/filter-name
filter-classcom.jc.ts.filter.WaterFilter/filter-class
/filter
文字水印
import java.awt.*;
import java.awt.image.*;
import java.io.*;
import javax.swing.*;
import com.sun.image.codec.jpeg.*;
public class WaterSet {
/**
* 給圖片添加水印
*
* @param filePath
* 需要添加水印的圖片的路徑
* @param markContent
* 水印的文字
* @param markContentColor
* 水印文字的顏色
* @param qualNum
* 圖片質(zhì)量
* @return
*/
public boolean createMark(String filePath, String markContent,
Color markContentColor, float qualNum) {
ImageIcon imgIcon = new ImageIcon(filePath);
Image theImg = imgIcon.getImage();
int width = theImg.getWidth(null);
int height = theImg.getHeight(null);
BufferedImage bimage = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
Graphics2D g = bimage.createGraphics();
g.setColor(markContentColor);
g.setBackground(Color.white);
g.drawImage(theImg, 0, 0, null);
g.drawString(markContent, width / 5, height / 5); // 添加水印的文字和設(shè)置水印文字出現(xiàn)的內(nèi)容
g.dispose();
try {
FileOutputStream out = new FileOutputStream(filePath);
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(bimage);
param.setQuality(qualNum, true);
encoder.encode(bimage, param);
out.close();
} catch (Exception e) {
return false;
}
return true;
}
}
圖片水印
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import javax.imageio.ImageIO;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
public final class ImageUtils {
public ImageUtils() {
}
/*
* public final static String getPressImgPath() { return ApplicationContext
* .getRealPath("/template/data/util/shuiyin.gif"); }
*/
/**
* 把圖片印刷到圖片上
*
* @param pressImg --
* 水印文件
* @param targetImg --
* 目標(biāo)文件
* @param x
* --x坐標(biāo)
* @param y
* --y坐標(biāo)
*/
public final static void pressImage(String pressImg, String targetImg,
int x, int y) {
try {
//目標(biāo)文件
File _file = new File(targetImg);
Image src = ImageIO.read(_file);
int wideth = src.getWidth(null);
int height = src.getHeight(null);
BufferedImage image = new BufferedImage(wideth, height,
BufferedImage.TYPE_INT_RGB);
Graphics g = image.createGraphics();
g.drawImage(src, 0, 0, wideth, height, null);
//水印文件
File _filebiao = new File(pressImg);
Image src_biao = ImageIO.read(_filebiao);
int wideth_biao = src_biao.getWidth(null);
int height_biao = src_biao.getHeight(null);
g.drawImage(src_biao, (wideth - wideth_biao) / 2,
(height - height_biao) / 2, wideth_biao, height_biao, null);
//水印文件結(jié)束
g.dispose();
FileOutputStream out = new FileOutputStream(targetImg);
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
encoder.encode(image);
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 打印文字水印圖片
*
* @param pressText
* --文字
* @param targetImg --
* 目標(biāo)圖片
* @param fontName --
* 字體名
* @param fontStyle --
* 字體樣式
* @param color --
* 字體顏色
* @param fontSize --
* 字體大小
* @param x --
* 偏移量
* @param y
*/
public static void pressText(String pressText, String targetImg,
String fontName, int fontStyle, int color, int fontSize, int x,
int y) {
try {
File _file = new File(targetImg);
Image src = ImageIO.read(_file);
int wideth = src.getWidth(null);
int height = src.getHeight(null);
BufferedImage image = new BufferedImage(wideth, height,
BufferedImage.TYPE_INT_RGB);
Graphics g = image.createGraphics();
g.drawImage(src, 0, 0, wideth, height, null);
// String s="";
g.setColor(Color.RED);
g.setFont(new Font(fontName, fontStyle, fontSize));
g.drawString(pressText, wideth - fontSize - x, height - fontSize
/ 2 - y);
g.dispose();
FileOutputStream out = new FileOutputStream(targetImg);
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
encoder.encode(image);
out.close();
} catch (Exception e) {
System.out.println(e);
}
}
public static void main(String[] args) {
pressImage("F:/logo.png", "F:/123.jpg", 0, 0);
}
}
新聞名稱:數(shù)字圖像水印代碼java,什么叫數(shù)字水印
本文來源:http://jinyejixie.com/article18/dssdidp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作、軟件開發(fā)、面包屑導(dǎo)航、網(wǎng)站設(shè)計公司、營銷型網(wǎng)站建設(shè)、動態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)