为了账号安全,请及时绑定邮箱和手机立即绑定

Java Graphics2D drawString 正在“遮蔽”源图像

Java Graphics2D drawString 正在“遮蔽”源图像

慕田峪9158850 2023-07-19 15:44:46
Java 8 和 Mac OS (High Sierra) 在这里。我有以下类TextOverlayer,它从文件系统读取图像,并且需要将一些红色文本覆盖到图像上,然后将该“覆盖”图像保存为文件系统上的不同文件:public class TextOverlayer implements ImageObserver {  public static void main(String[] args) throws IOException {      // Instantiate a TextOverlayer and read a source/input image from disk      TextOverlayer textOverlayer = new TextOverlayer();      BufferedImage bufferedImage = ImageIO.read(Paths.get("/User/myuser/pix/sourceImage.jpg").toFile());      // Lay some text over the image at specific coordinates      BufferedImage drawn = textOverlayer.drawText(bufferedImage, "Some text");      // Write the overlayed image to disk      File outputfile = new File("/User/myuser/pix/targetImage.jpg");      ImageIO.write(drawn, "jpg", outputfile);  }  private BufferedImage drawText(BufferedImage old, String text) {      int w = old.getWidth() / 3;      int h = old.getHeight() / 3;      BufferedImage img = new BufferedImage(              w, h, BufferedImage.TYPE_INT_ARGB);      Graphics2D g2d = img.createGraphics();      g2d.drawImage(old, 0, 0, w, h, this);      g2d.setPaint(Color.red);      g2d.setFont(new Font("Serif", Font.BOLD, 20));      FontMetrics fm = g2d.getFontMetrics();      int x = img.getWidth() - fm.stringWidth(text) - 5;      int y = fm.getHeight();      g2d.drawString(text, x, y);      g2d.dispose();      return img;  }  @Override  public boolean imageUpdate(Image img, int infoflags, int x, int y, int width, int height) {      return false;  }}当它运行时,不会抛出任何错误,并且targetImage.jpg会成功写入磁盘,除了它只是一个小黑匣子的图像。我本来期望targetImage.jpg与 完全相同sourceImage.jpg,只是在所需的坐标(图像内)添加了一些额外的文本。有什么想法我会出错吗?
查看完整描述

1 回答

?
斯蒂芬大帝

TA贡献1827条经验 获得超8个赞

您不需要 ImageObserver,并且您可能无法使用附带的写入器将带有 Alpha 通道的图像写入 JPEG 文件。


这有效:


public class TextOverlayer {


    public static void main(String[] args) throws IOException {


        // Instantiate a TextOverlayer and read a source/input image from disk

        TextOverlayer textOverlayer = new TextOverlayer();

        BufferedImage bufferedImage = ImageIO.read(Paths.get("/User/myuser/pix/sourceImage.jpg").toFile());


        // Lay some text over the image at specific coordinates

        BufferedImage drawn = textOverlayer.drawText(bufferedImage, "Some text");


        // Write the overlayed image to disk

        File outputfile = new File("/User/myuser/pix/targetImage.jpg");

        boolean result = ImageIO.write(drawn, "jpg", outputfile);

        if (!result) {

            System.out.println("FAILED");

        }

    }


    private BufferedImage drawText(BufferedImage old, String text) {


        int w = old.getWidth();

        int h = old.getHeight();

        BufferedImage img = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);

        Graphics2D g2d = img.createGraphics();

        g2d.drawImage(old, 0, 0, w, h, null);

        g2d.setPaint(Color.red);

        g2d.setFont(new Font("Serif", Font.BOLD, 20));

        FontMetrics fm = g2d.getFontMetrics();

        int x = img.getWidth() - fm.stringWidth(text) - 5;

        int y = fm.getHeight();

        g2d.drawString(text, x, y);

        g2d.dispose();


        return img;


    }

}


查看完整回答
反对 回复 2023-07-19
  • 1 回答
  • 0 关注
  • 120 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信