2010-06-11 4 views
3

매우 큰 해상도의 이미지 ( )를 생성해야하지만 이미지는 비교적 드문 드문하지만 이미지의 일부 영역 만 그릴 필요가 있습니다. 로 예를 들어자바에서 BufferedImage를 작성하십시오.

코드 다음

/* this take 5GB memory */ 

    final BufferedImage img = new BufferedImage(36000, 36000, BufferedImage.TYPE_INT_ARGB); 

/* draw something */ 

    Graphics g = img.getGraphics(); 
    g.drawImage(....); 

/* output as PNG */ 

    final File out = new File("out.png"); 
    ImageIO.write(img, "png", out); 

내가 만든 말의 PNG 이미지 만 약 200 ~ 3백메가바이트입니다.

질문은 처음에는 5GB BufferedImage를 만드는 것을 피할 수 있습니까? 큰 치수의 이미지가 필요하지만 매우 희소 한 색상 정보가 필요합니다.

BufferedImage 용 스트림이있어 메모리가 많이 필요하지 않습니까?

+0

PNG는 DEFLATE 알고리즘을 사용하여 마지막 단계로 압축되므로 'BufferedImage'보다 상당히 작습니다. – Powerlord

답변

1

더 작은 BufferedImages로 구성된 지연 초기화 된지도 또는 이와 유사한 구조를 사용하지 않는 이유가 있습니까?

편집 : 꽤 전문화 된 데이터 구조입니다. 이미지 전체를 드로잉 (Drawing)하고 싶다면 합리적인 방식으로 이미지를 타일링하고 각각에 상응하는 AffineTransform을 적용하십시오. 그럼 당신은 그냥 컬렉션을 반복하고 각 하나를 그릴 수 있습니다 또는 그것을 바로 나중에 빈 경우 플라이급 그것을 null. 나는 Java 내에서 PNG로 그들을 모두 결합하는 비 고통스러운 방법을 모른다.

0

이 예제에서는 TYPE_INT_ARGB를 픽셀 당 4 바이트의 이미지 유형으로 사용합니다. 이미지의 색상 수가 제한되어 있으면 픽셀 당 바이트 수가 적은 다른 이미지 유형을 사용할 수 있습니다.

이렇게하면 픽셀 당 바이트 수를 줄일 수 있지만 최상의 경우는 1GB 당 1GB이지만 여전히 1GB 이상을 사용합니다.

그렇지 않으면 렌더링을 여러 이미지로 분할하여 개별적으로 병합 할 수 있습니다.

관련 문제