ホームページ >Java >&#&チュートリアル >Graphics2D を使用して BufferedImage にテキストを正しくオーバーレイする方法

Graphics2D を使用して BufferedImage にテキストを正しくオーバーレイする方法

DDD
DDDオリジナル
2024-12-21 12:49:09998ブラウズ

How to Correctly Overlay Text onto a BufferedImage using Graphics2D?

Graphics2D を使用して BufferedImage にテキスト オーバーレイを追加する

この質問は、Graphics2D を使用した BufferedImage へのテキストのオーバーレイに関するものです。目的は、追加されたテキストを含む最終画像をレンダリングすることです。

問題の説明

提供されたコード スニペットは、Graphics2D を使用して特定の座標にテキストをオーバーレイしようとします:

protected BufferedImage Process2(BufferedImage image){
    Graphics2D gO = image.createGraphics();
    gO.setColor(Color.red);
    gO.setFont(new Font( "SansSerif", Font.BOLD, 12 ));
    gO.drawString(this.text, this.x, this.y);
    System.err.println(this.text+this.x+this.y);
    return image;
}

ただし、出力画像は残ります

解決策

1.テキスト レンダリングのベースライン:

  • Graphics2D のdrawString() メソッドは、指定された座標を左端の文字のベースラインとして解釈します。これは、小文字や数字のディセンダーなど、ベースラインより下に広がる文字がテキストに含まれている場合、テキストが画像の外側にレンダリングされる可能性があることを意味します。

2.画像のカラー モデルの互換性:

  • 画像のカラー モデルは、オーバーレイ テキストと互換性がある必要があります。提供されたコードは画像を直接変更しようとするため、画像に互換性のないカラー モデルがある場合、予期しない結果が発生する可能性があります。

画像上にレンダリングされたテキストを使用するコードの改訂:

import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;

public class TextOverlay {

    public static BufferedImage process(BufferedImage image, String text, int x, int y) {
        int w = image.getWidth();
        int h = image.getHeight();
        BufferedImage processed = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);

        // Create Graphics2D object for the processed image
        Graphics2D g2 = processed.createGraphics();

        // Transfer the contents of the original image to the processed image
        g2.drawImage(image, 0, 0, w, h, null);

        // Set the text color and font
        g2.setColor(Color.red);
        Font font = new Font("SansSerif", Font.BOLD, 12);
        g2.setFont(font);

        // Get the font metrics to determine the bounding box for the text
        FontMetrics fm = g2.getFontMetrics(font);
        int textWidth = fm.stringWidth(text);
        int textHeight = fm.getAscent() - fm.getDescent();

        // Calculate the coordinates for the text so that it is centered at the specified location
        int textX = x - textWidth / 2;
        int textY = y + textHeight / 2;

        // Draw the text on the processed image
        g2.drawString(text, textX, textY);

        // Dispose of the Graphics2D object
        g2.dispose();

        return processed;
    }
}

使用法:

BufferedImage image = ... // Load your original image

String text = "Hello, world!";
int x = 100;
int y = 100;

BufferedImage processedImage = TextOverlay.process(image, text, x, y);

// Use the processed image as needed

以上がGraphics2D を使用して BufferedImage にテキストを正しくオーバーレイする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。