1

Javaでの画像処理について質問です。

私が達成しようとしているのは、既存の画像の下にテキストを配置することです。既存の画像の上ではなく、画像の下部に追加します。私はそれをグーグルで調べましたが、すべての答えは後者を行う方法、つまり画像にテキストを配置する方法の提案でした。

以下は、私が望む結果の例の写真です。元画像はリーナ画像で画像処理した結果は下の赤い点線と一緒です。

望ましい結果

これを達成するための最速の方法は何ですか?画像の下にテキストを書き、別の小さな画像を追加しますか?

私が考えたことは、既存の BufferedImage に白い背景の高さ 30 ピクセルを追加し、その場所にテキストを書き込んでロゴを追加することです。これは最も効率的なアプローチでしょうか? 私のためにそれを行うライブラリがいくつかありますか、それとも私が言及したよりも良いアプローチがありますか?

編集:より明確にするために、結果を単一の画像として表示したい

4

1 に答える 1

2

時間をかけてじっくり読みたい

これは本当に基本的な例です。実際にロゴをレンダリングするためのコードを追加することは気にしませんでした。推奨される読書リストを読んで、それがどのように達成されるかを理解できるはずです ;)

ここに画像の説明を入力

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);
        }
    }
}
于 2012-11-14T00:34:26.000 に答える