`
yonglongwang
  • 浏览: 6819 次
  • 性别: Icon_minigender_1
  • 来自: 广西
社区版块
存档分类
最新评论

java awt Graphics 绘图

    博客分类:
  • java
阅读更多
最近要做一张图片如下图,开始并不熟悉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编程弹球游戏

    AWT编程,使用graphics类绘图实现弹球游戏。源码下载。

    PDEGraphics2D:Java AWT / Swing绘画调用的输出处理脚本-开源

    若要创建PDEGraphics2D实例,请向构造函数传递标准Graphics2D对象的实例以及要绘制的画布的大小:PDEGraphics2D g =新的PDEGraphics2D(Graphics2D g,int w,int h)或PDEGraphics2D g =新的PDEGraphics2D...

    java 2D 绘图技术.doc

    由Sun公司与Adobe系统公司合作推出的Java 2D API,提供了一个功能强大而且非常...Java 2D API扩展了java.awt包中定义的Graphics类和Image类,提供了高性能的二维图形、图像和文字,同时又维持了对现有AWT应用的兼容。

    Java实验报告(房屋销售管理信息系统的设计与实现_)

    在Java语言中,为GUI应用程序设计提供了强大的功能,其相关的类主要封装在两包(java.awt和javax.swing)中,其中包含了实现图形用户界面的所有基本元素,这些基本元素主要包括容器、组件、绘图工具与布局管理器等。...

    Java推箱子小游戏课程设计

    Swing编写界面,调用图片,利用swing的AWT绘图Graphics类来进行绘画更新每一帧,利 用逻辑控制每一帧的图片显示,判断是否过关刷新界面帧并加入了音乐媒体mid音乐文件的播放,后期学了线程之后再 对其扩展成为像我们...

    疯狂JAVA讲义

    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 draw绘图方法的一些实例,使用到android.graphics.Canvas,android.content.Context,还有android.graphics.Paint,android.graphics.RectF以及android.os.Bundle等,初级的Android绘制实例,有APK测试环境的...

    java项目-俄罗斯方块

    import java.awt.*; /** * 画布类,内有&lt;行数&gt; * &lt;列数&gt;个方格类的实例。 * 继承JPanel类。 * ErsBlock线程类动态改变画布类的方格颜色,画布类通过 * 检查方格颜色来体现ErsBlock块的移动情况。 */ class ...

    lgame -android-0.3

    其底 层绘图器LGrpaphics封装有J2SE以及J2ME提供的全部Graphics API(PC版采用Graphics2D封装,Android版采用Canvas模拟实现),所以能够将J2SE或J2ME开发经验直接套用其中,两版本 间主要代码能够相互移植。...

    开发项目用SWING与RCP与SWT.JFACE的分析

    开发项目用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; ...

    javaSE代码实例

    第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...

Global site tag (gtag.js) - Google Analytics