java 使用Graphics2D在图片上写字

目录
  • 使用Graphics2D在图片上写字
  • Graphics2D 的使用
    • 1、Graphics2D和Graphics的区别
    • 2、setRenderingHint的具体用处
    • 3、Stroke的使用方法

使用Graphics2D在图片上写字

首先jsp页面:src是一个方法地址

然后在Controller如下:写一个生成方法,用流进行读写

生成方法,(关键):

注意:这种方法可行,但是需要计算文字的位置,感觉不太灵活,如果谁有更好的方法请分享一下。

Graphics2D 的使用

1、Graphics2D和Graphics的区别

此 Graphics2D 类扩展Graphics 类,以提供对几何形状、坐标转换、颜色管理和文本布局更为复杂的控制。它是用于在Java(tm) 平台上呈现二维形状、文本和图像的基础类。

tips:总而言之Graphics2D是Graphics的加强版,增强了一些高级操作。

2、setRenderingHint的具体用处

为呈现算法设置单个首选项的值。提示类别包括对呈现过程中的呈现质量和总时间/质量折衷的控制。

tips:对呈现图像效果处理方式进行设置,例如抗锯齿、颜色、差值等各种效果的处理算法。(我现在主要觉得抗锯齿有用,以后会有不同的感受吧。)下面是两个对比图。

未开启抗锯齿

开启抗锯齿

下面是代码实现:

BufferedImage image = new BufferedImage(260, 80, BufferedImage.TYPE_INT_BGR);
//获取Graphics2D对象
Graphics2D graphics = image.createGraphics();
//开启文字抗锯齿
graphics.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
//设置字体
Font font = new Font("Algerian", Font.ITALIC, 40);
graphics.setFont(font);
//向画板上写字
graphics.drawString("This is test!", 10, 60);
graphics.dispose();

3、Stroke的使用方法

描绘一个 Shape 如同使用一支具有适当大小和形状的画笔描绘其轮廓。

tips:相当于画笔头,用来定义画出来的线条的特征;通过设置不同的参数来表现出各种不同的线条类型。更多详细介绍可以观看BasicStroke的用法这篇文章,里面有详细叙述。

下面是我自己写的一个小例子(指定背景图,并画一个树):

package com.msw.test;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Polygon;
import java.awt.RenderingHints;
import java.awt.Stroke;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.imageio.ImageIO;

public class MyTest {
    public static void main(String[] args) throws IOException {
        BufferedImage image = new BufferedImage(400, 500, BufferedImage.TYPE_INT_BGR);
        BufferedImage image2 = ImageIO.read(new FileInputStream(new File("F:\\2.jpg")));
        // 获取Graphics2D对象
        Graphics2D graphics = image.createGraphics();
        graphics.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION,RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);
        //把image2设置为背景图片
        graphics.drawImage(image2, 0, 0, 400, 500,null);
        // 设置画笔
        Stroke stroke = new BasicStroke(5f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND);
        graphics.setStroke(stroke);
        // 设置颜色--绿色
        graphics.setColor(Color.GREEN);
        //画树
        graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        Polygon polygon = new Polygon();
        polygon.addPoint(200, 100);
        polygon.addPoint(180, 150);
        polygon.addPoint(220, 150);
        graphics.draw(polygon);
        polygon.reset();
        polygon.addPoint(200, 150);
        polygon.addPoint(160, 200);
        polygon.addPoint(240, 200);
        graphics.draw(polygon);
        polygon.reset();
        polygon.addPoint(200, 200);
        polygon.addPoint(140, 250);
        polygon.addPoint(260, 250);
        graphics.draw(polygon);
        polygon.reset();
        polygon.addPoint(180, 250);
        polygon.addPoint(180, 300);
        polygon.addPoint(220, 300);
        polygon.addPoint(220, 250);
        graphics.draw(polygon);
        graphics.dispose();
        File file = new File("F:\\1.jpg");
        file.createNewFile();
        FileOutputStream fos = new FileOutputStream(file);
        ImageIO.write(image, "jpg", fos);
        fos.close();
    }
}

