2012-02-05 2 views
1

저는 프로젝트에서 작업 중이며 Java에 새로운 것이 아닙니다. 특정 색상 (예 : 시안)에 대해 픽셀 단위로 이미지를 스캔하고 해당 픽셀 색상의 좌표를 인쇄하려고합니다. 코드가 실행되고 출력 파일을 만들지 만 아무 것도 쓰지 않습니다. 오류를 찾으려면 누군가 도와주세요. 또한 동일한 코드를 사용하는 동안 java에서 .tiff 파일을 읽는 방법을 알고 싶습니다.자바에서 특정 픽셀 색상의 이미지를 스캔합니다.

자바 코드 :

import java.awt.Color; 
import java.awt.image.BufferedImage; 
import java.io.BufferedWriter; 
import java.io.File; 
import java.io.FileWriter; 
import java.io.IOException; 
import javax.imageio.ImageIO; 

public class GetPixelColor { 

    //int y, x, tofind, col; 
    /** 
    * @param args the command line arguments 
    * @throws IOException 
    */ 
    public static void main(String args[]) throws IOException { 
     try { 
      //read image file 
      File file1 = new File("E:\\birds.jpg"); 
      BufferedImage image1 = ImageIO.read(file1); 

      //write file 
      FileWriter fstream = new FileWriter("E:\\pixellog1.txt"); 
      BufferedWriter out = new BufferedWriter(fstream); 

      //color object 
      //Color cyan = new Color(0, 255, 255); 

      //find cyan pixels 
      for (int y = 0; y < image1.getHeight(); y++) { 
       for (int x = 0; x < image1.getWidth(); x++) { 

        int c = image1.getRGB(x,y); 
        Color color = new Color(c); 

        //int red = (c & 0x0000FFFF) >> 16; 
        //int green = (c & 0x0000FFFF) >> 8; 
        //int blue = c & 0x0000FFFF; 

        //if (cyan.equals(image1.getRGB(x, y)){ 

        if (color.getRed() < 30 && color.getGreen() > 255 && color.getBlue() > 255) { 
         out.write("CyanPixel found at=" + x + "," + y); 
         out.newLine(); 

        } 
       } 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
+0

이미지에 청록색 픽셀이 있습니까? 그런데 첫 번째 픽셀을 찾은 후에 파일을 닫을 경우 루핑을 중단해야합니다. 두 번째 픽셀을 발견하면 쓰기를 시도 할 때'out '이 이미 닫혀 있기 때문에 IOException이 발생합니다. –

+0

['Zoom'] (http://stackoverflow.com/a/3742841/230513)을 사용할 수 있습니다.)를 사용하여 데스크탑의 모든 픽셀의 RGB 구성 요소를 볼 수 있습니다. – trashgod

+0

당신은 _cyan_와 같은 색을 찾고 _cyan_ –

답변

3

문제가 birds.jpg 화상은 화소를 포함하지 않는 것이 아마도 정확히 R = 0, G = 255, B = 255 (즉 시안). 그림판에서 이미지를 열고 청록색 픽셀을 그릴지라도 JPEG는 손실이 많은 형식이기 때문에 저장할 때 색상이 약간 변경 될 수 있습니다.

이 당신의 if 문을 교체하여 시안에 가까운 픽셀에 대한 테스트를 시도 할 수 :

Color c = new Color(image1.getRGB()); 
if (c.getRed() < 30 && c.getGreen() > 225 && c.getBlue() > 225) { 
+0

을 찾지 않아도됩니다. 색이 0-255이므로이 값이 255보다 큰 것은 아닙니다. 시안 색 범위를 알려주시겠습니까 .. 어디서 시작됩니까 255 .. ??? –

+0

내 대답은 225보다> 225가 아닙니다. 나는 30을 공차 (255-30 = 225)로 선택했으나 포용력은 당신에게 달렸습니다! 녹청의 공식 범위는 없습니다. –

1

내가 또 다른 문제는 당신의 if 문에 생각합니다. 이미지가 255보다 큰 것을 찾고 있습니다. 그러나 java에서는 255가 빨간색, 파란색 또는 녹색으로 가질 수있는 최대 값입니다. 정확히 255자를 찾고 있다면 color.getBlue() > 255 에서 color.getRed() == 255 으로 변경하십시오. 도움이 되었으면합니다.

관련 문제