在 BufferedImage 上绘制填充矩形

15
所以,我试图创建一个应用程序,可以黑掉包含敏感信息的调查的部分。但是我遇到了一点问题。我想要做的是在给定要黑掉的区域的x、y、宽度和高度的情况下,在BufferedImage上绘制填充的黑色矩形,然后将新图像写回文件系统。这是我的代码。
File imageFile = new File("images/template.jpg");
BufferedImage img = ImageIO.read(imageFile);
        
Graphics2D graph = img.createGraphics();
graph.setColor(Color.BLACK);
graph.fill(new Rectangle(x, y, width, height));
graph.dispose();
        
ImageIO.write(img, "jpg", new File("images/template.jpg"));

不知道为什么在这段代码之后,资源中的图像没有改变。有什么想法我做错了什么吗?


2
你有收到任何错误吗?在运行代码后,文件的时间戳是否发生了变化? - comodoro
  1. 为了更快地获得更好的帮助,请发布一个SSCCE
  2. 尝试编写一个新图像。
- Andrew Thompson
4个回答

2

我创建了一个可运行的示例,你的代码在我这里可以正常工作。我使用Java 8来运行此代码。

这是修改后的图像。我在我手头的一个图像上绘制了黑色正方形。

修改后的图像

以下是我运行的代码。我直接从我的文件系统中读取原始图像。

package com.ggl.testing;

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

public class ImageProcessing implements Runnable {

    public static void main(String[] args) {
        new ImageProcessing().run();
    }

    @Override
    public void run() {
        File imageFile = new File("C:\\Users\\Owner\\Pictures\\Saved Pictures\\Analog Clock Calendar.jpg");
        BufferedImage img;
        try {
            img = ImageIO.read(imageFile);
        } catch (IOException e1) {
            e1.printStackTrace();
            return;
        }

        Graphics2D graph = img.createGraphics();
        graph.setColor(Color.BLACK);
        graph.fill(new Rectangle(100, 100, 100, 100));
        graph.dispose();

        try {
            ImageIO.write(img, "jpg", 
                    new File("altered.jpg"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

我的结论是你可能没有正确读取图片,或者你的 x、y、width 和/或 height 超出了图片的限制,或者还有其他我不知道的问题。


-2

我知道这是一个老问题,但也许对某些人有用, 我认为你应该使用这个

graph.drawImage(x,y,width,height); //First you draw the image
graph.setColor(Color.black); //Then set the color to black
graph.fillRect(img.getX(), img.getY(), img.getWidth(), img.getHeight());// Finally draw a black rectangle on it

顺便说一下,如果没看到更多的代码,可能很难找到解决方案。 希望这会有用。

-2

回答有些晚了,但是你保存的是图片而不是你正在创建的图表。我认为它必须再次成为BufferedImage才能保存。


-3

你只需要替换这一行:

Graphics2D graph = img.createGraphics();

使用这个:

Graphics2D graph = img.getGraphics();

1
不是按照文档http://docs.oracle.com/javase/7/docs/api/java/awt/image/BufferedImage.html。OP 是正确的。 - nycynik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接