Graphics.drawImage使BufferedImage保持空

时间:2015-11-30 20:40:48

标签: java bufferedimage

我试图提取BufferedImage的10个px平方部分并将它们添加到新的BufferedImage中,非常类似于this drawImage tutorial中显示的混乱示例。但是,在我的drawImage调用之后,我的BufferedImage似乎仍然是空的。如果我调用drawString,我会看到String被正常绘制。

Graphics.drawImage的文档中,有声明

  

即使是图像区域,此方法也会在所有情况下立即返回   被绘制的还没有被缩放,抖动和转换为   电流输出设备。如果当前输出表示尚未   完成然后drawImage返回false。随着更多的图像变得   可用,加载图像的过程通知指定的   图像观察者。

我需要ImageObserver等待输出吗?如果是这样,我应该使用什么实现类?如果没有,那么正确的解决方案是什么?

MCVE

import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

public class TestImageScale {

    public static void main(String[] args) throws IOException {
        BufferedImage img = ImageIO.read(new File(
                "example.jpeg"));

        //Randomly generate some coordinates to grab pixels from
        int minDim = Math.min(img.getHeight(), img.getWidth()) - 10;
        int[][] coordMatch = new int[5][3];
        for (int i = 0; i < 5; i++) {
            coordMatch[i][0] = (int) Math.floor(Math.random() * minDim + 5);
            coordMatch[i][1] = (int) Math.floor(Math.random() * minDim + 5);
            coordMatch[i][2] = 5;
        }

        BufferedImage simImg = new BufferedImage(10, 10 * 5, BufferedImage.TYPE_INT_ARGB);
        Graphics g = simImg.getGraphics();

        for (int i = 0; i < 5; i++) {
            int x = coordMatch[i][0];
            int y = coordMatch[i][1];
            int r = coordMatch[i][2];
            //Print statement to show that we are in the for loop
            System.out.println(String.format("%s,%s,%s", x, y, r));
            //g.drawImage should write the pixels from img to simImg
            g.drawImage(img, x - r, y - r, x + r, y + r, 0, i * 10, 10, i * 10 + 10, null);
        }
        //I draw the string "hello" on simImg to show that g is working
        g.drawString("hello", 0, 10);

        ImageIO.write(simImg, "png", new File("output.png"));
    }


}

在测试运行中,我得到了行

322,228,5
118,186,5
285,351,5
21,213,5
144,48,5

打印到控制台,保存的文件看起来像

Example output showing start of printed string "hello"

此输出显示输入for循环,Graphics对象g连接到正确的BufferedImage。但img中的像素未被复制到simImg

根据要求,从Matlab的演示图像中进行测试的示例图像。但实际上,对于我测试过的每一张图像,这都是这样的。 example.png

1 个答案:

答案 0 :(得分:1)

我认为你有一些drawImage的错误顺序的参数。

Javadoc for the drawImage method you are using提到目标矩形的坐标位于源矩形的坐标之前。它看起来好像你是先用源坐标调用这个方法,然后是目标坐标。

而不是

        g.drawImage(img, x - r, y - r, x + r, y + r, 0, i * 10, 10, i * 10 + 10, null);

        g.drawImage(img, 0, i * 10, 10, i * 10 + 10, x - r, y - r, x + r, y + r, null);

我没有你的测试图像,所以我用了另一张图像。在进行了这个修改并运行你的类后,我得到的输出图像并非完全空白,并且看起来已经从我的样本图像中复制了像素。