【发布时间】:2015-05-28 03:46:10
【问题描述】:
此代码获取输入图像并生成尺寸为两倍大的输出图像。内部循环中的前四行写入四个相同大小的原始副本,最后四行应该用两倍于原始大小的输入图像的一个副本覆盖小图像。
代码在 Windows 8 上的 Java 8 Update 45 上编译和运行没有错误。生成的图像与预期的不同,不是输入的大副本。输出的下半部分与预期的一样,但上半部分由循环内前两行写入的输入的两个原始大小副本组成。注释掉这两行会导致最初预期的结果,因此前两行似乎是最后执行的,而不是最先执行的,尽管在源代码中最先出现。
这是编译器错误、运行时的竞争条件还是代表我的大脑放屁?
如果需要,我会在某处提供示例。
import java.awt.image.*;
import java.io.*;
import javax.imageio.*;
class HelloWorldApp {
public static void main(String[] orgs) throws IOException {
BufferedImage pic = ImageIO.read(new File("cat.jpg"));
int w=pic.getWidth(),h=pic.getHeight();
BufferedImage out = new BufferedImage(w+w,h+h,pic.getType());
for (int y=0;y<h;y++) {
for (int x=0;x<w;x++) {
int pixel = pic.getRGB(x,y);
// write four small copies
out.setRGB(x ,y ,pixel); // these two lines apparently are
out.setRGB(x+w ,y ,pixel); // executed after the remaining six
out.setRGB(x ,y+h ,pixel);
out.setRGB(x+w ,y+h ,pixel);
// overwrite with one large copy
out.setRGB(x+x ,y+y ,pixel);
out.setRGB(x+x+1,y+y ,pixel);
out.setRGB(x+x ,y+y+1,pixel);
out.setRGB(x+x+1,y+y+1,pixel);
}
}
ImageIO.write(out, "bmp", new File("./cat.bmp"));
}
}
【问题讨论】:
-
为什么不直接使用
out.getGraphics().drawImage(pic, 0, 0, w * 2, h * 2, null)而不是手动处理每个像素? -
@BretC 我遇到了一个我不理解的可重现问题。假设我的代码是正确的,那将表明编译器存在令人担忧的问题。假设我的代码不正确,这表明我的大脑存在令人担忧的问题。另外,我计划做一些非常低级的图像处理。而且我还在学习,因为可以从类名中推断出来。 ;)
标签: java image rgb race-condition compiler-bug