来个应景的,今天就是挨炮,不是,apple之夜了,大家的头像也开始应景了。
觉得带个小帽子挺萌的,想了想,那就自己动手写一个吧
首先准备两张图片,一张头像的,比如这张
然后准备一张圣诞帽的png图片,比如这张
因为ps实在苦手,就在网上找了素材,然后自己截取了一部分
下面是代码了,主要的思路
1. 读取原始图片input.jpg
2. 通过Graphics绘制到BufferedImage
3. 读取cover的图片cover.png
4. 通过Graphics再次绘制到BufferedImage
5. 输出到文件output.jpg
具体实现如下
// 获取原始图片
File img = new File("input.jpg");
Image originImg = ImageIO.read(img);
// 获取原始图片的宽和高
int width = originImg.getWidth(null);
int height = originImg.getHeight(null);
System.out.println("原始图片的宽为:" + width + "\n原始图片的高为:" + height);
if (width != height) {
width = width > height ? height : width;
height = width > height ? height : width;
}
System.out.println("输出图片的宽为:" + width + "\n输出图片的高为:" + height);
// bufferimage 缓存图片,用于绘制输出的图片,输出大小与原始图片一致
BufferedImage image = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
Graphics g = image.createGraphics();
// 绘制原始图片
g.drawImage(originImg, 0, 0, width, height, null);
/**
* cover.png 作为水印图片,覆盖在原始图片之上
*/
// 获取cover图片
File cover = new File("cover.png");
Image coverImg = ImageIO.read(cover);
// 获取cover图片大小
int widthCover = coverImg.getWidth(null);
int heightCover = coverImg.getHeight(null);
// 绘制水印图片,图片位置为左上角,大小与cover图片相同
g.drawImage(coverImg, 0, 0, widthCover, heightCover, null);
g.dispose();
// 输出流和输出文件
FileOutputStream out = new FileOutputStream("output.jpg");
// 下面代码将输出图片转换为JPEG、JPG文件
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
encoder.encode(image);
out.close();
System.out.println("输出文件output.jpg");
最终效果如下
原谅我不会psQAQ,简单的来说就是叠加两张图片在输出就好了,没做太多的细节处理,图片不是正方形的会直接压成正方形,但是!谁没事拿个长方形做头像啊!!!
代码有可能会出现错误,因为 JPEGCodec 和 JPEGImageEncoder 是受限访问的,需要自己手动修改
修改方式:
1. 右键项目propertites
2. Java Complier
3. Errors/Warning
4. Enable project specified settings
5. 修改depracated and restricked API
6. 修改Forbidden reference warnning
7. 代码里添加 @SuppressWarnings("restriction") 元注释去除警告