最近要做一张图片如下图,开始并不熟悉AWT,瞎忙了一天
现在完成任务把代码发出来标记一下,方便以后使用。
format 方法可能存在文字太长需要换行
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.Vector;
import javax.imageio.ImageIO;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.common.BitMatrix;
import com.iec.o2o.model.activity.vo.OfflineActProductImageVo;
/**
* @author yonglongwang
*
* 2017年6月7日 下午5:06:07
*/
public class QRCodeMain{
private static int BLACK = 0x000000;
private static int WHITE = 0xFFFFFF;
// 计算字符串的宽度
public static int getFontWidth(Graphics g, String str){
int width = 0;
for(int i=0;i<str.length();i++){
// 默认字体样式计算,否则需要传参
width += g.getFontMetrics(new Font("宋体", Font.PLAIN, 20)).charWidth(str.charAt(i));
}
return width;
}
/*
* 字符串切割,实现字符串自动换行
* maxWidth 画布的宽
**/
@SuppressWarnings({ "rawtypes", "unchecked" })
public static String[] format(Graphics g, String text, int maxWidth, Font ft) {
String[] result = null;
Vector tempR = new Vector();
int lines = 0;
int len = text.length();
int index0 = 0;
int index1 = 0;
boolean wrap;
while (true) {
int widthes = 0;
wrap = false;
for (index0 = index1; index1 < len; index1++) {
if (text.charAt(index1) == '\n') {
index1++;
wrap = true;
break;
}
widthes = g.getFontMetrics(ft).charWidth(text.charAt(index1)) + widthes;
if (widthes > maxWidth) {
break;
}
}
lines++;
if (wrap) {
tempR.addElement(text.substring(index0, index1 - 1));
} else {
tempR.addElement(text.substring(index0, index1));
}
if (index1 >= len) {
break;
}
}
result = new String[lines];
tempR.copyInto(result);
return result;
}
public static void main(String[] args) throws Exception{
// 写到图片上的参数
OfflineActProductImageVo offlineVo = new OfflineActProductImageVo();
// 创建画布
BufferedImage img = new BufferedImage(400, 475, BufferedImage.TYPE_INT_RGB);
// 得到画笔
Graphics graphics = img.getGraphics();
// 白色背景
graphics.setColor(Color.white);
// 填充白色范围
graphics.fillRect(0, 0, 400, 475);
// 添加二维码
MultiFormatWriter writer = new MultiFormatWriter();
Map<EncodeHintType, Object> hints = new HashMap<>();
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
hints.put(EncodeHintType.MARGIN, 3); //二维码边框宽度
BitMatrix bm = writer.encode("二维码内容信息", BarcodeFormat.QR_CODE, 400, 400 , hints);
int w = bm.getWidth();
int h = bm.getHeight();
for(int x=0;x<w;x++){
for(int y=0;y<h;y++){
img.setRGB(x, 70+y, bm.get(x, y) ? BLACK : WHITE);
}
}
graphics.setColor(Color.black);
graphics.setFont(new Font("宋体", Font.PLAIN, 20));
// 添加商品描述
graphics.drawString(offlineVo.getTitle(), (400-getFontWidth(graphics,offlineVo.getTitle()))/2, 20);
graphics.drawString("原价:"+offlineVo.getShopPrice(), (400-getFontWidth(graphics,"原价:"+offlineVo.getShopPrice()))/2, 45);
graphics.drawString("折扣价:"+offlineVo.getActPrice(), (400-getFontWidth(graphics,"折扣价:"+offlineVo.getActPrice()))/2, 70);
graphics.drawString("所需积分:"+offlineVo.getBonusPoint(), (400-getFontWidth(graphics,"所需积分:"+offlineVo.getBonusPoint()))/2, 95);
// 这里的坐标 y 20、45、70 都是自己随意定的高度,因为我的字体宽度为20,上面有定义
try{
ImageIO.write(img, "png", new File("E:/test.png")); // 保存本地
//ImageIO.write(img, "png", response.getOutputStream()); // 文件流输出到页面或下载
}catch(Exception e){
e.printStackTrace();
}
}
}
备注:
如果在页面显示图片的话就直接就是url地址。如果需要下载则必须在后台方法设置 HttpServletResponse 属性
response.setContentType("application/octet-stream");
response.setHeader("Accept-Ranges", "bytes");
response.setHeader("Content-Disposition", "attachment;fileName=qrcode.png");
- 大小: 4.4 KB
分享到:
相关推荐
AWT编程,使用graphics类绘图实现弹球游戏。源码下载。
若要创建PDEGraphics2D实例,请向构造函数传递标准Graphics2D对象的实例以及要绘制的画布的大小:PDEGraphics2D g =新的PDEGraphics2D(Graphics2D g,int w,int h)或PDEGraphics2D g =新的PDEGraphics2D...
由Sun公司与Adobe系统公司合作推出的Java 2D API,提供了一个功能强大而且非常...Java 2D API扩展了java.awt包中定义的Graphics类和Image类,提供了高性能的二维图形、图像和文字,同时又维持了对现有AWT应用的兼容。
在Java语言中,为GUI应用程序设计提供了强大的功能,其相关的类主要封装在两包(java.awt和javax.swing)中,其中包含了实现图形用户界面的所有基本元素,这些基本元素主要包括容器、组件、绘图工具与布局管理器等。...
Swing编写界面,调用图片,利用swing的AWT绘图Graphics类来进行绘画更新每一帧,利 用逻辑控制每一帧的图片显示,判断是否过关刷新界面帧并加入了音乐媒体mid音乐文件的播放,后期学了线程之后再 对其扩展成为像我们...
11.7 在AWT中绘图 418 11.7.1 画图的实现原理 418 11.7.2 使用Graphics类 419 11.8 处理位图 425 11.8.1 Image抽象类和BufferedImage实现类 425 11.8.2 使用ImageIO输入/输出位图 427 11.9 剪贴板 432 11.9.1...
使用android draw绘图方法的一些实例,使用到android.graphics.Canvas,android.content.Context,还有android.graphics.Paint,android.graphics.RectF以及android.os.Bundle等,初级的Android绘制实例,有APK测试环境的...
import java.awt.*; /** * 画布类,内有<行数> * <列数>个方格类的实例。 * 继承JPanel类。 * ErsBlock线程类动态改变画布类的方格颜色,画布类通过 * 检查方格颜色来体现ErsBlock块的移动情况。 */ class ...
其底 层绘图器LGrpaphics封装有J2SE以及J2ME提供的全部Graphics API(PC版采用Graphics2D封装,Android版采用Canvas模拟实现),所以能够将J2SE或J2ME开发经验直接套用其中,两版本 间主要代码能够相互移植。...
开发项目用SWING与RCP与SWT.JFACE的分析 ...*.graphics包中可以找到针对图片、光标、字体或绘图的API。比如可通过Image类调用系统中不同类型的图片文件。通过GC类实现对图片、构件或显示器的绘图功能。
import java.awt.Graphics; import java.awt.MediaTracker; import java.awt.Toolkit; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; ...
第1章 初识Java 3 1.1 Java简介 3 1.1.1 Java的不同平台 3 1.1.2 Java发展的历程 3 1.1.3 Java的特点 4 1.2 安装开发工具包 5 1.2.1 下载JDK 5 1.2.2 安装JDK 6 1.2.3 安装后Java目录的解读 7 1.3...