此代碼接受一個輸入圖像,並且產生尺寸的輸出圖像的兩倍大。內循環中的前四行寫入原稿的四個相同大小的副本,最後四行應覆蓋小圖像,其中一個副本的輸入圖像是原始圖像的兩倍。可能的錯誤在Windows 8
代碼編譯和沒有錯誤運行於Java 8更新45在Windows 8.將所得圖像不是,正如所料,其中一個輸入大副本。輸出的下半部分與預期相符,但上半部分由循環內前兩行寫入的兩個原始大小的副本組成。註釋掉這兩行會導致初始期望的結果,所以似乎儘管首先出現在源代碼中,前兩行最後執行,而不是第一行。
這是一個編譯器錯誤,在運行中的競爭條件,或代表我的腦屁?
如果需要,我會掛上例子地方。
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
@BretC我遇到了一個我無法理解的可重現問題。假設我的代碼是正確的,那就表明編譯器有一個令人擔憂的問題。假設我的代碼不正確,那表明我的大腦存在令人擔憂的問題。另外,我打算做一些相當低級別的圖像處理。我仍然在學習,正如人們從類名中推斷的那樣。 ;) –