Java如何在图像下添加字符串并调整它的大小? [英] Java How to add String below an image and resizing it?

查看:121
本文介绍了Java如何在图像下添加字符串并调整它的大小?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图在png图像下添加一个标题字符串。问题是文本没有空间,我不得不添加一些空白。我不知道如何做到这一点。这是我迄今为止所做的:

  BufferedImage image = ImageIO.read(new File(output.png)) ; 
图形g = image.getGraphics();
g.setFont(g.getFont()。deriveFont(30f));
g.setColor(Color.BLACK);
g.drawString(Hello World!,100,350);
g.dispose();
ImageIO.write(image,png,new File(test.png));


解决方案

为什么不简单地将所需的间距添加到新的 BufferedImage s height?



以下是我所做的一个例子:



真正的奇迹发生在这里:

pre $ private $ BufferedImage drawTextOnImage(String text,BufferedImage image,int space){
BufferedImage bi =新的BufferedImage(image.getWidth(),image.getHeight()+ space,BufferedImage.TRANSLUCENT);
Graphics2D g2d =(Graphics2D)bi.createGraphics();
g2d.addRenderingHints(new RenderingHints(RenderingHints.KEY_RENDERING,RenderingHints.VALUE_RENDER_QUALITY));
g2d.addRenderingHints(new RenderingHints(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON));
g2d.addRenderingHints(new RenderingHints(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_ON));

g2d.drawImage(image,0,0,null);

g2d.setColor(Color.BLACK);
g2d.setFont(new Font(Calibri,Font.BOLD,20));
FontMetrics fm = g2d.getFontMetrics();
int textWidth = fm.stringWidth(text);

//在新空间中图像底部的中心文本
g2d.drawString(text,(bi.getWidth()/ 2) - textWidth / 2,bi.getHeight()) ;

g2d.dispose();
返回bi;
}

以上方法将允许您传入文字,图像的引用以及您想要添加的间距的数量。它会将字符串绘制到指定空间内的图像上。
在通过以下方法将图像传递给上述方法( drawTextOnImage(..))之前,图像被调整大小:

  public static BufferedImage resize(BufferedImage image,int width,int height){
BufferedImage bi = new BufferedImage(width,height,BufferedImage.TRANSLUCENT);
Graphics2D g2d =(Graphics2D)bi.createGraphics();
g2d.addRenderingHints(new RenderingHints(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON));
g2d.addRenderingHints(new RenderingHints(RenderingHints.KEY_RENDERING,RenderingHints.VALUE_RENDER_QUALITY));
g2d.drawImage(image,0,0,width,height,null);
g2d.dispose();
返回bi;
}

Test.java:

  import java.awt.Color; 
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
导入javax.swing.SwingUtilities;

