2016-12-04 119 views
0

我正在爲我的uni製作項目,並且我遇到了一件事情 - 一切都很好,但是有比較兩個像素顏色的bug。 我必須計算一些圖的面積,並且我必須使用MonteCarlo方法。 (生成隨機點,統計圖分出來,calculete圖形區域) 有些點計很好,有的不要,我不知道什麼是錯,我試着去解決幾個小時......比較兩個像素(它們的顏色)

import java.awt.*; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import java.util.ArrayList; 
import java.util.Random; 
import javax.imageio.ImageIO; 
import javax.swing.*; 

public class Runner extends JApplet{ 

private BufferedImage img; 
public ArrayList<Point> w; 
public ArrayList<Point> poza; 
public BufferedImage output; 

public void init(){ 

    try{ 
     img = ImageIO.read(new File("figura.gif")); 
    } catch (IOException e){ 
     e.getStackTrace(); 
     System.err.println("Nie ma obrazkaXD"); 
    } 

} 

public void paint(Graphics g){ 
    w = new ArrayList<Point>(); 
    poza = new ArrayList<>(); 
    super.paint(g); 
    Random random = new Random(); 
    int wys = img.getHeight(); 
    int szer = img.getWidth(); 
    g.drawImage(img, 0, 0, wys, szer, null); 
    for (int i = 0; i < 1000; i++) { 
     int x = random.nextInt(wys); 
     int y = random.nextInt(szer); 
     Point p = new Point(x,y); 
     g.setColor(Color.GREEN); 
     g.drawOval(y, x, 1, 1); 
     Color c = new Color(img.getRGB(y, x));; 
      if(c.equals(Color.BLACK)){ 
       w.add(p); 
       g.setColor(Color.RED); 
       g.drawOval(y, x, 1, 1); 
      }else{ 
       poza.add(p); 
      } 
    } 

float a = w.size(); 
float b = poza.size()+w.size(); 
float poleProstokata = wys*szer; 
float pole = a/b*poleProstokata; 
} 

回答

0

我建議你切換y和Y座標,因爲在Oracle文檔中描述:

https://docs.oracle.com/javase/7/docs/api/java/awt/image/BufferedImage.html#getRGB(int,%20int)

方法的getRGB取X第一和Y第二,所以你必須使用

Color c = new Color(img.getRGB(x, y)); 

代替

Color c = new Color(img.getRGB(y, x));; 

,爲什麼不使用一個int?我的意思是,你總是將返回的int從getRGB轉換爲顏色並進行比較。但是爲什麼不從Color Black創建一個int並將其與getRGB(x,y)返回的int進行比較?

繼承人是我的建議:

int black=Color.BLACK.getRGB(); 

你的paint方法

的開始,在循環:

int c=img.getRGB(y, x); 

並加以比較:

if (black==c) { 
    //Do your stuff... 
}