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

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

//线条的颜色

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

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

分享到:

2011-12-16 15:32

浏览 319

评论

java 图片生成器_Java实现的图片生成器相关推荐

  1. java课程设计图片浏览器_java课程设计图片浏览器

    [实例简介] 图片浏览器最基本的功能是能浏览一个目录中的所有图片,并可以点击浏览上一张图片或者下一张图片,还有对图片放大与缩小,或者翻转图片等操作,在这里,实现了图片的浏览功能,导航功能(下一张.上一 ...

  2. java 图片合并_Java如何实现图片的叠加与拼接操作

    关于Java实现图片的叠加与拼接的文章网络上确实很多,碰巧小编开发工作中也遇到这些问题,就做了简要的梳理,作为笔记以备不时之需. Java对图片的处理主要使用的是BufferedImage类. Buf ...

  3. JAVA绘制图片原理_java开发_图片截取工具实现原理

    先来看看效果: 测试一: 原图: 效果图: 测试二: 原图: 效果图: 代码部分: /** * */ package com.b510; import java.awt.rectangle; impo ...

  4. java怎么让图片自适应_Java使背景图片自适应窗体的办法

    添加一个面板,窗体布局设置为BorderLayout.center或者null都可以.在面板上进行重绘的时候,调用用 面板.getsize().getHeight和getWidth方法来设置背景图片大 ...

  5. java字符生成器_Java实现简单字符生成器代码例子

    创建成功的字符串对象,其长度是固定的,内容是不能被修改和编辑.虽然使用"+"可以达到增加新字符或字符串的目的,但"+"会产生一个新的String实例,会在内存中 ...

  6. java 添加图片背景_java添加背景图片

    总结:我们通常实现添加背景图片很容易,但是再添加按钮组件就会覆盖图片.原因是: 有先后啊.setlayout();与布局有很大关系 请调试代码的时候,仔细揣摩.我晕了 还可以添加文本框,密码框 fra ...

  7. java图片资源存放_Java编程中图片文件放哪

    举个例子:importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;/*按扭类*/classBombextendsJButton{publ ...

  8. java ocr引擎_java 实现 OCR 图片文字识别

    OCR图像识别技术的JAVA实现 最近有个需求需要用图像识别,学习记录一下. 目前网络上的开源的图像识别技术有很多,例如 OCRE(OCR Easy).Clara OCR.OCRAD.TESSERAC ...

  9. java水印透明_java给透明图片加水印

    java实现一张透明背景的图片,添加图片水印 public static void createWaterMarkByIcon(File srcImageFile, File logoImageFil ...

最新文章

  1. HTTP协议类POST 和GET的区别
  2. python常见错误-python常见的错误提示有什么
  3. CentOS 6.x安装配置MongoDB 3.4.x
  4. 从技术岗位走向管理岗位:机会是留给有准备的人
  5. 悲观锁和乐观锁_乐观锁和悲观锁 以及 乐观锁的一种实现方式-CAS
  6. python中常见的双下方法_python中常见的双下方法_python面向对象(5)__特殊双下方法...
  7. EJS学习(一)之特性、安装、工作原理
  8. 步步为营-19-正则表达式的简单应用
  9. 容器编排技术 -- Kubernetes kubectl create deployment 命令详解
  10. Fixjs——显示基类DisplayObject
  11. 设置java路径_关于java路径设置
  12. python小课账号转卖_Python小课笔记--Python报错处理
  13. 数据库mysql去重_MySQL数据库去重 SQL解决
  14. Linux工具参考篇(网摘)
  15. 形容人的内核是什么意思_【得到】人人都需要的精准表达术-老光
  16. C stdlib.h
  17. bootstrap 字体太大怎么办
  18. NASA推出新型纳米离子RF开关
  19. (附源码)ssm产品裂变管理系统 毕业设计 100953
  20. 「go-micro」学习笔记1——Micro 与 Go-Micro

热门文章

  1. 关于清理「死代码」,我有一些好方法推荐给你
  2. 每位开发人员都应该阅读的优秀源代码,长啥样?
  3. 不要再被Python洗脑了!!
  4. 为什么 PUSH 推送要经常背锅?
  5. 不好好写代码,就只能回去当总理了!
  6. 沙迦美国大学科研副校长赵伟:揭秘工业 4.0 核心技术 CPS 的前世今生 | 人物志...
  7. 免费 | 开源操作系统年度盛会最新日程曝光,邀您一同开启烧脑模式!
  8. Android 支持主线 Linux 内核指日可待?
  9. 人工智能如何改变物联网?
  10. 全中!七大初学者易踩的坑!