海报制作教程(制作属于自己的海报或名片)
简介:
生活和工作中大家是否遇到过需要生成一张完全属于自己的名片或者生成一个自定义的海报?上面展示自己的头像、有自己的简介、自己的二维码及公司的logo等,今天就跟大家分享一下如何通过Java实现自定义生成海报。
准备:
1、准备一张背景图
2、准备头像图片
实现:
Java后端实现画布绘制图像需要使用到java.awt包下面的BufferedImage
1、首先先创建一个背景图片输入流
FileInputStream fis = new FileInputStream(new File(""E:\\poster\\back.png""));
2、创建背景图片对象
Image srcImg = ImageIO.read(fis);
3、根据背景图片的宽高创建画布
BufferedImage bufferedImage = new BufferedImage(
//宽度
srcImg.getWidth(null),
//高度
srcImg.getHeight(null),
//图片类型
BufferedImage.TYPE_INT_RGB);
4、创建2D画笔对象
Graphics2D g = bufferedImage.createGraphics();
5、设置画布背景
g.drawImage(srcImg.getScaledInstance(width, height, Image.SCALE_SMOOTH), 0, 0,null);
6、开始绘制
//绘制头像
g.drawImage(transferImgForRoundImgage(avatarDir), 278, 76, 196, 196, null);
//绘制字符串(简介、描述等)
Graphics2DUtils.drawString(g, Color.decode("#000000"), new Font("微软雅黑", Font.BOLD, 48), nickName, 0, 338, width, 12, 5, true);
//绘制二维码
g.drawImage(ImageIO.read(qrCodeImg), 202, 654, 348, 348, null);
7、处理画作
g.dispose();
8、得到输出流
ByteArrayOutputStream os = new ByteArrayOutputStream();
ImageIO.write(bufferedImage, "jpg", os);
项目中有用到生成二维码的功能,使用的是谷歌推出的二维码解析和生成的开源库,项目地址为https://github.com/zxing/zxing,具体使用方法将在下片文章中给大家分享。
具体代码:
public String createPoster(String nickName,String idNum,String description,String avatarDir,String qrcodeDir) throws Exception {
String resourcePath = PosterUtils.class.getResource("/image/").getPath();
long nowTime = System.currentTimeMillis();
File qrCodeImg = new File(qrcodeDir);
File fileBg = new File("F:\\poster\\back.png");
//1、背景图片输入流
FileInputStream fis = new FileInputStream(fileBg);
//2、背景图片对象
Image srcImg = ImageIO.read(fis);
//3、创建画布,根据背景图片的宽高
BufferedImage bufferedImage = new BufferedImage(
//宽度
srcImg.getWidth(null),
//高度
srcImg.getHeight(null),
//图片类型
BufferedImage.TYPE_INT_RGB);
int width = bufferedImage.getWidth();
int height = bufferedImage.getHeight();
System.out.println("width:"+width);
System.out.println("height:"+height);
//4、得到2d画笔对象
Graphics2D g = bufferedImage.createGraphics();
// 设置对线段的锯齿状边缘处理
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
//5、设置画布背景
g.drawImage(srcImg.getScaledInstance(width, height, Image.SCALE_SMOOTH), 0, 0,null);
//6、```````````开始作画```````````
/*Font rewardFirstFont = new Font("PingFang SC Bold", Font.PLAIN, 24);
Font rewardLastFont = new Font("PingFang SC Bold", Font.PLAIN, 48);*/
//头像图片
if(StringUtils.isNotBlank(avatarDir)){
//URL avatarUrl = new URL(avatarDir);
g.drawImage(transferImgForRoundImgage(avatarDir), 278, 76, 196, 196, null);
}
//昵称
Graphics2DUtils.drawString(g, Color.decode("#000000"), new Font("微软雅黑", Font.BOLD, 48), nickName, 0, 338, width, 12, 5, true);
//ID号
Graphics2DUtils.drawString(g, Color.decode("#999999"), new Font("微软雅黑", Font.PLAIN, 32), idNum, 0, 408, width, 12, 5, true);
//简介
if(StringUtils.isNotBlank(description)){
Graphics2DUtils.drawString(g, Color.decode("#000000"), new Font("微软雅黑", Font.PLAIN, 28), description, 0, 526, width, 20, 5, true);
}
//二维码图片
g.drawImage(ImageIO.read(qrCodeImg), 202, 654, 348, 348, null);
// ```````````结束作画```````````
//7、处理画作
g.dispose();
//8、得到输出流
ByteArrayOutputStream os = new ByteArrayOutputStream();
ImageIO.write(bufferedImage, "jpg", os);
//9、转成base64编码前端可以直接显示,也可转换成其它形式比如文件
String encodeStr = Base64.getEncoder().encodeToString(os.toByteArray());
//保存为图片文件
FileUtils.writeByteArrayToFile(new File("D:/poster/" + nowTime + ".jpg"), os.toByteArray());
//10、关闭输入输出流
fis.close();
os.close();
//qrCodeImg.delete();
//petImg.delete();
return "D:/poster/" + nowTime + ".jpg";
}
/**
* 将图片处理为圆形图片
* 传入的图片必须是正方形的才会生成圆形 如果是长方形的比例则会变成椭圆的
*
* @param url
* @return
*/
public static BufferedImage transferImgForRoundImgage(String url){
BufferedImage resultImg = null;
try {
if (StringUtils.isBlank(url)) {
return null;
}
BufferedImage buffImg1 = ImageIO.read(new URL(url));
resultImg = new BufferedImage(buffImg1.getWidth(), buffImg1.getHeight(), BufferedImage.TYPE_INT_RGB);
Graphics2D g = resultImg.createGraphics();
Ellipse2D.Double shape = new Ellipse2D.Double(0, 0, buffImg1.getWidth(), buffImg1.getHeight());
// 使用 setRenderingHint 设置抗锯齿
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
resultImg = g.getDeviceConfiguration().createCompatibleImage(buffImg1.getWidth(), buffImg1.getHeight(),
Transparency.TRANSLUCENT);
//g.fill(new Rectangle(buffImg2.getWidth(), buffImg2.getHeight()));
g = resultImg.createGraphics();
// 使用 setRenderingHint 设置抗锯齿
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g.setClip(shape);
g.drawImage(buffImg1, 0, 0, null);
g.dispose();
} catch (MalformedURLException e) {
} catch (IOException e) {
}
return resultImg;
}
扩展:
根据以上实现逻辑可以进行扩展,将方法抽象出来,减少代码及模板重复开发量,可以制作海报、名片、广告图、通告图等等。
-
装修大计,水电先行,电路作为隐蔽工程,一旦发生事故,轻则全屋短路,重则引发事故。可见做好电线布局十分重要,电线不能直接埋进墙体或者地面,应该进行穿线,防止电线绝缘层受损。因此,一款好的电工套管显得十分重要。然而,市面上的电工套管琳琅满目,如何选择一款性价比高、质量过硬的电工套管成了摆在业主面前的一道[详细]
-
爱养花的朋友来自各个领域,商人也是其中之一。大部分花店都为很多商务场所和家庭提供了各种花卉盆栽。他们对花卉的挑选和摆放都有很高的要求。今天这几种很受商业人士喜爱的花,不仅好看还有好寓意!白掌白掌,也被称为“一帆风顺”,代表着万事顺利。它四季常青,不会掉叶,适合在酸性泥炭土中生长,喜欢半阴半阳的环境,[详细]
-
小叶紫檀的“变色魔法”让玩家又爱又恨——有人盘出帝王紫,有人却盘成黑煤球!今天从科学原理到实操避坑,手把手教你掌控变色节奏,告别“盘毁”焦虑!一、小叶紫檀颜色进化全阶段新料阶段(0-3个月)橘红色:新切面如新鲜胡萝卜,阳光下泛金属光泽避坑点:警惕染色做旧!真新料颜色鲜活,假货发暗发灰氧化初期(3-6[详细]
-
地毯是酒店行业普遍使用到的一种软装材料,由于地毯的投入和维护成本较高并随着多种地面材料的出现,如强化地板、同质地垫以及地砖工艺的提高,酒店逐步减少了地毯的使用量,但地毯不可替代的优势,依然无法撼动地毯在酒店行业的应用。地毯有哪些优势呢?美化环境、阻隔灰尘、降低噪音、保温、提升档次等诸多优点,是别的地[详细]
-
作为一种新型的绿色肥料,稀土元素肥料在这几年的农业生产中变得越来越受众人关注。因为这类肥料可以提升作物的生长水平,那么都有哪些肥料呢?用这些肥料种出来的作物又有哪些优势呢?稀土元素肥料。稀土元素肥料是应用了以稀土元素为主的新的化学成分配比合成研制开发出的一种新型绿色肥料。这种肥料是以稀土元素的化合物[详细]