`

Java实现的图片生成器

    博客分类:
  • java
 
阅读更多

一、本图片生成器具有以下功能特性:

     1、可以设置图片的宽度、高度、外框颜色、背景色;

     2、可以设置图片字体的大小、名称、颜色;

     3、可以设置输出图片的格式,如JPEG、GIF等;

     4、可以将图片存储到一个文件或者存储到一个输出流;

     5、可以为图片增加若干条干扰线(在生成随机码图片时可用此特性);

     6、打印在图片上的文字支持自动换行;

     7、可以将文字旋转指定弧度数;

 

二、下面列出相关的源代码

     1、抽象类AbstractImageCreator的源代码

/**
 * 模板方法模式应用:图片生成器
 */
public abstract class AbstractImageCreator {
	private static Random rnd = new Random(new Date().getTime());
	private Drawer drawer;
	
	//图片宽度
	private int width = 200;
	
	//图片高度
	private int height = 80;
	
	//外框颜色
	private Color rectColor;
	
	//背景色
	private Color bgColor;
	
	//干扰线数目
	private int lineNum = 0;
	
	//图片格式
	private String formatName = "JPEG";
	
	//字体颜色
	private Color fontColor = new Color(0, 0, 0);
	
	//字体名称
	private String fontName = "宋体";
	
	//字体大小
	private int fontSize = 15;
	
	//文字旋转的弧度数
	private double radian = 0;
	private double rotateX = 0;
	private double rotateY = 0;
	
	//缩放
	private double scale = 1;
	

	//##### 此处省略getter、setter方法 #####


	public AbstractImageCreator(Drawer drawer){
		this.drawer = drawer;
	}
	
	/**
	 * 画干扰线
	 */
	private void drawRandomLine(Graphics graph){
		for(int i=0;i<lineNum;i++){
			//线条的颜色
			graph.setColor(getRandomColor(100, 155));
			
			//线条两端坐标值
			int x1 = rnd.nextInt(width);
			int y1 = rnd.nextInt(height);
			
			int x2 = rnd.nextInt(width);
			int y2 = rnd.nextInt(height);
			
			//画线条
			graph.drawLine(x1, y1, x2, y2);
		}
	}
	
	/**
	 * 随机获取颜色对象
	 */
	private Color getRandomColor(int base, int range){
		if((base + range) > 255) range = 255 - base;
		
		int red = base + rnd.nextInt(range);
		int green = base + rnd.nextInt(range);
		int blue = base + rnd.nextInt(range);
		
		return new Color(red, green, blue);
	}
	
	public void generateImage(String text)throws IOException{
		BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
		
		if(rectColor == null) rectColor = new Color(0, 0, 0);
		if(bgColor == null) bgColor = new Color(240, 251, 200);
		
		//获取画布
		Graphics2D g = (Graphics2D)image.getGraphics();
		
		//画长方形
		g.setColor(bgColor);
		g.fillRect(0, 0, width, height);
		
		//外框
		g.setColor(rectColor);
		g.drawRect(0, 0, width-1, height-1);
		
		//画干扰线
		drawRandomLine(g);
		
		//画字符串
		drawer.draw(this, g, text);
		
		//执行
		g.dispose();
		
		//输出图片结果
		saveImage(image);
	}
	
	protected abstract void saveImage(BufferedImage image)throws IOException;
	
}

    2、类FileImageCreator的源代码

          该类将生成的图片存储到一个文件中,需要设置fileName成员变量值,该成员变量值表示图片的存储全路径。

public class FileImageCreator extends AbstractImageCreator {
	private String fileName;
	
	public String getFileName() {
		return fileName;
	}

	public void setFileName(String fileName) {
		this.fileName = fileName;
	}

	public FileImageCreator(Drawer drawer){
		super(drawer);
	}
	
	public FileImageCreator(Drawer drawer, String fileName){
		super(drawer);
		this.fileName = fileName;
	}
	
	@Override
	protected void saveImage(BufferedImage image)throws IOException{
		ImageIO.write(image, getFormatName(), new File(fileName));
	}
}

  3、类StreamImageCreator的源代码

         该类将生成的图片存储到一个输出流中,需要设置stream成员变量值。

public class StreamImageCreator extends AbstractImageCreator {
	private OutputStream stream;
	
	public OutputStream getStream() {
		return stream;
	}

	public void setStream(OutputStream stream) {
		this.stream = stream;
	}

	public StreamImageCreator(Drawer drawer){
		super(drawer);
	}
	
	public StreamImageCreator(Drawer drawer, OutputStream stream){
		super(drawer);
		this.stream = stream;
	}

	@Override
	protected void saveImage(BufferedImage image) throws IOException {
		ImageIO.write(image, getFontName(), stream);
	}
}

 

   4、Drawer接口源码

public interface Drawer {
	/**
	 * 在绘画板上绘制字符串
	 * 
	 * @param creator 图片创建器对象
	 * @param g 绘画板
	 * @param text 待绘制的字符串
	 */
	public void draw(AbstractImageCreator creator, Graphics2D g, String text);
}

 

5、SimpleDrawer类源码

public class SimpleDrawer implements Drawer {
	public void draw(AbstractImageCreator creator, Graphics2D g, String text){
		//文字旋转
		g.rotate(Math.toRadians(creator.getRadian()), creator.getRotateX(), creator.getRotateY());
		g.scale(creator.getScale(), creator.getScale());
		
		g.setColor(creator.getFontColor());
		Font font = new Font(creator.getFontName(), Font.PLAIN, creator.getFontSize());
		g.setFont(font);
		
		FontMetrics fm = g.getFontMetrics(font);
		int fontHeight = fm.getHeight(); //字符的高度
		
		int offsetLeft = 0;
		int rowIndex = 1;
		for(int i=0;i<text.length();i++){
			char c = text.charAt(i);
			int charWidth = fm.charWidth(c); //字符的宽度
			
			//另起一行
			if(Character.isISOControl(c) || offsetLeft >= (creator.getWidth()-charWidth)){
				rowIndex++;
				offsetLeft = 0;
			}
			
			g.drawString(String.valueOf(c), offsetLeft, rowIndex * fontHeight);
			offsetLeft += charWidth;
		}
	}
}

 

三、实例代码

public class Test {
	public static void main(String[] args) {
		try{
			StringBuffer sb = new StringBuffer();
			sb.append("中华人民共和国\n");
			sb.append("中华人民共和国\n");
			
			FileImageCreator creator = new FileImageCreator(new SimpleDrawer(), "c:\\img.jpeg");
			creator.setWidth(150); //图片宽度
			creator.setHeight(100); //图片高度
			creator.setLineNum(20); //干扰线条数
			creator.setFontSize(18); //字体大小
			creator.setFontName("黑体");
			
			//文字旋转
			creator.setRadian(30.0); //旋转弧度
			creator.setRotateX(creator.getWidth()/5);
			creator.setRotateY(creator.getHeight()*5/10);
			
			creator.generateImage(sb.toString());
			
			System.out.println("ok");
			
		}catch(IOException ex){
			ex.printStackTrace();
		}
	}
}

 

  • 大小: 38.8 KB
分享到:
评论

相关推荐

    java二维码生成器

    java 二维码生成器; 在使用二维码生成器时,系统默认会将生成的二维码图片放在D盘。

    用Java语言写的JPEG图象生成器程序

    用Java语言写的JPEG图象生成器程序,是进行课程设计和学习制作管理系统的好资料。

    java源码包实例源码JAVA开发源码50个合集.zip

    JAVA实现CLDC与MIDP底层编程的代码.rar Java实现HTTP连接与浏览,Java源码下载.rar Java实现的FTP连接与数据浏览程序.rar Java实现的放大镜效果附有源文件.rar Java实现的点对点短消息发送协议(smpp)开发包源码.rar ...

    富文本编辑器生成的含有图片的内容转换成word文档 java 后端下载

    wangEditor 等富文本内容 (含图片: base64格式、http的网络图片等) 转换成word java后端下载

    表情自动生成器java代码实现

    实现了臣妾真的做不到啊、妈妈再打我一次、王宝强泰囧三张图片,如想处理其他图片,在类 cn.lulei.util.img.ImgParams 、前台index.html 和 index.js 两个文件做相应的配置即可实现

    图片阅读器 Java

    对指定的图片列表 按原比例大小读取图片 从指定的文件中读取图片的路径,生成图片路径的列表,然后通过列表框来播放图片信息。

    Java验证码生成器.rar

    用Java写了一个4位(可多位)验证码生成器,封装在一个类里,只需调用一个方法,写入生成图片的类型和生成图片路径,可直接生成验证码,并返回验证码信息。 最简单的使用方法:解压包后,进入captcha文件夹,双击...

    java源码包---java 源码 大量 实例

     Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。  部分源代码摘录:  ftpClient = new FtpClient(); //实例化FtpClient对象  String serverAddr=jtfServer.getText(); //得到服务器地址  ...

    Java实现简单字符生成器代码例子

    主要介绍了Java实现简单字符生成器代码例子,本文直接给出实现代码,需要的朋友可以参考下

    java开源包4

    jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...

    java源码包4

     Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。  部分源代码摘录:  ftpClient = new FtpClient(); //实例化FtpClient对象  String serverAddr=jtfServer.getText(); //得到服务器...

    java开源包5

    jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...

    java源码包3

     Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。  部分源代码摘录:  ftpClient = new FtpClient(); //实例化FtpClient对象  String serverAddr=jtfServer.getText(); //得到服务器...

    JAVA上百实例源码以及开源项目源代码

     Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。  部分源代码摘录:  ftpClient = new FtpClient(); //实例化FtpClient对象  String serverAddr=jtfServer.getText(); //得到服务器地址  ...

    JAVA上百实例源码以及开源项目

    百度云盘分享 ... Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。  部分源代码摘录:  ftpClient = new FtpClient(); //实例化FtpClient对象  String serverAddr=jtfServer.getText();...

    java源码包2

     Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。  部分源代码摘录:  ftpClient = new FtpClient(); //实例化FtpClient对象  String serverAddr=jtfServer.getText(); //得到服务器...

    网上购物系统java源码实现

    为了敏捷快速开发,提升研发效率,框架内置了一键CRUD代码生成器,自定义了模块生成模板,可以根据已建好的表结构(字段注释需规范)快速的一键生成整个模块的所有代码和增删改查等等功能业务,真正实现了低代码开发,...

    Java源码包100个设计实例.zip

    Java半透明图片实现的步骤及源代码.rar Java右键弹出菜单源码 Java吃豆子游戏源代码.rar Java图片加水印,支持旋转和透明度设置 Java圆形按钮实例代码,含注释 Java圆形电子时钟源代码 Java多用户聊天室程序(毕业...

    1寸2寸证件照生成器

    1寸2寸证件照生成器

    动态缩略图实现方案

    动态缩略图实现方案,java实现动态缩略图

Global site tag (gtag.js) - Google Analytics