使用Graphics2D图片上写字,计算宽和高 以及字体的位置

如上图,这个是一个有中文与英文的字符串。 中文与英文字符的宽高是不一样的,如果想要生成一张宽高刚的图片,这样我就需要计算每一个字符的宽度,及合适的高;

java.awt.FontMetrics 这个类对文字的宽高位置有详细的介绍;

计算使用字体的一段字符串的宽

public static int getWordWidth(Font font, String content) {
        FontDesignMetrics metrics = FontDesignMetrics.getMetrics(font);
        int width = 0;
        for (int i = 0; i < content.length(); i++) {
            width += metrics.charWidth(content.charAt(i));
        }
        return width;
}

计算使用字体的最大的高度

   FontDesignMetrics metrics = FontDesignMetrics.getMetrics(font);
   int height = metrics.getHeight();

在图片是写文字时最合适的位置

Ascent是从基线到顶部最大的高,也可以当做一个种字体画图时最有可以点用的高度

graphics.drawString(content, 0, metrics.getAscent());

测试代码

import sun.font.FontDesignMetrics;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.font.LineMetrics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

/**
 * Created by zengrenyuan on 18/5/11.
 */
public class ImageTest {
    public static void main(String[] args) throws IOException {
        Font font = new Font("微软雅黑", Font.BOLD, 32);
        String content = "你好Java!";
        FontDesignMetrics metrics = FontDesignMetrics.getMetrics(font);
        int width = getWordWidth(font, content);//计算图片的宽
        int height = metrics.getHeight();//计算高
        BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        Graphics2D graphics = bufferedImage.createGraphics();
        graphics.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
        graphics.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));
        //设置背影为白色
        graphics.setColor(Color.WHITE);
        graphics.fillRect(0, 0, bufferedImage.getWidth(), bufferedImage.getHeight());
        graphics.setFont(font);
        graphics.setColor(Color.BLACK);
        graphics.drawString(content, 0, metrics.getAscent());//图片上写文字
        graphics.dispose();
        write(bufferedImage, "/data/test.png");
    }

    public static int getWordWidth(Font font, String content) {
        FontDesignMetrics metrics = FontDesignMetrics.getMetrics(font);
        int width = 0;
        for (int i = 0; i < content.length(); i++) {
            width += metrics.charWidth(content.charAt(i));
        }
        return width;
    }

    public static void write(BufferedImage bufferedImage, String target) throws IOException {
        File file = new File(target);
        if (!file.getParentFile().exists()) {
            file.getParentFile().mkdirs();
        }
        try (OutputStream os = new FileOutputStream(target)) {
            ImageIO.write(bufferedImage, "PNG", os);
        }
    }
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Java中的Graphics2D类基本使用教程

    Java语言在Graphics类提供绘制各种基本的几何图形的基础上,扩展Graphics类提供一个Graphics2D类,它拥用更强大的二维图形处理能力,提供.坐标转换.颜色管理以及文字布局等更精确的控制. 绘图属性 Graphics2D定义了几种方法,用于添加或改变图形的状态属性.可以通过设定和修改状态属性,指定画笔宽度和画笔的连接方式:设定平移.旋转.缩放或修剪变换图形:以及设定填充图形的颜色和图案等.图形状态属性用特定的对象存储. 1. stroke属性 stroke属性控制线条的宽度.笔

  • Graphics2D 写图片中文乱码问题及解决

    目录 Graphics2D 写图片中文乱码 概述 问题原因&解决 Graphics2D 显示文字时乱码 Graphics2D 写图片中文乱码 概述 由于工作的需求,需要往图片写字,写中文的时候出现了乱码,网上找了很多资料都不行,后来自己不断尝试,最终发现由于Font 的name设置问题导致的乱码. 问题原因&解决 字形类Font用于规范组件所使用的字形大小.样式和字体等.其构造函数: public Font(String name,int style,int size); name表示本地

  • java 使用Graphics2D在图片上写字

    目录 使用Graphics2D在图片上写字 Graphics2D 的使用 1.Graphics2D和Graphics的区别 2.setRenderingHint的具体用处 3.Stroke的使用方法 使用Graphics2D在图片上写字 首先jsp页面:src是一个方法地址 然后在Controller如下:写一个生成方法,用流进行读写 生成方法,(关键): 注意:这种方法可行,但是需要计算文字的位置,感觉不太灵活,如果谁有更好的方法请分享一下. Graphics2D 的使用 1.Graphics

  • java 在图片上写字,两个图片合并的实现方法

    实例如下: package writeimg; import javax.imageio.ImageIO; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.net.URL; public class pic

  • Java实现的简单图片上传功能示例

    本文实例讲述了Java实现的简单图片上传功能.分享给大家供大家参考,具体如下: import java.io.*; import java.net.*; /* *发送端 */ class picsend { public static void main(String[] args) throws Exception { if(args.length!=1) { System.out.println("请选择一张.jpg图片"); return; } File file = new F

  • java使用CKEditor实现图片上传功能

    java如何使用CKEditor实现图片上传功能,具体内容如下 1.根据实际需要下载指定的CKEditor 2.删除文件ckeditor/plugins/image/dialogs/image.js预览框中文本内容,并修改hidden属性值为显示上传选项卡 删除image.js中包含在双引号中的上述文本 将image.js中的hidden属性值改为0 3.修改ckeditor/config.js文件,配置"上传到服务器"按钮调用的controller接口 4."上传到服务器&

  • Java框架Struts2实现图片上传功能

    Struts 2 框架为处理文件上传提供了内置支持,它使用"在 HTML 中基于表单的文件上传".当上传一个文件时,它通常会被存储在一个临时目录中,而且它们应该由 Action 类进行处理或移动到一个永久的目录,用来确保数据不丢失.服务器在恰当的位置可能有一个安全策略,它会禁止你写到除了临时目录以外的目录,而且这个目录属于你的web应用应用程序. 通过预定义的名为文件上传的拦截器,Struts 的文件上传是可能的,这个拦截器在 org.apache.struts2.intercepto

  • Java后端SSM框架图片上传功能实现方法解析

    一.技术概述 (1)这个技术是做什么 这个技术是上传图片到服务器上,并且把地址存在数据库中.前端调用的时候之间通过地址即可调用. (2)学习该技术的原因 由于用户在写日记的时候也可以进行图片的上传,同时还有用户头像的上传. 二.技术详述 以上传用户的头像为例 (1)接口代码 @RequestMapping(value = "user/profilePhoto", produces = "application/json; charset=utf-8") @Respo

  • 基于Graphics2D drawImage图片失真的解决方案

    目录 Graphics2D drawImage图片失真的解决 常规的写法 优化的写法 Graphics2D 图片合成.图片处理需注意的细节及踩过的坑 图片处理 字体处理 Graphics2D drawImage图片失真的解决 常规的写法 graphics.drawImage(originalBufferedImage, rectangle.x, rectangle.y, rectangle.width, rectangle.height, null); 优化的写法 graphics.drawIm

  • java实现图片上加文字水印(SpringMVC + Jsp)

    看之前要先对SpringMVC进行了解打好基础,下面直接先看效果图 代码编写 1.导入相关架包 2.配置文件 web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee"

  • java实现图片上插入文字并保存

    这两天通过在网上查阅资料,了解了在图片上插入文字并保存的功能,下面记录一下. 工具类:PrintImage. package com.learning.www.utils; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.Shape; import

  • java实现在一张大图片上添加小图及文字

    目录 在一张大图上添加小图及文字 实现给图片添加水印 1. 添加文字水印 2. 添加图片水印 在一张大图上添加小图及文字 import com.sun.image.codec.jpeg.JPEGCodec; import com.sun.image.codec.jpeg.JPEGImageDecoder; import com.sun.image.codec.jpeg.JPEGImageEncoder; import javax.swing.*; import java.awt.*; impor

随机推荐