2012-03-19 3 views
2

이 코드는 "imgs"라는 디렉토리의 이미지 크기를 조정하려고 시도합니다. 불행히도 listFiles (..) 루프의 주석을 제거 할 때 어떤 이유 때문에 ImageIO.read(sourceImageFile)은 null을 반환합니다. 루프 (res("imgs/foto_3.jpg")) 외부에서 똑같은 파일을 바로 처리 할 수 ​​있습니다. 그래서 분명히,이 루프는 파일이 읽히지 못하게합니다. 솔루션? 디렉토리의 이미지 크기를 조정하는 방법은 무엇입니까?

enter image description here

import java.awt.image.*; 
import java.io.*; 
import javax.imageio.*; 
import static org.imgscalr.Scalr.*; 

public class App { 

    public static void main(String[] args) throws IOException { 
//  for (File sourceImageFile : new File("imgs").listFiles()) { 
//   res("imgs/"+sourceImageFile.getName()); 
//  } 
     res("imgs/foto_3.jpg"); 

    } 

    public static void res(String arg) throws IOException { 

     File sourceImageFile = new File(arg); 
     BufferedImage img = ImageIO.read(sourceImageFile); 

     BufferedImage thumbnail = resize(img, 500); 

     thumbnail.createGraphics().drawImage(thumbnail, 0, 0, null); 
     ImageIO.write(thumbnail, "jpg", new File("resized/" + sourceImageFile.getName())); 
    } 
} 

download the Maven project 수있는 문제를 재현합니다.

답변

-1

내가 변경 한 고해상도 방법 :

public static void res(File arg) throws IOException { 
     if (arg.contains(".DS_Store")) { 
      return; 
     } 

맥 문제 (제안 된 또는 비 이미지 파일을 필터링합니다)!

2

res을 문자열이 아닌 File 개체를 허용하도록 변경할 수 있습니까? 일부 추적 문을 추가하거나 정확히 res에 전달되는 것을 찾기 위해 디버거를 사용하려고 원래의 질문으로

for (File sourceImageFile : new File("imgs").listFiles()) { 
    res(sourceImageFile); 
} 

: 그럼 당신은 훨씬 좋네요 다음을 작성할 수 있습니다.

2

좋아요, 알아 냈습니다. 이제는 효과가 있습니다. 사용자 (또는 여기에 붙여 넣은 다운로드 가능한 프로젝트를 만든 사람)는 Mac OS를 사용하며 .ds_Store 파일을 자동으로 만듭니다. res 메서드에 전달하려고하면 이미지가 아닌 파일을 처리하는 방법을 알지 못하고 null로 작동합니다.

public static void main(String[] args) throws IOException { 
     for (File sourceImageFile : new File("imgs").listFiles()) { 
      if (sourceImageFile.getName().endsWith(".jpg")) 
       res(sourceImageFile.getAbsolutePath()); 
     } 
    } 

수정 된 void 기본 방법입니다. 그것은 작동합니다. u는 잘못된 파일을 더 깊이 필터링하기 위해 if 문을 구체화 할 수 있습니다. 또한 res 메서드에 주어진 인수를 변경했습니다. getAbsoulutePath가 이름과 경로를 반환하기 때문에 지금은 더 좋아 보인다. 작동 원리를 알려주십시오

+0

시도했습니다. 문제가 없습니다 – simpatico

+0

편집하고 코드에 크기 조정 방법을 추가 할 수 있습니까? 실험 해보고 싶습니다 –

+0

프로젝트 코드를 다운로드하여 직접 볼 수 있도록 링크를 추가했습니다. – simpatico

0

ImageIO.read(..)이 null을 반환하는 특정 sourceImageFile을 출력하기 위해 디버깅하는 분명한 방법이 있습니다. 나는 listFiles가 당신에게 이미지 디렉토리에있는 모든 파일과 디렉토리의리스트를 줄 것이기 때문에 그것을 의심한다. listFiles javadoc. listFiles가 올바른 형식의 파일과 추가로 파일 만 반환하도록하는 FileFilter를 사용하면이를 방지 할 수 있습니다.

전용 파일을 반환하는 파일 필터의 예는 다음과 같습니다

import java.io.FileFilter 
class RegularFilesOnlyFileFilter implements FileFilter { 
    public boolean accept(File pathName) { 
     return pathName.isFile(); 
    } 
} 

이 필터를 사용하는 방법은 이것이다 - new File("imgs").listFiles(new RegularFilesOnlyFilesFilter())

+0

디렉토리 문제가 없습니다 .. 추가 스크린 샷 – simpatico

2

나는 확실하지 않다 이유와 혼란을 반복 할 파일 목록 썸네일 세대,하지만 당신은 내게 개인적으로 당신이 imgscalr을 사용하고 디렉토리를 일괄 처리하는 올바른 코드는 어떻게 생겼는지 궁금해했다. 그래서 나는이 예제 코드를 작성했다.

-

코드는 아래의 모든 디렉토리를 처리합니다 (디렉토리 중 하나를 변경 주시기 일관성을 유지하는 데 사용됩니다 resized를) 및 다른 디렉토리에 쓰는 (imgs은 예제 코드와 일치 유지하기 위해 하드 코딩입니다)

import static org.imgscalr.Scalr.*; 

import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 

import javax.imageio.ImageIO; 

public class ScaleDirExample { 
    public static void main(String[] args) throws IOException { 
     File[] images = new File("imgs").listFiles(); 

     for (File f : images) { 
      System.out.println("Processing: " + f.getName() + "..."); 

      if (f.isDirectory()) { 
       System.out.println("\tSkipping, file is a directory..."); 
       continue; 
      } else 
       process(f); 
     } 
    } 

    private static void process(File file) throws IOException { 
     // Load image. 
     BufferedImage image = ImageIO.read(file); 

     // Resize image. 
     image = resize(image, 500); 

     // Save the resized image as the thumbnail. 
     saveThumbnail(file, image); 
    } 

    private static void saveThumbnail(File originalFile, BufferedImage thumbnail) 
      throws IOException { 
     String filename = originalFile.getName(); 

     // Determine file extension. 
     String fileExt = filename.substring(filename.lastIndexOf('.') + 1); 

     // Save the thumbnail to the resized dir. 
     ImageIO.write(thumbnail, fileExt, new File("resized/" + filename)); 
    } 
} 

resize(image, 500)에 대한 호출은 Scalr.resize methods과 일치하도록 수정 될 수있다 - 당신이 원하는 경우에 당신이 필터를 통과하거나 품질을 향상시킬 수 있습니다.하는 데 도움이

Processing: flower-dog-gimp.jpg... 
Processing: flower-dog.jpg... 
Processing: logoOXdaComida.png... 
Processing: mr-t-thumbnail.jpg... 
Processing: mr-t.jpg... 
Processing: problem-trans-peter-griffin.png... 

희망 :처럼 내 테스트 설정에서

예 출력이 보인다!

+0

Riyad. 귀하의 코드는 동일한 루프를 사용합니다. 그것은 당신을 위해 작동, 그것은 나를 위해 작동하지 않습니다! 내 대답을 보라. – simpatico

+0

@simpatico 내 코드를 복사하여 새 클래스에 복사하여 붙여 넣으면 프로젝트에서 제대로 실행됩니까? 그렇지 않다면, 처리중인 디렉토리에 대해 고유 한 것이 있습니까? 예를 들어, 존재하지 않는, 읽기/쓰기 권한 문제 또는 네트워크 마운트? –

관련 문제