2011-04-19 3 views
0

안녕하세요, 저는 Java 문제가 있습니다. 내 고위 연구 수업의 경우, 끝내기는했지만 제작 한 이미지의 일부 데이터 만 분석하면됩니다. 숙제로 표시하고 싶지는 않습니다. 왜냐하면 그것이 과제물의 일부가 아니기 때문입니다 ... 결과를 수집하기 위해 스스로 생각한 것입니다. 두 이미지를 픽셀 단위로 비교하는 프로그램을 작성했습니다. 이 작업은 두 개의 디렉토리에있는 모든 .bmp 파일에 대해 수행됩니다. 이제, 내 프로그램은 파일 이름을 문자열 배열로 읽어 들이고 모든 파일 이름의 값을 검사 했으므로 처음에는 디렉토리와 파일 이름에 잘 액세스하고 있습니다. 내가 디렉토리를 변경할 때Javax ImageIO IIOException이 분명히 이유가 없음

public static void main(String[]args) throws IOException 
{ 
    File actualDir = new File("C:\\Users\\Rowe\\Desktop\\testExpect"); 
    String actualFiles[] = actualDir.list(); 
    File expectedDir = new File("C:\\Users\\Rowe\\Desktop\\testExpect2"); 
    String expectedFiles[] = expectedDir.list(); 
    int[][] stats = new int[actualFiles.length][6];        // Holds all info 
      //Columns, Rows, Total, redMatches, shouldaBeenRed, badRed 
    for(int i = 0; i < actualFiles.length; i++) 
    { 
     BufferedImage actualImage = null; 
     System.out.println(actualFiles[i]); //THIS PRINTS PROPERLY 
     System.out.println(System.getProperty("user.dir")); //FOR TESTING 
     actualImage = ImageIO.read(new File("C:\\Users\\Rowe\\Desktop\\testExpect\\"+actualFiles[i])); //ERROR HERE 

     BufferedImage expectedImage = null; 
     expectedImage = ImageIO.read(new File("C:\\Users\\Rowe\\Desktop\\testExpect2\\"+expectedFiles[i])); //THIS IMAGE WORKS 

...rest of code

같은 것으로, 이제 프로그램을 실행하고, 예상대로 (모든 픽셀이 100 % 모두로 감지, 그래서 나는 알고 여기에 문제가있는 코드는 프로그램은 내가 원하는 것을 수행한다). 여기에 오류가있다 : 나는 아무 소용 다른 디렉토리를 시도했습니다

Exception in thread "main" javax.imageio.IIOException: Can't read input file! at javax.imageio.ImageIO.read(Unknown Source) at PixelCompare.main(PixelCompare.java:22)

. 그것은. bmp 파일에 관한 것이 될 수 있습니까? 한 세트의 BMP가 잘 읽히고 다른 세트가 작동하지 않게하려면? 다른 프로그램에서 필요한 모든 파일을 열 수 있으므로 손상되지 않습니다. 모든 속성이 동일하게 나타납니다. 하나의 디렉토리는 Gimp (수작업으로 읽음)에서 수작업으로 만들어졌고 다른 디렉토리는 Java 기반 프로그램에서 생성되었습니다. 이러한 것들은 김프, 페인트, 포토샵 등에서 읽을 수 있지만 내 코드에서는 읽을 수 없습니다.

도움을 주시면 감사하겠습니다.

편집 : 되돌아온 코드를 사용하는 것을 잊어 버렸습니다 ... 나는 그 다음에 나쁜 버전을 게시했습니다. 다른 기능 코드 인 원래 문제를 보여주기 위해 개정되었습니다. 문제를 더 자세히 설명하려면 : testFile []의 파일 목록에 대해 testExpect2 폴더를 찾기 위해 두 디렉토리를 모두 변경하면 성공적으로 실행됩니다. 또한 System.out.println(actualFiles[i]은 오류가 발생하기 전에 올바른 파일 이름을 인쇄하므로 올바른 파일이 String 배열로 읽혀지고 있음을 알 수 있습니다.

+1

혼란 스럽네요. 나는 그 코드가 디렉토리 이름과 파일 이름 사이에 백 슬래시를 넣지 않는 것 같기 때문에 코드가 작동한다고 생각하지 않습니다. –

+0

다른주의 사항 :'expectedFiles [i]'를 두 번 사용하고'actualFiles [i]'를 디버그 출력에만 사용하고 있습니다. 이것은 비린내가된다. – Mat

+0

expectFiles []에 상대 경로가 포함되어 있습니까? – andijcr

답변

3
new File("C:\\Users\\Rowe\\workspace\\Senior Research\\testExpect"+expectedFiles[i]) 

디렉토리를 C:\\yourDir으로 줄이십시오.

C:\\yourDir\\expectedFiles1.bmp 

당신은 경로 분리를 잊었 : 코드는 원하지 무엇을

C:\\yourDirexpectedFiles1.bmp 

처럼 항복 경로 될 것입니다.

File에 두 파일의 constructor 사용하는 것이 훨씬 낫다 : 도움이

File actualImageFile = new File(actualDir, expectedFiles[i]); 
actualImage = ImageIO.read(actualImageFile); 

희망!

+0

그건 그냥 나쁜 부분이고 내 부분에 붙여 넣기 만 했어. actualFiles 문자열 배열에 모든 파일이 올바르게 나열되어 있더라도 actualFiles의 첫 번째 BMP 파일에 액세스하려고 시도 할 때까지 모든 내용이 올바르게 액세스됩니다. – rownage

+0

ImageIO를 호출하기 전에 어설 션을 넣을 수 있습니까? like ... assert actualImageFile.isFile() && actualImageFile.canRead(); ' – sjr

+0

sjr, 나는 assert 문이 내 코드 작업을 다르게하기 위해 어떤 일을했는지 ​​모르겠다. 안전한 이미지 재생을 위해 두 번째 ImageIO 호출에 대해 동일한 작업을 수행해야합니까? – rownage

1

문제가있는 라인에서 expectedFiles[i] 대신 actualFiles[i]이 발생하지 않아야합니까?

+0

그래 ... 내 말에 복사하고 붙여 넣기를 잘못했다. 문제는 여전히 나타납니다. 의견을 참조하십시오. 머리를 주셔서 감사합니다! – rownage

+1

@koage : 그럼 sjr의 대답을 시도하십시오. – ZeissS

관련 문제