【问题标题】:append text and picture to an image将文本和图片附加到图像
【发布时间】:2012-11-02 11:30:24
【问题描述】:

我想问一个关于 Java 图像处理的问题。

我想要实现的是将文本放在现有图像下方。不是在现有图像上,而是附加到图像底部。我已经用谷歌搜索过了,但所有的答案都是关于如何做后者的建议 - 如何在图像上放置文字。

下面是我希望得到的结果的示例图片。原图为Leena图像,图像处理后的结果与红色虚线下方的部分一起。

实现这一点的最快方法是什么 - 在图片下方写一些文字并附加另一张较小的图片?

我想做的是在我现有的 BufferedImage 底部 30 像素高度的白色背景上附加,然后在该位置写入文本并添加徽标。这可能是最有效的方法吗?是否有一些库可以为我工作,或者有比我提到的更好的方法吗?

编辑:为了更清楚,我希望结果为单张图片

【问题讨论】:

  • 图像的 div。文本的 div
  • @gmustudent 对不起,我的意思是结果是一张图片并用 Java 完成
  • 图像准备好后,您在哪里显示?浏览器?
  • 为我的图片添加标题时,我创建了一个显示图像并在其下方显示一些文本的类。然后我意识到我不喜欢这个,因为字体看起来很差,并且在 html 中使用 google api 字体做了同样的事情。然后我制作了一个 java 类来截取该特定区域。你可以试试这样的东西,不确定它会有多大用处。

标签: java image image-processing image-manipulation


【解决方案1】:

我需要一些时间来通读一遍

这是一个非常基本的示例。我没有费心添加代码来实际呈现徽标,您可以阅读建议的阅读列表,并且应该能够弄清楚如何实现;)

public class AppendImage {

    public static void main(String[] args) {
        new AppendImage();
    }

    public AppendImage() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException ex) {
                } catch (InstantiationException ex) {
                } catch (IllegalAccessException ex) {
                } catch (UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new ImagePane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class ImagePane extends JPanel {

        private BufferedImage sourceImage;
        private BufferedImage labeledImage;

        public ImagePane() {

            try {
                sourceImage = ImageIO.read(getClass().getResource("/source.jpg"));
                labeledImage = addLabel("Hello", sourceImage);
            } catch (IOException exp) {
                exp.printStackTrace();
            }

        }

        @Override
        public Dimension getPreferredSize() {
            int width = sourceImage.getWidth() + labeledImage.getWidth();
            int height = labeledImage.getHeight();

            return new Dimension(width, height);
        }

        protected BufferedImage addLabel(String label, BufferedImage sourceImage) {

            Font font = UIManager.getFont("Label.font");
            FontMetrics fm = getFontMetrics(font);
            int width = sourceImage.getWidth() + 2;
            int height = sourceImage.getHeight() + 4 + fm.getHeight() + 4;

            BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            Graphics2D g2d = image.createGraphics();
            g2d.setColor(Color.WHITE);
            g2d.fillRect(0, 0, width, height);
            g2d.setColor(Color.BLACK);
            g2d.setStroke(new BasicStroke(2, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
            g2d.drawRect(0, 0, width - 1, height - 1);
            g2d.drawImage(sourceImage, 1, 1, this);
            g2d.setColor(Color.RED);
            g2d.setStroke(new BasicStroke(2f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND, 10f, new float[]{10f}, 0f));
            g2d.drawLine(0, sourceImage.getHeight() + 2, image.getWidth(), sourceImage.getHeight() + 2);

            int y = sourceImage.getHeight() + (((image.getHeight() - sourceImage.getHeight()) - fm.getHeight()) / 2) + 2;
            g2d.drawString(label, 2, y + fm.getAscent());

            String logo = "Logo here";
            int x = image.getWidth() - fm.stringWidth(logo) - 12;
            g2d.drawString(logo, x, y + fm.getAscent());

            g2d.dispose();

            return image;

        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            int x = 0;
            g.drawImage(sourceImage, x, 0, this);
            x += sourceImage.getWidth();
            g.drawImage(labeledImage, x, 0, this);
        }
    }
}

【讨论】:

    猜你喜欢
    • 2021-12-23
    • 2022-09-26
    • 1970-01-01
    • 1970-01-01
    • 2012-06-20
    • 1970-01-01
    • 1970-01-01
    • 2011-05-20
    • 2011-06-05
    相关资源
    最近更新 更多