Graphics2D生成图片绘制文字,字体尺寸设置过小会导致文字模糊不清,用什么方式可以解决?
Graphics2D类仍然保留Graphics类的绘图方法,同时增加了许多新方法。新方法将几何图形(线段、圆等)作为一个对象来绘制。在java.awt.geom包中声明的一系列类,分别用于创建各种身体图形对象。主要有:
Line2D线段类,RoundRectangle2D圆角矩形类,Ellipse2D椭圆类,Arc2D圆弧类,QuadCurve2D二次曲线类,CubicCurve2D三次曲线类。
要用Graphics2D类的新方法画一个图形。先在重画方法paintComponent()或paint()中,把参数对象g强制转换成Graphics2D对象;然后,用上述图形类提供的静态方法Double()创建该图形的对象;最后,以图形对象为参数调用Graphics2D对象的draw()方法绘制这个图形。例如以下代码用Graphics2D的新方法绘制线段和圆角矩形:
package icu.xslblog;
import org.junit.Test;
import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.stream.ImageOutputStream;
import java.awt.*;
import java.awt.geom.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Iterator;
/**
* @ClassName TestGraphics2D
* @Description: TODO
* @Author xsl
* @Date 2020/11/2 14:26
*/
public class Graphics2DTest {
@Test
public void test1() throws IOException {
// 获取源图片输入流
FileInputStream imgFileStream = new FileInputStream("E:\\1.png");
// 用imageIO读取图片
Image image = ImageIO.read(imgFileStream);
// 利用BufferedImage,将图片加载到内存中
int height = image.getHeight(null);
int width = image.getWidth(null);
BufferedImage bufImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
// 获取图像对象,来对图片进行处理
Graphics2D g = bufImg.createGraphics();
//抗锯齿
RenderingHints rh = new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
rh.put(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY);
rh.put(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB);
g.setRenderingHints(rh);
// 画一条线
g.drawImage(image, 0, 0, width, height, null);
Stroke s = new BasicStroke(10, BasicStroke.CAP_ROUND, BasicStroke.JOIN_MITER);
g.setStroke(s);
//新方法
Line2D line = new Line2D.Double(30.0,30.0,340.0,30.0);
g.draw(line);
//旧方法
//g.drawLine(30,50,300,300);
//g.drawLine(300,300,120,0);
//g.drawLine(120,0,30,50);
// 为了保证原质量输出,用ImageWriter输出图片
Iterator writers = ImageIO.getImageWritersByFormatName("png");
ImageWriter writer = (ImageWriter) writers.next();
// 指定输出路径
File f = new File("E:\\test\\out.png");
ImageOutputStream outStream = ImageIO.createImageOutputStream(f);
// 修改ImageWriteParam,原质量输出图片
ImageWriteParam imageWriteParam = writer.getDefaultWriteParam();
// 将BufferedImage转换为IIOImage,进而输出图片
IIOImage iioImage = new IIOImage(bufImg, null, null);
// 输出
writer.setOutput(outStream);
writer.write(null,iioImage,imageWriteParam);
}
}
也可以先用java.awt.geom包提供的Shape对象,并用单精度Float坐标或双精度Double坐标创建Shape对象,然后再用draw()方法绘制。例如,以下代码先创建圆弧对象,然后绘制圆弧:
Shape arc = new Arc2D.Float(30,30,150,150,40,100,Arc2D.OPEN);
g2d.draw(arc)//绘制前面创建的图形对象arc
三、Graphics2D的几何图形类