2012-05-22 4 views
3

png 파일을 읽고 쓸 때 문제가 발생했습니다. ImageIO로 바이트 배열을 읽은 다음 ImageIO를 사용하여이 바이트 배열을 다시 작성합니다. 그러나 파일 크기가 크게 증가합니다. 어떻게 될 수 있습니까?Java에서 PNG 읽기 및 쓰기로 파일 크기가 증가합니다.

public BufferedImage toBufferedImage(InputStream inputstream) { 
    try { 
     return ImageIO.read(inputstream); 
    } catch (Exception e) { 
     throw new IllegalStateException("Can't convert to buffered image", e); 
    } 
} 

public byte[] toByteArray(BufferedImage bufferedImage, String filetype) { 
    ByteArrayOutputStream output = new ByteArrayOutputStream(); 
    try { 
     ImageIO.write(bufferedImage, filetype, output); 
     return output.toByteArray(); 
    } catch (Exception e) { 
     throw new IllegalStateException(e); 
    } 
} 

을 따르 자바로 작성하고 네이티브 코드를 필요로하지 않는 압축 PNG 파일을 지원하는 모든 라이브러리가?

+0

을 또는 헤더에 여분의 데이터를 추가하는 것. 이것이 맞는지 확인하는 좋은 방법은 Beyond Compare와 같은 파일에서 두 파일을 열고 모든 차이가 시작 부분 (헤더 위치)에 있는지 확인하는 것입니다. 그렇지 않다면 차이점이 어디에나있을 수 있습니다. 따라서 파일 전체에 빈 데이터를 추가하는 것이 좋습니다. 그것이 파일을 다시 인코딩했기 때문에 그것이 의심 스럽지만 가능성이있을 수 있습니다. –

+0

필자는 압축에 대해 매우 영리하지 못하다. 아마도 형식을 압축 할 수있는 더 나은 출력 스트림 또는 기록기 구현이 있을까요? 패키지의 javadoc은이 기능과의 인터페이스를 암시합니다. – IanGilham

답변

1

documentation은 입력 파일을 디코딩 말한다, 그래서는 PNG로 메모리에 저장되지 않는 것 :

그 현재 중으로부터 자동적으로 선택된 ImageReader를 사용해, 지정된 File를 복호화 한 결과적으로 BufferedImage를 돌려줍니다 등기. File는 ImageInputStream에 랩되고 있습니다. 등록 된 ImageReader가 결과 스트림을 읽을 수 있다고 주장하지 않는 경우, null이 리턴됩니다.

다시 쓸 때 PNG 파일을 다시 인코딩해야하며 Java의 PNG 인코딩은 원본 파일을 만든 것과 같은 효율성이없는 것처럼 보입니다.

+0

우리는 마침내 pngj (http://code.google.com/p/pngj/)를 사용하여 우리가 필요로하는 것을 잘 처리하는 것으로 보입니다. – bertolami

5

이것은 압축 알고리즘이 Java와 원본 PNG를 만든 모든 경우에서 다르기 때문일 가능성이 큽니다.

1

JDK와 함께 제공된 PNG 작성기는 압축을 지원하지 않습니다. 당신은 신속하게 이것을 확인할 수 있습니다

w = ImageIO.getImageWritersByFormatName("png").next(); 
p = w.getDefaultWriteParam(); 
print("Can compress? "+p.canWriteCompressed()); 
// Can compress? false 

그것은 ImageIO에서-EXT 또는 재이 - ImageIO에서 압축 지원하는 PNG 작가 포함하는 것이 가능하다 : 그것은 쓰기에 어떤 종류의 추가 헤더를 추가 궁금 http://java.net/projects/imageio/

관련 문제