public class Test {

public Test(){
createAndShowGui();


public static void main(String [] args){
SwingUtilities.invokeLater(new Runnable(){
@Override
public void run (){
new Test();
}
});
}

private void createAndShowGui(){
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

BufferedImage bi = null;
尝试{
bi = ImageIO.read(新网址(http://cs.anu.edu.au/student/comp6700/icons/DukeWithHelmet.png));
} catch(IOException ex){
ex.printStackTrace();
}

BufferedImage resizedImage = resize(bi,200,200);

final BufferedImage textRenderedImage = drawTextOnImage(Hello,resizedImage,15);

JPanel p = new JPanel(){
@Override
protected void paintComponent(Graphics grphcs){
super.paintComponent(grphcs);
Graphics2D g2d =(Graphics2D)grphcs;
g2d.addRenderingHints(new RenderingHints(RenderingHints.KEY_RENDERING,RenderingHints.VALUE_RENDER_QUALITY));
g2d.addRenderingHints(new RenderingHints(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON));
g2d.drawImage(textRenderedImage,0,0,null);

$ b @Override
public Dimension getPreferredSize(){
return new Dimension(textRenderedImage.getWidth(),textRenderedImage.getHeight());
}
};

frame.add(p);
frame.pack();
frame.setVisible(true);
}

private BufferedImage drawTextOnImage(String text,BufferedImage image,int space){
BufferedImage bi = new BufferedImage(image.getWidth(),image.getHeight()+ space ,BufferedImage.TRANSLUCENT);
Graphics2D g2d =(Graphics2D)bi.createGraphics();
g2d.addRenderingHints(new RenderingHints(RenderingHints.KEY_RENDERING,RenderingHints.VALUE_RENDER_QUALITY));
g2d.addRenderingHints(new RenderingHints(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON));
g2d.addRenderingHints(new RenderingHints(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_ON));

g2d.drawImage(image,0,0,null);

g2d.setColor(Color.BLACK);
g2d.setFont(new Font(Calibri,Font.BOLD,20));
FontMetrics fm = g2d.getFontMetrics();
int textWidth = fm.stringWidth(text);

//在新空间中图像底部的中心文本
g2d.drawString(text,(bi.getWidth()/ 2) - textWidth / 2,bi.getHeight()) ;

g2d.dispose();
返回bi;
}

public static BufferedImage resize(BufferedImage image,int width,int height){
BufferedImage bi = new BufferedImage(width,height,BufferedImage.TRANSLUCENT);
Graphics2D g2d =(Graphics2D)bi.createGraphics();
g2d.addRenderingHints(new RenderingHints(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON));
g2d.addRenderingHints(new RenderingHints(RenderingHints.KEY_RENDERING,RenderingHints.VALUE_RENDER_QUALITY));
g2d.drawImage(image,0,0,width,height,null);
g2d.dispose();
返回bi;
}
}


I am trying to add a title string below a png image. The problem is that there is no space for the text and I have to add some white space. Im not sure how to do this. This is what I have done so far:

        BufferedImage image = ImageIO.read(new File("output.png"));
        Graphics g = image.getGraphics();
        g.setFont(g.getFont().deriveFont(30f));
        g.setColor(Color.BLACK);
        g.drawString("Hello World!", 100, 350);
        g.dispose();
        ImageIO.write(image, "png", new File("test.png"));

解决方案

Why not simply add the spacing you need to the new BufferedImages height?

Here is an example I made:

The real magic happens here:

private BufferedImage drawTextOnImage(String text, BufferedImage image, int space) {
    BufferedImage bi = new BufferedImage(image.getWidth(), image.getHeight() + space, BufferedImage.TRANSLUCENT);
    Graphics2D g2d = (Graphics2D) bi.createGraphics();
    g2d.addRenderingHints(new RenderingHints(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY));
    g2d.addRenderingHints(new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON));
    g2d.addRenderingHints(new RenderingHints(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON));

    g2d.drawImage(image, 0, 0, null);

    g2d.setColor(Color.BLACK);
    g2d.setFont(new Font("Calibri", Font.BOLD, 20));
    FontMetrics fm = g2d.getFontMetrics();
    int textWidth = fm.stringWidth(text);

    //center text at bottom of image in the new space
    g2d.drawString(text, (bi.getWidth() / 2) - textWidth / 2, bi.getHeight());

    g2d.dispose();
    return bi;
}

The above method will allow you to pass in text, a reference to the image and the amount of spacing you want to add. It will than draw the string to the image within the specified space. The image is resized before passing it to the above method (drawTextOnImage(..)) via:

public static BufferedImage resize(BufferedImage image, int width, int height) {
    BufferedImage bi = new BufferedImage(width, height, BufferedImage.TRANSLUCENT);
    Graphics2D g2d = (Graphics2D) bi.createGraphics();
    g2d.addRenderingHints(new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON));
    g2d.addRenderingHints(new RenderingHints(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY));
    g2d.drawImage(image, 0, 0, width, height, null);
    g2d.dispose();
    return bi;
}

Test.java:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class Test {

    public Test() {
        createAndShowGui();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Test();
            }
        });
    }

    private void createAndShowGui() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        BufferedImage bi = null;
        try {
            bi = ImageIO.read(new URL("http://cs.anu.edu.au/student/comp6700/icons/DukeWithHelmet.png"));
        } catch (IOException ex) {
            ex.printStackTrace();
        }

        BufferedImage resizedImage = resize(bi, 200, 200);

        final BufferedImage textRenderedImage = drawTextOnImage("Hello", resizedImage, 15);

        JPanel p = new JPanel() {
            @Override
            protected void paintComponent(Graphics grphcs) {
                super.paintComponent(grphcs);
                Graphics2D g2d = (Graphics2D) grphcs;
                g2d.addRenderingHints(new RenderingHints(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY));
                g2d.addRenderingHints(new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON));
                g2d.drawImage(textRenderedImage, 0, 0, null);
            }

            @Override
            public Dimension getPreferredSize() {
                return new Dimension(textRenderedImage.getWidth(), textRenderedImage.getHeight());
            }
        };

        frame.add(p);
        frame.pack();
        frame.setVisible(true);
    }

    private BufferedImage drawTextOnImage(String text, BufferedImage image, int space) {
        BufferedImage bi = new BufferedImage(image.getWidth(), image.getHeight() + space, BufferedImage.TRANSLUCENT);
        Graphics2D g2d = (Graphics2D) bi.createGraphics();
        g2d.addRenderingHints(new RenderingHints(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY));
        g2d.addRenderingHints(new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON));
        g2d.addRenderingHints(new RenderingHints(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON));

        g2d.drawImage(image, 0, 0, null);

        g2d.setColor(Color.BLACK);
        g2d.setFont(new Font("Calibri", Font.BOLD, 20));
        FontMetrics fm = g2d.getFontMetrics();
        int textWidth = fm.stringWidth(text);

        //center text at bottom of image in the new space
        g2d.drawString(text, (bi.getWidth() / 2) - textWidth / 2, bi.getHeight());

        g2d.dispose();
        return bi;
    }

    public static BufferedImage resize(BufferedImage image, int width, int height) {
        BufferedImage bi = new BufferedImage(width, height, BufferedImage.TRANSLUCENT);
        Graphics2D g2d = (Graphics2D) bi.createGraphics();
        g2d.addRenderingHints(new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON));
        g2d.addRenderingHints(new RenderingHints(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY));
        g2d.drawImage(image, 0, 0, width, height, null);
        g2d.dispose();
        return bi;
    }
}

这篇关于Java如何在图像下添加字符串并调整它的大小?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