在图像上绘制文本不适用于 Graphics2D

问题描述

我在想在图像上写一些文字时遇到了一些问题。 正如我所看到的,可以使用以下代码完成:

package asd;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.net.URL;

import javax.imageio.ImageIO;

public class ImageAddingText {

    
    public static void main(String args[]) throws IOException {
        
        BufferedImage image = ImageIO.read(new File("C:\\Users\\Slobodan\\Desktop\\image2.png"));
        
        Font font = new Font("Arial",Font.BOLD,20);
        
        Graphics g = image.getGraphics();
        g.setFont(font);
        g.setColor(Color.GREEN);
        g.drawString("Medium",50,50);
        System.out.println("Finished");
        System.out.println(image.getWidth());
    }
}

因此图像被加载到内存中,image.getGraphics() 创建 Graphics2D 对象,然后设置字体、颜色和绘制字符串。 但在图像中什么也没有发生,它仍然保持完全不变。 图像是黑白相间的,白色占据了大部分空间。我试图改变颜色,图像的延伸,但似乎没有任何帮助。我期待我可以直接在图像上看到变化,我认为它应该这样工作。在它运行和编译之后,根本没有错误信息。 我将 Java 8 与 Spring Boot 一起使用。 (虽然我只运行 Java)
有没有人知道那里可能有什么问题?

非常感谢您的阅读。

解决方法

同样,您的代码适用于我,使用在线图片:

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.net.URL;

import javax.imageio.ImageIO;
import javax.swing.*;

public class ImageAddingText {

    
    public static void main(String args[]) throws IOException {
        String imgUrl = "https://media.glamour.com/photos/5a425fd3b6bcee68da9f86f8/16:9/w_2560%2Cc_limit/best-face-oil.png";
        
        // BufferedImage image = ImageIO.read(new File("C:\\Users\\Slobodan\\Desktop\\image2.png"));
        
        URL url = new URL(imgUrl);
        BufferedImage image = ImageIO.read(url);
        
        // display the original image
        Icon icon = new ImageIcon(image);
        JOptionPane.showMessageDialog(null,icon);            

        Font font = new Font("Arial",Font.BOLD,20);            
        Graphics g = image.getGraphics();
        g.setFont(font);
        g.setColor(Color.GREEN);
        g.drawString("Medium",50,50);
        
        g.dispose(); // you should always dispose resources *you* create yourself

        // display the changed image
        icon = new ImageIcon(image);            
        JOptionPane.showMessageDialog(null,icon);      
        
        System.out.println("Finished");
        System.out.println(image.getWidth());
    }
}