【问题标题】:Drawing Filled Rectangle over a BufferedImage在 BufferedImage 上绘制填充矩形
【发布时间】:2012-07-23 00:10:30
【问题描述】:

因此,我正在尝试创建一个应用程序,该应用程序可以屏蔽包含敏感信息的调查部分。但是我遇到了一些问题。

我想要做的是在 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"));

无论出于何种原因,资源中的图像在此代码段之后都不会更改。关于我做错了什么有什么想法吗?

【问题讨论】:

  • 您是否遇到任何错误?运行代码后文件上的时间戳会改变吗?
  • 1) 为了尽快获得更好的帮助,请发帖 SSCCE。 2) 尝试写一张新图片。

标签: java bufferedimage graphics2d


【解决方案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、宽度和/或高度超出了图像的限制,要么是我遗漏了其他东西。

【讨论】:

    【解决方案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
    

    顺便说一句,如果没有更多代码,很难找到解决方案。 希望对你有用。

    【讨论】:

      【解决方案3】:

      这个答案很晚,但您保存的是图像而不是您正在创建的图表。我认为它必须是一个 BufferedImage 再次保存

      【讨论】:

        【解决方案4】:

        你只需要替换这一行:

        Graphics2D graph = img.createGraphics();
        

        用这个:

        Graphics2D graph = img.getGraphics();
        

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-25
        • 1970-01-01
        • 2018-06-30
        • 1970-01-01
        相关资源
        最近更新 更多