最近要做一张图片如下图,开始并不熟悉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
分享到:
相关推荐
在Java中,AWT绘图是通过`Graphics`类来实现的,它是所有可绘制对象的基础。当你创建一个AWT组件,如`Canvas`或`Panel`,你可以重写`paint`或`update`方法来进行自定义绘图。这些方法会得到一个`Graphics`对象,你...
4. **绘图(Graphics)**:AWT中的Graphics类提供了基本的绘图功能,可以在Component上绘制线条、形状、文本和图像。开发者可以通过Graphics对象进行颜色选择、线型设定、填充模式等操作。 5. **事件(Event)**:AWT...
在Java AWT中,`java.awt.Graphics`类是用于在组件上进行绘图的核心类。你可以通过获取组件的`Graphics`对象,然后调用其各种绘图方法来绘制线条、形状、文本和图像。例如,`drawRect()`用于绘制矩形,`drawLine()`...
`Graphics`类是AWT的核心绘图类,它包含了绘制线条、形状、文本和图像的各种方法。例如,`drawLine()`用于绘制直线,`drawRect()`用于绘制矩形,`drawOval()`用于绘制椭圆,`fillPolygon()`则用于填充多边形。`...
Java AWT库是Java平台标准版(Java SE)的一部分,用于构建图形用户界面(GUI)。在本项目中,我们利用AWT(Abstract Window Toolkit)来创建一个简单的画图器,它具备基本的绘图功能,如绘制线条、圆形和矩形,并...
2. **绘图与动画**: `Canvas`类继承自`Component`,是JavaAWT中用于自定义绘图的组件。开发者会在`Canvas`的`paint()`或`update()`方法中使用`Graphics`对象进行图形绘制,如绘制弹球、挡板和墙壁。为了实现弹球的...
6. **图形绘制**: Graphics类提供了基本的绘图功能,可以在组件上绘制线条、形状、文本和图像。 7. **菜单和菜单项**: MenuBar、Menu、MenuItem类可用于创建菜单栏和下拉菜单,实现命令操作。 8. **文件对话框**: ...
4. **自定义绘图**:了解如何重写`paint()`方法或使用`Graphics`类来进行自定义绘图,提升GUI的视觉效果。 5. **国际化与本地化**:掌握AWT提供的国际化支持,确保应用程序能够在不同语言环境中正确显示。 #### ...
6. **图形绘制**: AWT中的`Graphics`类允许程序员进行基本的绘图操作,如绘制线条、矩形、椭圆等。`Graphics2D`是`Graphics`的子类,提供了更多高级的绘图功能,如路径、渐变填充和文字渲染。 7. **Applet生命周期*...
通常,这会涉及到`java.awt.Graphics`类的方法,如`drawOval()`和`fillOval()`,以及可能的自定义绘图逻辑。 总的来说,Java AWT和Applet是Java历史上的重要组成部分,它们提供了基础的GUI编程能力。虽然现代Web...
5. 图形绘制:AWT的Graphics类提供了基本的绘图功能,如画线、填充形状、文字绘制等。开发者可以在Canvas或Component的paint()方法中使用Graphics对象进行自定义的图形绘制。 6. 弹出对话框:AWT也提供了对话框组件...
Java中的Abstract Window Toolkit(AWT)是Java早期的图形用户界面(GUI)库,它是Java标准版(J2SE)的一部分。AWT提供了创建和管理窗口、按钮、文本框等基本GUI组件的基本类和接口。这个压缩包文件包含了几个关于...
Graphics类提供了各种绘图函数,如绘制线、矩形、圆形、字符串等,为自定义UI组件提供了可能。 6. **窗口系统(Window System)** Frame是顶级窗口,可以包含其他组件,具有标题栏、边框、菜单栏等特性。Dialog是...
8. **颜色和绘图(Colors and Drawing)**:AWT提供了Color类来创建各种颜色,Graphics类则提供了丰富的绘图方法,如drawLine(), fillRect()等,用于在Canvas上绘制图形。 9. **对话框(Dialogs)**:在用户需要...
总结一下,Java图形开发涉及`java.awt`和`javax.swing`包的使用,通过`Graphics`对象来绘制图形。对于饼图和柱状图,我们可以直接使用基本的几何形状类,或者借助第三方库如`JFreeChart`。通过熟练掌握这些知识,...
总结来说,Java GUI的绘图涉及`repaint()`、`paint()`、`Graphics`对象和UI管理机制。理解和掌握这些概念对于创建自定义的图形组件和优化界面更新性能至关重要。正确使用`repaint()`和`paint()`方法,结合`Graphics`...
AWT的`Graphics`类允许开发者进行低级的像素级绘图,包括线条、形状、文本和图像。这通常在`paint()`或`paintComponent()`方法中实现,用于自定义组件的外观。 **5. 异步通信** AWT采用事件驱动模型,意味着程序的...
Graphics2D是Java 2D API的一部分,它提供了丰富的绘图和图形操作功能,包括添加水印到图像。下面将详细介绍如何使用Java Graphics2D实现文字和图片水印,以及如何在四个角落添加水印。 首先,我们要导入必要的Java...
在Java编程语言中,`Graphics2D`是`Graphics`类的一个子类,它提供了更高级别的绘图功能,包括绘制复杂形状、设置渲染属性以及进行颜色渐变等。在这个实例中,我们将深入探讨如何使用`Graphics2D`来绘制矩形,并实现...
在Java中,Abstract Window Toolkit(AWT)是最早提供的GUI库,为开发者提供了基本的组件和绘图功能。本篇文章将深入探讨AWT库在Java绘图中的应用。 一、AWT库介绍 AWT是Java的基础GUI库,它依赖于本地操作系统来...