2015-05-27 21 views
4

此代碼接受一個輸入圖像,並且產生尺寸的輸出圖像的兩倍大。內循環中的前四行寫入原稿的四個相同大小的副本,最後四行應覆蓋小圖像,其中一個副本的輸入圖像是原始圖像的兩倍。可能的錯誤在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")); 

    } 
} 
+1

爲什麼不直接使用'out.getGraphics()調用drawImage(PIC ,0,0,w * 2,h * 2,null)'而不是手動執行每個像素? – BretC

+1

@BretC我遇到了一個我無法理解的可重現問題。假設我的代碼是正確的,那就表明編譯器有一個令人擔憂的問題。假設我的代碼不正確,那表明我的大腦存在令人擔憂的問題。另外,我打算做一些相當低級別的圖像處理。我仍然在學習,正如人們從類名中推斷的那樣。 ;) –

回答

2

這是一個大腦放屁我害怕。 Becaue你正在做同樣的循環中的任何事情,在以後的迭代中執行最初的四行(小拷貝)最終會覆蓋在前面的迭代中由最後四行(大拷貝)寫入的像素。

我不知道我該措辭出色,但希望你能明白我的意思。

+0

這是一個簡潔的陳述,表明我的(隱式)假設寫入不重疊是不正確的。但它並沒有解釋究竟發生了什麼。 –

4

讓我們試着展示發生了什麼。假設你的形象是:

┌───╥───┬───┐ 
│ ║ 0 │ 1 │ 
╞═══╬═══╪═══╡ 
│ 0 ║ A │ B │ 
├───╫───┼───┤ 
│ 1 ║ C │ D │ 
└───╨───┴───┘

當x = 0,Y = 0,前四行之後:

┌───╥───┬───┬───┬───┐ 
│ ║ 0 │ 1 │ 2 │ 3 │ 
╞═══╬═══╪═══╪═══╪═══╡ 
│ 0 ║ A │ │ A │ │ 
├───╫───┼───┼───┼───┤ 
│ 1 ║ │ │ │ │ 
├───╫───┼───┼───┼───┤ 
│ 2 ║ A │ │ A │ │ 
├───╫───┼───┼───┼───┤ 
│ 3 ║ │ │ │ │ 
└───╨───┴───┴───┴───┘

最後四行後:

┌───╥───┬───┬───┬───┐ 
│ ║ 0 │ 1 │ 2 │ 3 │ 
╞═══╬═══╪═══╪═══╪═══╡ 
│ 0 ║ A │ A │ A │ │ 
├───╫───┼───┼───┼───┤ 
│ 1 ║ A │ A │ │ │ 
├───╫───┼───┼───┼───┤ 
│ 2 ║ A │ │ A │ │ 
├───╫───┼───┼───┼───┤ 
│ 3 ║ │ │ │ │ 
└───╨───┴───┴───┴───┘

當x = 1,y = 0,前四行後:

┌───╥───┬───┬───┬───┐ 
│ ║ 0 │ 1 │ 2 │ 3 │ 
╞═══╬═══╪═══╪═══╪═══╡ 
│ 0 ║ A │ B │ A │ B │ 
├───╫───┼───┼───┼───┤ 
│ 1 ║ A │ A │ │ │ 
├───╫───┼───┼───┼───┤ 
│ 2 ║ A │ B │ A │ B │ 
├───╫───┼───┼───┼───┤ 
│ 3 ║ │ │ │ │ 
└───╨───┴───┴───┴───┘ 

After最後四行:

┌───╥───┬───┬───┬───┐ 
│ ║ 0 │ 1 │ 2 │ 3 │ 
╞═══╬═══╪═══╪═══╪═══╡ 
│ 0 ║ A │ B │ B │ B │ 
├───╫───┼───┼───┼───┤ 
│ 1 ║ A │ A │ B │ B │ 
├───╫───┼───┼───┼───┤ 
│ 2 ║ A │ B │ A │ B │ 
├───╫───┼───┼───┼───┤ 
│ 3 ║ │ │ │ │ 
└───╨───┴───┴───┴───┘

對於X = 0,Y = 1,前四行:

┌───╥───┬───┬───┬───┐ 
│ ║ 0 │ 1 │ 2 │ 3 │ 
╞═══╬═══╪═══╪═══╪═══╡ 
│ 0 ║ A │ B │ B │ B │ 
├───╫───┼───┼───┼───┤ 
│ 1 ║ C │ A │ C │ B │ 
├───╫───┼───┼───┼───┤ 
│ 2 ║ A │ B │ A │ B │ 
├───╫───┼───┼───┼───┤ 
│ 3 ║ C │ │ C │ │ 
└───╨───┴───┴───┴───┘

最後四行:

┌───╥───┬───┬───┬───┐ 
│ ║ 0 │ 1 │ 2 │ 3 │ 
╞═══╬═══╪═══╪═══╪═══╡ 
│ 0 ║ A │ B │ B │ B │ 
├───╫───┼───┼───┼───┤ 
│ 1 ║ C │ A │ C │ B │ 
├───╫───┼───┼───┼───┤ 
│ 2 ║ C │ C │ A │ B │ 
├───╫───┼───┼───┼───┤ 
│ 3 ║ C │ C │ C │ │ 
└───╨───┴───┴───┴───┘

對於X = 1,Y = 1,前四行:

┌───╥───┬───┬───┬───┐ 
│ ║ 0 │ 1 │ 2 │ 3 │ 
╞═══╬═══╪═══╪═══╪═══╡ 
│ 0 ║ A │ B │ B │ B │ 
├───╫───┼───┼───┼───┤ 
│ 1 ║ C │ D │ C │ D │ 
├───╫───┼───┼───┼───┤ 
│ 2 ║ C │ C │ A │ B │ 
├───╫───┼───┼───┼───┤ 
│ 3 ║ C │ D │ C │ D │ 
└───╨───┴───┴───┴───┘

並與最後四行:

┌───╥───┬───┬───┬───┐ 
│ ║ 0 │ 1 │ 2 │ 3 │ 
╞═══╬═══╪═══╪═══╪═══╡ 
│ 0 ║ A │ B │ B │ B │ 
├───╫───┼───┼───┼───┤ 
│ 1 ║ C │ D │ C │ D │ 
├───╫───┼───┼───┼───┤ 
│ 2 ║ C │ C │ D │ D │ 
├───╫───┼───┼───┼───┤ 
│ 3 ║ C │ D │ D │ D │ 
└───╨───┴───┴───┴───┘

這是沒有結果的,你預期,這從一個事實,即在每次迭代中,你回去覆蓋四個像素莖。其中一些像素屬於您的雙重圖像。

+0

我喜歡那個文字藝術桌! =) – Mints97

+0

我也是。 ;)但它並不真正解釋事情。但是你的回答在確定確切機制方面很有幫助。順便說一句,是否注意到第一行的右半部分不是A B而是B B?我沒有注意到我的測試圖像,直到我在這裏看到它。 –

+1

是的,@WolframSchmied - 底部是'CD'而不是'CC'。注意到你的形象呢? – RealSkeptic

0

會發生什麼情況是,小的圖像寫從頂部和從中間同時開始行線。大圖像也從頂部開始,但「移動」的速度要快兩倍。因此,上半部分的小「慢」圖像覆蓋了較早寫入的快速大像素,而在下半部分,已寫入的「小」像素被快速前沿覆蓋。

我已經上傳了一個顯示該過程的animation on YouTube

(無論菲爾的和RealSkeptic的答案是在尋找解釋的幫助。我選擇了菲爾的答案,因爲他的回答很接近解釋究竟happend。)