猿问

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

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,只是在所需的坐标(图像内)添加了一些额外的文本。


有什么想法我会出错吗?


慕田峪9158850
浏览 121回答 1
1回答

斯蒂芬大帝

您不需要 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;    }}
随时随地看视频慕课网APP

相关分类

Java
我要回答