package com.gwssi.rodimus.pic;
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import org.apache.tomcat.jni.OS;
/**
* 图片渲染练习
* @author 杨子豪
*/
public class applyColor2picture {
public static void main(String[] args) throws IOException {
shuiYin();
}
/**
* 给图片打水印(旋转)
* 给图片写字
*/
public static void shuiYin(){
String srcImgPath = "G:\\javaIconTestPicture\\111.jpg"; //源图片
String iconPath = "G:\\javaIconTestPicture\\bd_logo1.png"; //水印图片
String targerPath = "G:\\javaIconTestPicture\\test01.jpg"; //目标路径1 加水印不旋转
String targerPath2 = "G:\\javaIconTestPicture\\test02.jpg"; //目标路径2 加水印旋转
String targerPath3 = "G:\\javaIconTestPicture\\test03.jpg"; //目标路径3 加文字
// 给图片添加水印
applyColor2picture.markImageByIcon(iconPath, srcImgPath, targerPath);
// 给图片添加水印,水印旋转-45
applyColor2picture.markImageByIcon(iconPath, srcImgPath, targerPath2,
-45);
printCert2Picture(srcImgPath,targerPath3,"杨子豪");
}
/**
* 重载方法 不带有图片旋转功能
* @param iconPath
* @param srcImgPath
* @param targerPath
*/
private static void markImageByIcon(String iconPath, String srcImgPath,
String targerPath) {
markImageByIcon(iconPath,srcImgPath,targerPath,null);
}
/**
* 给图片添加水印、可设置水印图片旋转角度
* 核心方法是Graphics2D的drawImage()和setComposite()
* 即绘图方法和设置上下文方法
*
* @param iconPath 水印图片路径
* @param srcImgPath 源图片路径
* @param targerPath 目标图片路径
* @param degree 水印图片旋转角度
*/
private static void markImageByIcon(String iconPath, String srcImgPath,
String targerPath,Integer degree) {
OutputStream os = null; //输出流
try {
Image srcImg = ImageIO.read(new File(srcImgPath));
BufferedImage buffImg = new BufferedImage(srcImg.getWidth(null),
srcImg.getHeight(null), BufferedImage.TYPE_INT_RGB);
// 得到画笔对象
// Graphics g= buffImg.getGraphics();
Graphics2D g = buffImg.createGraphics();
// 设置对线段的锯齿状边缘处理
g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BILINEAR);
g.drawImage(srcImg.getScaledInstance(srcImg.getWidth(null), srcImg
.getHeight(null), Image.SCALE_SMOOTH), 0, 0, null);
if (null != degree) {
// 设置水印旋转
g.rotate(Math.toRadians(degree),
(double) buffImg.getWidth() / 2, (double) buffImg
.getHeight() / 2);
//rotate() 方法 第一个参数是将旋转角度转为弧度
//第二个 第三个 参数是 以哪个点旋转 即旋转中心点相对于图片的坐标
}
//缩小图片
BufferedImage imgIconSuoXiao = smallerImge(iconPath,3);
ImageIO.write(imgIconSuoXiao, "JPG", new File(iconPath));
//放大图片
BufferedImage imgIconFangDa = biggerImage(iconPath,2);
ImageIO.write(imgIconFangDa, "JPG", new File(iconPath));
// 水印图象的路径 水印一般为gif或者png的,这样可设置透明度
ImageIcon imgIcon = new ImageIcon(iconPath);
// 得到Image对象。
Image img = imgIcon.getImage();
float alpha = 0.5f; // 透明度 0.0是完全透明 1.0是完全不透明
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,
alpha)); //画笔对象的上下文设置
// 表示水印图片的位置 第四个参数为图像过滤器 BufferedImageOp类对象
g.drawImage(img, 20, 20, null);
g.dispose(); //释放该图形的上下文及所有资源
os = new FileOutputStream(targerPath);
// 生成图片 三个参数分别为原图片的像素缓冲池对象 图片格式 输出流
ImageIO.write(buffImg, "JPG", os);
System.out.println("图片完成添加Icon印章。。。。。。");
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (null != os)
os.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 在图片上写字 核心方法是Graphics2D的drawString()和setFont()方法
* 即绘制文字和设置字体方法
*
* @param srcImgPath 源图片路径
* @param targerPath 目标图片路径
*/
public static void printCert2Picture(String srcImgPath,String targerPath,String wenzi) {
OutputStream os = null; //输出流
try {
//获取画布
BufferedImage image = ImageIO.read(new File(srcImgPath));
//获取画笔
Graphics2D pen = image.createGraphics();
// 设置对线段的锯齿状边缘处理
pen.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BILINEAR);
pen.drawImage(image.getScaledInstance(image.getWidth(null), image
.getHeight(null), Image.SCALE_SMOOTH), 0, 0, null);
//绘图环境及绘图工具配置
pen.setColor(Color.RED);//设置颜色
pen.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,
0.7f));//设置上下文 文字透明度
pen.setFont(new Font("黑体",Font.BOLD,25));//设置字体
System.out.println((wenzi.length())/2+"......"+image.getWidth(null)/2);
pen.drawString(wenzi, image.getWidth(null)/2, image
.getHeight(null)/2);//开始绘图
//结束处理 收尾工作
pen.dispose();
//通过流将图片输出到目标路径
os = new FileOutputStream(targerPath);
ImageIO.write(image, "JPG", os);
//输出
System.out.println("给图片加文字成功");
} catch (IOException e) {
e.printStackTrace();
} finally{
try {
if (null != os)
os.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 对图片进行缩小
* @param originalImage 原始图片
* @param times 缩小倍数
* @return
* @return 缩小后的Image
*/
public static BufferedImage smallerImge(String srcImgPath, Integer times){
try {
BufferedImage image = ImageIO.read(new File(srcImgPath));
int width = image.getWidth()/times;
int height = image.getHeight()/times;
BufferedImage newImage = new BufferedImage(width,height,image.getType());
Graphics g = newImage.getGraphics();
g.drawImage(image, 0,0,width,height,null);
g.dispose();
System.out.println("图片缩小成功");
return newImage;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
/**
* 对图片进行放大
* @param originalImage 原始图片
* @param times 缩小倍数
* @return
* @return 缩小后的Image
*/
public static BufferedImage biggerImage(String srcImgPath, Integer times){
try {
BufferedImage image = ImageIO.read(new File(srcImgPath));
int width = image.getWidth()*times;
int height = image.getHeight()*times;
BufferedImage newImage = new BufferedImage(width,height,image.getType());
Graphics g = newImage.getGraphics();
g.drawImage(image, 0,0,width,height,null);
g.dispose();
System.out.println("图片放大成功");
return newImage;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
//有很多部分可以公共提取出来 以后会重新写一个提取出来的 公共的。
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import org.apache.tomcat.jni.OS;
/**
* 图片渲染练习
* @author 杨子豪
*/
public class applyColor2picture {
public static void main(String[] args) throws IOException {
shuiYin();
}
/**
* 给图片打水印(旋转)
* 给图片写字
*/
public static void shuiYin(){
String srcImgPath = "G:\\javaIconTestPicture\\111.jpg"; //源图片
String iconPath = "G:\\javaIconTestPicture\\bd_logo1.png"; //水印图片
String targerPath = "G:\\javaIconTestPicture\\test01.jpg"; //目标路径1 加水印不旋转
String targerPath2 = "G:\\javaIconTestPicture\\test02.jpg"; //目标路径2 加水印旋转
String targerPath3 = "G:\\javaIconTestPicture\\test03.jpg"; //目标路径3 加文字
// 给图片添加水印
applyColor2picture.markImageByIcon(iconPath, srcImgPath, targerPath);
// 给图片添加水印,水印旋转-45
applyColor2picture.markImageByIcon(iconPath, srcImgPath, targerPath2,
-45);
printCert2Picture(srcImgPath,targerPath3,"杨子豪");
}
/**
* 重载方法 不带有图片旋转功能
* @param iconPath
* @param srcImgPath
* @param targerPath
*/
private static void markImageByIcon(String iconPath, String srcImgPath,
String targerPath) {
markImageByIcon(iconPath,srcImgPath,targerPath,null);
}
/**
* 给图片添加水印、可设置水印图片旋转角度
* 核心方法是Graphics2D的drawImage()和setComposite()
* 即绘图方法和设置上下文方法
*
* @param iconPath 水印图片路径
* @param srcImgPath 源图片路径
* @param targerPath 目标图片路径
* @param degree 水印图片旋转角度
*/
private static void markImageByIcon(String iconPath, String srcImgPath,
String targerPath,Integer degree) {
OutputStream os = null; //输出流
try {
Image srcImg = ImageIO.read(new File(srcImgPath));
BufferedImage buffImg = new BufferedImage(srcImg.getWidth(null),
srcImg.getHeight(null), BufferedImage.TYPE_INT_RGB);
// 得到画笔对象
// Graphics g= buffImg.getGraphics();
Graphics2D g = buffImg.createGraphics();
// 设置对线段的锯齿状边缘处理
g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BILINEAR);
g.drawImage(srcImg.getScaledInstance(srcImg.getWidth(null), srcImg
.getHeight(null), Image.SCALE_SMOOTH), 0, 0, null);
if (null != degree) {
// 设置水印旋转
g.rotate(Math.toRadians(degree),
(double) buffImg.getWidth() / 2, (double) buffImg
.getHeight() / 2);
//rotate() 方法 第一个参数是将旋转角度转为弧度
//第二个 第三个 参数是 以哪个点旋转 即旋转中心点相对于图片的坐标
}
//缩小图片
BufferedImage imgIconSuoXiao = smallerImge(iconPath,3);
ImageIO.write(imgIconSuoXiao, "JPG", new File(iconPath));
//放大图片
BufferedImage imgIconFangDa = biggerImage(iconPath,2);
ImageIO.write(imgIconFangDa, "JPG", new File(iconPath));
// 水印图象的路径 水印一般为gif或者png的,这样可设置透明度
ImageIcon imgIcon = new ImageIcon(iconPath);
// 得到Image对象。
Image img = imgIcon.getImage();
float alpha = 0.5f; // 透明度 0.0是完全透明 1.0是完全不透明
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,
alpha)); //画笔对象的上下文设置
// 表示水印图片的位置 第四个参数为图像过滤器 BufferedImageOp类对象
g.drawImage(img, 20, 20, null);
g.dispose(); //释放该图形的上下文及所有资源
os = new FileOutputStream(targerPath);
// 生成图片 三个参数分别为原图片的像素缓冲池对象 图片格式 输出流
ImageIO.write(buffImg, "JPG", os);
System.out.println("图片完成添加Icon印章。。。。。。");
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (null != os)
os.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 在图片上写字 核心方法是Graphics2D的drawString()和setFont()方法
* 即绘制文字和设置字体方法
*
* @param srcImgPath 源图片路径
* @param targerPath 目标图片路径
*/
public static void printCert2Picture(String srcImgPath,String targerPath,String wenzi) {
OutputStream os = null; //输出流
try {
//获取画布
BufferedImage image = ImageIO.read(new File(srcImgPath));
//获取画笔
Graphics2D pen = image.createGraphics();
// 设置对线段的锯齿状边缘处理
pen.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BILINEAR);
pen.drawImage(image.getScaledInstance(image.getWidth(null), image
.getHeight(null), Image.SCALE_SMOOTH), 0, 0, null);
//绘图环境及绘图工具配置
pen.setColor(Color.RED);//设置颜色
pen.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,
0.7f));//设置上下文 文字透明度
pen.setFont(new Font("黑体",Font.BOLD,25));//设置字体
System.out.println((wenzi.length())/2+"......"+image.getWidth(null)/2);
pen.drawString(wenzi, image.getWidth(null)/2, image
.getHeight(null)/2);//开始绘图
//结束处理 收尾工作
pen.dispose();
//通过流将图片输出到目标路径
os = new FileOutputStream(targerPath);
ImageIO.write(image, "JPG", os);
//输出
System.out.println("给图片加文字成功");
} catch (IOException e) {
e.printStackTrace();
} finally{
try {
if (null != os)
os.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 对图片进行缩小
* @param originalImage 原始图片
* @param times 缩小倍数
* @return
* @return 缩小后的Image
*/
public static BufferedImage smallerImge(String srcImgPath, Integer times){
try {
BufferedImage image = ImageIO.read(new File(srcImgPath));
int width = image.getWidth()/times;
int height = image.getHeight()/times;
BufferedImage newImage = new BufferedImage(width,height,image.getType());
Graphics g = newImage.getGraphics();
g.drawImage(image, 0,0,width,height,null);
g.dispose();
System.out.println("图片缩小成功");
return newImage;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
/**
* 对图片进行放大
* @param originalImage 原始图片
* @param times 缩小倍数
* @return
* @return 缩小后的Image
*/
public static BufferedImage biggerImage(String srcImgPath, Integer times){
try {
BufferedImage image = ImageIO.read(new File(srcImgPath));
int width = image.getWidth()*times;
int height = image.getHeight()*times;
BufferedImage newImage = new BufferedImage(width,height,image.getType());
Graphics g = newImage.getGraphics();
g.drawImage(image, 0,0,width,height,null);
g.dispose();
System.out.println("图片放大成功");
return newImage;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
//有很多部分可以公共提取出来 以后会重新写一个提取出来的 公共的。