Graphics2D绘制文字模糊

Graphics2D生成图片绘制文字,字体尺寸设置过小会导致文字模糊不清,用什么方式可以解决?

img

  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/721970
  • 你也可以参考下这篇文章:使用Graphics2D生成图片
  • 除此之外, 这篇博客: Graphics2D类基本使用中的 二、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的几何图形类