本文以通俗易懂的方式来表达(欢迎各位斧正)。
一、了解绘制的步骤
了解绘制所需要的基本步骤和元素
1、创建绘制的画布( 我这里用到的类为 BufferedImage )
2、获取画笔 ( Graphics )
3、根据画笔的方法绘制你想要的内容
二、相关的类
画图类
(1)BufferedImage (画布)
(2)Graphics (画笔)
(3)Font (字体)
(4)Color (颜色)
IO类
(1)File (文件)
(2)ImageIO (图片IO 用于读取或写图片)
三、绘制代码编写
1、BufferedImage 创建画布
/** * 画布 * BufferedImage 一种Image与图像数据的访问的缓冲器。 * BufferedImage(int width, int height, int imageType) * BufferedImage.TYPE_INT_RGB 表示具有8位RGB颜色分量的整数像素的图像。 */
BufferedImage canvas = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
2、Graphics 获取画笔
/** * BufferedImage canvas.getGraphics() * 此方法返回一个Graphics2D ,但这里是向后兼容性。 * Graphics 所有图形上下文的抽象基类,允许应用程序绘制在各种设备上实现的组件,以及屏幕上的图像。 * Graphics2D类扩展了Graphics类,以提供对几何,坐标变换,颜色管理和文本布局的更复杂的控制。 这是在Java(tm)平台上呈现二维形状,文字和图像的基础类。 */
Graphics2D g = (Graphics2D) canvas.getGraphics();
绘制图片
这里介绍两种绘制方法 1、 public abstract boolean drawImage(Image img, int x, int y, int width, int height,ImageObserver observer);参数: 图片,初始x位置,y位置,图片宽度,高度,异步更新方式(一般为null就好了)
2、 public abstract boolean drawImage(Image img, int x, int y, ImageObserver observer);参数:图片, 初始x位置,y位置,异步更新方式
若要使用第二种方法,又想设置宽高,可使用以下方法 缩放图片
getScaledInstance(int width, int height, int hints) 创建此图像的缩放版本。参数: 宽,高,图片缩放算法(Image 定义了一些静态的缩放算法字段,可以参考java-api )
若要限定宽高介意使用第一种绘制方法
这里附上两种方法的 参考代码
int width = 500;
int height = 1000;
int loadX = 100;
int loadY = 100;
String url = "https://img2.wallspic.com/previews/4/6/5/2/7/172564/172564-qi_fen-yu_hui-jiao_cha-re-ri_chu-x750.jpg"
// 画布
BufferedImage canvas = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
// 画笔
Graphics2D g = (Graphics2D) canvas.getGraphics();
// 图片路径
BufferedImage image= ImageIO.read(new URL(url ));;
g.drawImage(bufferedImage, loadX, loadY(),
width,height, null);
g.drawImage(bufferedImage.getScaledInstance(width, height, Image.SCALE_DEFAULT)
, loadX, loadY, null);
绘制结束后释放资源
/**
* 释放资源
* dispose()
* 处理此图形上下文并释放其正在使用的任何系统资源。
*/
g.dispose();
3、Font 字体
创建字体 介绍如下
Font静态方法 createFont(int fontFormat, File fontFile) 使用指定的字体类型和指定的字体文件返回一个新的 Font 。 createFont(int fontFormat, InputStream fontStream) 使用指定的字体类型和输入数据返回一个新的 Font 。两种方法
Font 类中 提供了 很多的默认字体类型选择(静态字段)
这里参数一推荐 Font.TRUETYPE_FONT
其他类型容易报错(原因未知,希望有知道的小伙伴解答)
Font font= Font.createFont(Font.TRUETYPE_FONT, inputStream);
设置字体样式 介绍如下
deriveFont(float size) 通过复制当前的 Font对象并对其应用一个新的大小来创建一个新的 Font对象。这是一个重载方法由不同的参数类型区分
注意它的返回值是Font 类型
所以需要接收返回值才能成功改变字体样式
font = sPfBoldFont.deriveFont(size);
font = font.deriveFont(Font.BOLD);
与 Graphics 结合
g.setFont(font);
4、Color 颜色
创建颜色 介绍如下
构造方法
Color(int r, int g, int b) 用范围(0 - 255)范围内的指定的红色,绿色和蓝色值创建不透明的sRGB颜色。或使勇静态字段给Color赋值
Color fontColor=Color.black;
与 Graphics 结合
g.setColor(text.getFontColor());
5、File 文件
获取路径中的文件
File file= new File(url);
6、ImageIO 图片的读写
方法介绍
读
read(URL input)
read(File input)
read(InputStream input)
read(ImageInputStream stream)
读取图片的 四种静态方法
写
write(RenderedImage im, String formatName, File output) static boolean write(RenderedImage im, String formatName, ImageOutputStream output) static boolean write(RenderedImage im, String formatName, OutputStream output)
写图片的 三种静态方法
参数类型 RenderedImage 为 BufferedImage的祖父
参数:图片,生成的图片格式,输出路径
四、遇到的问题和解决方法
1、 文字居中问题
相关类
FontMetrics类定义了一个字体度量对象,该对象封装了在特定屏幕上呈现特定字体的信息。
方法
stringWidth(String str)
返回显示指定的总的超前宽度 String在此 Font 。
Graphics 可以获取 自身的 FontMetrics 可以通过他来计算字符宽度
getFontMetrics()
获取当前字体的字体度量。
初始位置减去 字符宽度的一半 便实现了 字体位置的居中
2、文字边缘锯齿状
只需要设置 Graphics 的文字抗锯齿就可以了
setRenderingHint(RenderingHints.Key hintKey, Object hintValue) 为渲染算法设置单个首选项的值。参数:渲染算法,是否开启
g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING
,RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
五、总结
绘制海报首先要知道绘制的步骤
至少学习一套可以绘制的方法,这对学习类似的绘制很有帮助。
希望能帮助到大家。