/**
* 判断水印是否在显示的图片像素内
* 显示位子x轴向
* 显示位子y轴向
* 水印图片宽度
* 水印图片高度
* 源图宽度
* 源图高度
* @param degree
*/
public static String watermarkGps(int ...position){
String erorr = null;
int x = position[0];
int y = position[1];
int iconPathX = position[2];
int iconPathY = position[3];
int imgSrcX = position[4];
int imgSrcY = position[5];
if(x > (imgSrcX - iconPathX)){
erorr ="您所设置的宽度已经超出,建议请在"+(imgSrcX - iconPathX)+"以内";
return erorr;
}
if(y > (imgSrcY - iconPathY)){
erorr ="您所设置的高度已经超出,建议请在"+(imgSrcY - iconPathY)+"以内";
return erorr;
}
return erorr;
}
/**
* 生成水印图片,可添加角度,水印在图片显示的位置
* @param imgSrc 源图片路径
* @param degree 水印图片旋转角度
* @param iconPath 水印图片路径
* @param targerPath 目标图片路径
*/
public static boolean addImageWatermark(String imgSrc,Integer degree,String iconPath,String targerPath,int x,int y){
OutputStream os = null;
try {
//读取图片
Image srcImage = ImageIO.read(new File(imgSrc));
//创建一个不带透明色的BufferedImage对象
BufferedImage buffImage = new BufferedImage(srcImage.getWidth(null), srcImage.getHeight(null), BufferedImage.TYPE_INT_RGB);
/*
* 创建一个 Graphics2D,可以将它绘制到此 BufferedImage 中
* 用于绘制到此图像中的 Graphics2D
*
* Graphics2D定义了几种方法,用于添加或改变图形的状态属性。可以通过设定和修改状态属性,指定画笔宽度和画笔的连接方式;
* 设定平移、旋转、缩放或修剪变换图形;以及设定填充图形的颜色和图案等。图形状态属性用特定的对象存储
*/
//Graphics2D 绘图属性 ,得到画笔对象
Graphics2D g = buffImage.createGraphics();
/*
* RenderingHints 类包含可由 Graphics2D 类,以及实现 BufferedImageOp 和 Raster 的类使用的呈现提示
* KEY_INTERPOLATION 插值提示键
* VALUE_INTERPOLATION_BILINEAR 插值提示值——INTERPOLATION_BILINEAR。
* */
//设置对线段的锯齿状边缘处理
g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BILINEAR);
/*参数1: 在呈现之前要应用到图像的过滤器
*参数2: 要呈现的指定 BufferedImage 如果 img 为 null,则此方法不执行任何动作。
*参数3: 该位置的 x 坐标,它位于呈现该图像左上角的用户空间中
*参数4:该位置的 y 坐标,它位于呈现该图像左上角的用户空间中
*
* getScaledInstance() 方法说明:
* 创建此图像的缩放版本。返回一个新的 Image 对象,默认情况下,该对象按指定的 width 和 height 呈现图像。
* 即使已经完全加载了初始源图像,新的 Image 对象也可以被异步加载。
* 如果 width 或 height 为负数,则替换该值以维持初始图像尺寸的高宽比。如果 width 和 height 都为负,则使用初始图像尺寸 。
* width - 将图像缩放到的宽度。
height - 将图像缩放到的高度。
hints - 指示用于图像重新取样的算法类型的标志。
*/
g.drawImage(srcImage.getScaledInstance(srcImage.getWidth(null), srcImage.getHeight(null), srcImage.SCALE_SMOOTH),0,0,null);
if(null != degree){
/*g.rotate();
*将当前的 Graphics2D Transform 与平移后的旋转转换连接。后续呈现的变换是平移到指定位置,旋转指定弧度,然后向回平移相同的距离
*参数1:旋转的角度,以弧度表示
*参数2:旋转原点的 x 坐标
*参数3:旋转原点的 x 坐标
*/
// 设置水印旋转
g.rotate(Math.toRadians(degree),buffImage.getWidth()/2,buffImage.getHeight()/2);
}
//获取水印图象的路径 水印一般为gif或者png的,这样可设置透明度
ImageIcon imageIcon = new ImageIcon(iconPath);
//判断水印显示的位置是否在图片像素内
String pd = watermarkGps(x,y,imageIcon.getIconWidth(),imageIcon.getIconHeight(),buffImage.getWidth(), buffImage.getHeight());
if(null != pd){
System.out.println(pd);
return false;
}
//得到 Image 对象
Image image = imageIcon.getImage();
/*1 - 在呈现之前要应用到图像的过滤器
2 - 要呈现的指定 BufferedImage 如果 img 为 null,则此方法不执行任何动作。
3 - 该位置的 x 坐标,它位于呈现该图像左上角的用户空间中
4 - 该位置的 y 坐标,它位于呈现该图像左上角的用户空间中
*/
// 表示水印图片的位置
g.drawImage(image, x, y, null);
/*setComposite() 指定新的像素如何在呈现过程中与图形设备上的现有像素组合
*AlphaComposite 类实现一些基本的 alpha 合成规则,将源色与目标色组合,在图形和图像中实现混合和透明效果
*SRC_OVER 在目标色之上合成源色
*/
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));
//释放此图形的上下文并释放它所使用的所有系统资源
g.dispose();
//图片输出流
os = new FileOutputStream(targerPath);
ImageIO.write(buffImage, "jpg", os);
} catch (Exception e) {
e.printStackTrace();
return false;
}finally{
try{
if(os != null){
os.close();
return true;
}
}catch(Exception e){
e.printStackTrace();
return false;
}
}
return false;
}