因此,我正在尝试创建一个可以删除包含敏感信息的调查部分的应用程序。但是我遇到了一些问题。
我想要做的是在BufferedImage上绘制填充的黑色矩形,给定x,y,宽度和所需区域的高度为黑色,然后将新图像写回我的文件系统。这是我的代码。
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"));
无论出于何种原因,资源中的图像在此代码段后都不会更改。关于我做错了什么的任何想法?
答案 0 :(得分:1)
我为您的代码创建了一个可运行的示例,它对我来说很好用。我使用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,宽度和/或高度超出了图像的范围,或者我错过了其他东西。
答案 1 :(得分:0)
检查您的x,y和宽度,高度是否真正落入图像尺寸。你可能正在绘制图像范围之外的某个地方。在调试模式中执行以验证或println()变量等。
答案 2 :(得分:0)
这个答案很晚,但你保存的是图像,而不是你正在创建的图表。我认为它必须再次成为BufferedImage来保存
答案 3 :(得分:-1)
我知道这是一个老问题,但也许对某人有用, 我想你应该用这个
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
顺便说一句,如果没有更多的代码,很难找到解决方案。 希望它会有用。
答案 4 :(得分:-2)
您只需要替换此行:
Graphics2D graph = img.createGraphics();
用这个:
Graphics2D graph = img.getGraphics();