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
//线条的颜色
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实现的图片生成器相关推荐
- java课程设计图片浏览器_java课程设计图片浏览器
[实例简介] 图片浏览器最基本的功能是能浏览一个目录中的所有图片,并可以点击浏览上一张图片或者下一张图片,还有对图片放大与缩小,或者翻转图片等操作,在这里,实现了图片的浏览功能,导航功能(下一张.上一 ...
- java 图片合并_Java如何实现图片的叠加与拼接操作
关于Java实现图片的叠加与拼接的文章网络上确实很多,碰巧小编开发工作中也遇到这些问题,就做了简要的梳理,作为笔记以备不时之需. Java对图片的处理主要使用的是BufferedImage类. Buf ...
- JAVA绘制图片原理_java开发_图片截取工具实现原理
先来看看效果: 测试一: 原图: 效果图: 测试二: 原图: 效果图: 代码部分: /** * */ package com.b510; import java.awt.rectangle; impo ...
- java怎么让图片自适应_Java使背景图片自适应窗体的办法
添加一个面板,窗体布局设置为BorderLayout.center或者null都可以.在面板上进行重绘的时候,调用用 面板.getsize().getHeight和getWidth方法来设置背景图片大 ...
- java字符生成器_Java实现简单字符生成器代码例子
创建成功的字符串对象,其长度是固定的,内容是不能被修改和编辑.虽然使用"+"可以达到增加新字符或字符串的目的,但"+"会产生一个新的String实例,会在内存中 ...
- java 添加图片背景_java添加背景图片
总结:我们通常实现添加背景图片很容易,但是再添加按钮组件就会覆盖图片.原因是: 有先后啊.setlayout();与布局有很大关系 请调试代码的时候,仔细揣摩.我晕了 还可以添加文本框,密码框 fra ...
- java图片资源存放_Java编程中图片文件放哪
举个例子:importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;/*按扭类*/classBombextendsJButton{publ ...
- java ocr引擎_java 实现 OCR 图片文字识别
OCR图像识别技术的JAVA实现 最近有个需求需要用图像识别,学习记录一下. 目前网络上的开源的图像识别技术有很多,例如 OCRE(OCR Easy).Clara OCR.OCRAD.TESSERAC ...
- java水印透明_java给透明图片加水印
java实现一张透明背景的图片,添加图片水印 public static void createWaterMarkByIcon(File srcImageFile, File logoImageFil ...
最新文章
- HTTP协议类POST 和GET的区别
- python常见错误-python常见的错误提示有什么
- CentOS 6.x安装配置MongoDB 3.4.x
- 从技术岗位走向管理岗位:机会是留给有准备的人
- 悲观锁和乐观锁_乐观锁和悲观锁 以及 乐观锁的一种实现方式-CAS
- python中常见的双下方法_python中常见的双下方法_python面向对象(5)__特殊双下方法...
- EJS学习(一)之特性、安装、工作原理
- 步步为营-19-正则表达式的简单应用
- 容器编排技术 -- Kubernetes kubectl create deployment 命令详解
- Fixjs——显示基类DisplayObject
- 设置java路径_关于java路径设置
- python小课账号转卖_Python小课笔记--Python报错处理
- 数据库mysql去重_MySQL数据库去重 SQL解决
- Linux工具参考篇(网摘)
- 形容人的内核是什么意思_【得到】人人都需要的精准表达术-老光
- C stdlib.h
- bootstrap 字体太大怎么办
- NASA推出新型纳米离子RF开关
- (附源码)ssm产品裂变管理系统 毕业设计 100953
- 「go-micro」学习笔记1——Micro 与 Go-Micro