java安卓仿微信聊天软件源码(java生成仿QQ账号)
先看下效果图
实现思路
PS扣一个底层的模板图片读取底层模板图片绘制产品主图,图片加圆角处理,图片抗锯齿处理绘制产品标题,计算内容宽度并换行,文字坐标计算,字体抗锯齿处理绘制产品价格生成二维码图片,二维码白边处理PS 扣一个底层的模板图片
这个环节我们主要用附言(同后记);警官(警官)抠图并记录下每个元素的坐标和大小
/**
* 产品图片区域
*/
私有矩形imageArea=新矩形(64,64,620,620);
/**
* 标题区域
*/
私有矩形标题区域=新矩形(86,712,300,64);
/**
* 价格区域
*/
私有矩形价格区域=新矩形(552,720,118,43);
/**
* 二维码区域
*/
私有矩形qrcodeArea=新矩形(87,830,100,100);
读取底层模板图片
//读取模版图片最终BufferedImage卡mg=imageio。read(类加载器。getsystemresource(模板路径));
最终图形2d g=卡mg。创建图形();
绘制产品主图,加圆角,抗锯齿
//绘制封面BufferedImage产品img=imageio。阅读(产品。getproductimageurl());
//切圆角
ProducT IMg=设定半径(ProducT IMg,60);
//绘制
g.drawImage(productImg,imageArea.x,imageArea.y,imageArea.width,imageArea.height,null);公共静态BufferedImage设置半径(BufferedImage srcImage,int半径){ 0
int w=srcimage。GetWidth();
int h=srcimage。GetHeight();
BufferedImage输出=新的缓冲区尺寸(宽、高、缓冲区尺寸.TYPE _ INT _ ARGB);
图形2d G2=输出。create graphics();
g2.setComposite(AlphaComposite .SrcOut);
//抗锯齿
G2。setrenderinghint(RenderingHints .抗锯齿,渲染提示VALUE _ antias _ ON);
g2.setColor(新颜色(0,0,0));
G2。设置背景(颜色。黑色);
g2.setPaint(新颜色(0,0,0));
g2.fill(新的圆角2D .浮动(0,0,w,h,半径,半径));
g2.setComposite(AlphaComposite .SrcAtop);
g2.drawImage(srcImage,0,0,null);
G2。dispose();
返回输出;
}
绘制产品标题,换行,坐标计算,抗锯齿
在使用细绳绘制文本内容的时候如果,你需要填写坐标x,y如果你直接把著名图象处理软件上面的坐标用在代码里面的话你会发现位置根本就不对,那是为什么呢? src="https://p5.toutiaoimg.com/origin/pgc-image/ff4a07414f5d4918a06d3612d4e0fc02?from=pc">字体的高由个元素组成: ascent , descent
drawString中用的y坐标是指baseline的y坐标,即字体所在矩形的左上角y坐标+ascent
// 开启文本抗锯齿 g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);private void drawTitle(ProductCard product, Graphics2D g) { g.setColor(Color.decode("#666666")); g.setFont(new Font("宋体", Font.BOLD, 28)); int ascent = g.getFontMetrics(g.getFont()).getAscent(); final Rectangle2D titleBounds = g.getFontMetrics().getStringBounds(product.getTitle(), g); // 一行最多 10 个字符 final String title = product.getTitle(); final int rowMaxWidth = titleArea.width; if (titleBounds.getWidth() > rowMaxWidth) { final char[] chars = product.getTitle().toCharArray(); for (int i = 0, w = 0, start = 0; i < chars.length; i++) { w += g.getFontMetrics().charWidth(chars[i]); if (w >= rowMaxWidth) { if (start == 0) { // 写第一行 int y = titleArea.y + ascent; g.drawString(title.substring(0, i), titleArea.x, y); start = i; w = 0; } else if (start > 0) { // 写第二行 String part2 = title.substring(start, i); // 判断是否需要追加点点点 if (titleBounds.getWidth() > rowMaxWidth * 2) part2 += "..."; // 绘制 int padding = 5; int y = titleArea.y + ascent + titleArea.height / 2 + padding; g.drawString(part2, titleArea.x, y); break; } } } } else { g.drawString(title, titleArea.x, titleArea.y + ascent); } }绘制产品价格
标题会了价格就很简单了, 这里有个遗留问题就是: 如果价格超过4位数会出现超出图片的问题, 大家可以修改模板或者调整字号来解决
g.setFont(new Font("Arial", Font.BOLD, 48)); final FontMetrics fontMetrics = g.getFontMetrics(g.getFont()); g.setColor(Color.decode("#ff4f13")); g.drawString(product.getPrice(), priceArea.x, priceArea.y + fontMetrics.getAscent());生成二维码图片, 删除白边
生成二维码我们需要依赖一个第三方依赖
<!-- qrcode --> <dependency> <groupId>com.google.zxing</groupId> <artifactId>core</artifactId> <version>3.3.0</version> </dependency> <dependency> <groupId>com.google.zxing</groupId> <artifactId>javase</artifactId> <version>3.3.0</version> </dependency>生成二维码
// 生成二维码图片 QRCodeWriter qrCodeWriter = new QRCodeWriter(); BitMatrix bitMatrix = qrCodeWriter.encode(product.getProductUrl(), BarcodeFormat.QR_CODE, qrcodeArea.width, qrcodeArea.height);删除白边
public static BitMatrix deleteWhite(BitMatrix matrix) { int[] rec = matrix.getEnclosingRectangle(); int resWidth = rec[2] + 1; int resHeight = rec[3] + 1; BitMatrix resMatrix = new BitMatrix(resWidth, resHeight); resMatrix.clear(); for (int i = 0; i < resWidth; i++) { for (int j = 0; j < resHeight; j++) { if (matrix.get(i + rec[0], j + rec[1])) resMatrix.set(i, j); } } return resMatrix; }源码地址:https://gitee.com/qiaohhgz/product-tools.git