문제

꽤 큰 이미지 (jpegs)로 읽은 응용 프로그램이지만 작은 이미지로 만 작업하면 다음과 같이 서브 샘플링해야합니다.

ImageReadParam param = reader.getDefaultReadParam();
param.setSourceSubsampling(4, 4, 0, 0);
img = reader.read(0);

그러나 JPEG 리더의 버그로 인해 다른 방법으로 돌아온 메타 데이터를 처리하지 않으면 JAI를 사용하여 이미지를 읽은 다음 크기를 조정하고 있습니다 (코드는 일부 반사를 사용하지 않아도됩니다. 배포 환경에는 JAI가 없어도이 점을 더 잘 설계 할 수 있지만 그것이 그 방법입니다).

try {
Class<?> c = ImageUtil.class.getClassLoader().loadClass("javax.media.jai.JAI");

if (c != null) { 
    URL url = new URL("file://" + file.getAbsolutePath());
    Method m = c.getMethod("create", String.class, Object.class);
    Object pi = m.invoke(null, "url", url);
    img = (BufferedImage) pi.getClass().getMethod("getAsBufferedImage").invoke(pi);
}
} catch (Throwable tt) {
// ...
}

그러나 일부 이미지 중 일부는 실제로 크게 큽니다. 다시 메모리 예외를 벗어납니다.

도움이 되었습니까?

해결책

BufferedImage로 변환을 시도 할 때 메모리 외 예외가 발생한다고 가정합니다.

이 경우 Jai의 Create Method에 의해 반환 된 Renderedop을 고수하는 것을 고려하고 대신 매개 변수 블록과 추가 Jai를 사용하여 스케일링 된 이미지를 생성합니까?

ParameterBlock paramBlock = new ParameterBlock();
paramBlock.addSource(((RenderedOp) pi).createInstance()); // Updated this
paramBlock.add(0.5f); // x Scale (Change these two Scale values!)
paramBlock.add(0.5f); // y Scale
paramBlock.add(0.0f); // x Translate
paramBlock.add(0.0f); // y Translate
paramBlock.add(new InterpolationBilinear()); // I think this Interpolation should work...)
RenderedOp resized = JAI.create("scale", paramBlock, null);

위의 코드는 표준으로 완전히 테스트되지 않았지만 두려워하지만 시작해야합니다!

해당 크기의 렌더링을 얻으면 필요한 경우 버퍼링 이민으로 안전하게 변환 할 수 있어야합니다.

다른 팁

RenderedOp rop = JAI.create("fileload", file.getAbsolutePath());

ParameterBlock pb = new ParameterBlock();
pb.addSource(rop);
pb.add(0.5f);
pb.add(0.5f);
rop = JAI.create("scale", pb);

// For better looking results, but slower:
// rop = JAI.create("SubsampleAverage", pb);

BufferedImage bufImg = rop.getAsBufferedImage();   
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top