我试图提取BufferedImage的10个px平方部分并将它们添加到新的BufferedImage中,非常类似于this drawImage tutorial中显示的混乱示例。但是,在我的drawImage调用之后,我的BufferedImage似乎仍然是空的。如果我调用drawString,我会看到String被正常绘制。
在Graphics.drawImage
的文档中,有声明
即使是图像区域,此方法也会在所有情况下立即返回 被绘制的还没有被缩放,抖动和转换为 电流输出设备。如果当前输出表示尚未 完成然后drawImage返回false。随着更多的图像变得 可用,加载图像的过程通知指定的 图像观察者。
我需要ImageObserver
等待输出吗?如果是这样,我应该使用什么实现类?如果没有,那么正确的解决方案是什么?
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
打印到控制台,保存的文件看起来像
此输出显示输入for循环,Graphics
对象g
连接到正确的BufferedImage
。但img
中的像素未被复制到simImg
。
答案 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);
我没有你的测试图像,所以我用了另一张图像。在进行了这个修改并运行你的类后,我得到的输出图像并非完全空白,并且看起来已经从我的样本图像中复制了像素。