2017-03-06 14 views
0

OpenIMAJ 라이브러리를 사용하고 있습니다. "JPEG"및 "PNG"파일에서는 잘 작동하지만 tiff 파일에서는 오류가 발생합니다. 여기OpenIMAJ 라이브러리에서 tiff 파일을 읽을 수 없습니까?

import org.openimaj.image.ImageUtilities; 
import org.openimaj.image.MBFImage; 

.... 

File file = new File("/home/mosab/Desktop/input/tif.tif"); 
MBFImage input = ImageUtilities.readMBF(file); 

그리고 오류입니다 :

Exception in thread "main" java.io.IOException: org.apache.sanselan.ImageReadException: Tiff: unknown compression: 7 
    at org.openimaj.image.ExtendedImageIO.read(ExtendedImageIO.java:189) 
    at org.openimaj.image.ExtendedImageIO.read(ExtendedImageIO.java:126) 
    at org.openimaj.image.ImageUtilities.readMBF(ImageUtilities.java:355) 
    at org.mosab.TestOpenIMAJ.TestKmeans.main(TestKmeans.java:49) 
Caused by: org.apache.sanselan.ImageReadException: Tiff: unknown compression: 7 
    at org.apache.sanselan.formats.tiff.datareaders.DataReader.decompress(DataReader.java:135) 
    at org.apache.sanselan.formats.tiff.datareaders.DataReaderStrips.readImageData(DataReaderStrips.java:96) 
    at org.apache.sanselan.formats.tiff.TiffImageParser.getBufferedImage(TiffImageParser.java:505) 
    at org.apache.sanselan.formats.tiff.TiffDirectory.getTiffImage(TiffDirectory.java:163) 
    at org.apache.sanselan.formats.tiff.TiffImageParser.getBufferedImage(TiffImageParser.java:441) 
    at org.apache.sanselan.Sanselan.getBufferedImage(Sanselan.java:1264) 
    at org.apache.sanselan.Sanselan.getBufferedImage(Sanselan.java:1163) 
    at org.apache.sanselan.Sanselan.getBufferedImage(Sanselan.java:1136) 
    at org.openimaj.image.ExtendedImageIO.read(ExtendedImageIO.java:187) 
    ... 3 more 

이 TIFF 파일 (특히 GeoTiff)는 내가 사용하고 다음은 코드입니다

"https://drive.google.com/file/d/0ByKaCojxzNa9MWxPTUJjZURHR1E/view?usp=sharing"

OpenIMAJ 라이브러리가 tiff 형식/GeoTiff를 지원하지 않는다는 의미입니까?

나는 OpenIMAJ가 tiff를 지원하지 않기 때문에 "TwelveMonkeys"라이브러리에서 해당 파일을 읽으려고했다. "TwelveMonkeys"라이브러리는 별도로/단독으로 파일을 읽을 수 있습니다. 따라서 OpenIMAJ와 함께 작동하는 TwelveMonkeys 라이브러리를 가져 와서 TIFF 파일을 지원하고 TIFF 파일을 처리했지만 그 파일은 작동하지 않았습니다 ("TwelveMonkeys"는 별도의 프로젝트에서이 파일을 읽을 수 있었지만). 내가 그 주위에 26메가바이트 때문에 무언가가 파일의 크기에 관련이있을 수있는 오류 메시지를 추적하고 내가 오류가 방법에서 유래 것으로 나타났습니다 때

Exception in thread "main" java.io.IOException: Resetting to invalid mark 
at java.io.BufferedInputStream.reset(BufferedInputStream.java:448) 
at org.openimaj.image.ExtendedImageIO.read(ExtendedImageIO.java:185) 
at org.openimaj.image.ExtendedImageIO.read(ExtendedImageIO.java:126) 
at org.openimaj.image.ImageUtilities.readMBF(ImageUtilities.java:355) 
at org.mosab.TestOpenIMAJ.TestKmeans.main(TestKmeans.java:49) 

나중에 "읽기":이 예외를 가지고 최대 크기를 사용한다고 생각되는 "org.openimaj.image.ExtendedImageIO"클래스의 클래스 10mb :

public static BufferedImage read(InputStream input) throws IOException { 
    if (input == null) { 
     throw new IllegalArgumentException("input == null!"); 
    } 

    final NonClosableInputStream buffer = new NonClosableInputStream(input); 
    buffer.mark(10 * 1024 * 1024); // 10mb I think here is the problem 

    BufferedImage bi; 
    try { 
     bi = readInternal(buffer); 
    } catch (final Exception ex) { 
     bi = null; 
    } 

    if (bi == null) { 
     buffer.reset(); 
     try { 
      bi = Sanselan.getBufferedImage(buffer); 
     } catch (final Throwable e) { 
      throw new IOException(e); 
     } 
    } 

    return bi; 
} 

OpenIMAJ에서이 문제를 해결하고 tiff 파일을 읽을 수있는 방법은 무엇입니까? (추가 기능을 적용하려면 OpenIMAJ에서 클러스터링/분할과 같은 기능을 제공합니다)?

+0

TIFF 파일의 이미지 데이터를 압축 할 수 있습니다. TIFF 형식은 다른 압축 방법을 지원합니다. 분명히 (오류 메시지에 따라) 사용하려는 라이브러리는 읽고 자하는 TIFF 파일에 사용 된 특정 압축 방법을 지원하지 않습니다. – Jesper

+1

@Jesper 답장을 보내 주셔서 감사합니다.하지만 "TwelveMonkeys"라이브러리는 모든 TIFF 파일을 읽을 수 있으며 OpenIMAJ을 기반으로하는 "TwelveMonkeys"라이브러리를 내 프로젝트에 가져 왔을 때 (이제는 추가 코딩을 가져 오지 않음), 이제 Tiff 파일을 읽을 수 있습니다. 그것들에 OpenIMAJ 기능을 적용하십시오; 하지만 그 파일 때문에 OpenIMAJ이 허용하는 것보다 더 큰 이유는 그것을 처리 할 수없는 이유이기 때문입니다. OpenIMAJ 팀은 제한 즉, 10MB의 버퍼 크기를 제거해야한다고 생각합니다. –

+0

TIFF 압축 7은 [("새 스타일") JPEG] (http://www.awaresystems.be/imaging/tiff/tifftags/compression.html)입니다. TwelveMonkeys ImageIO가이를 읽을 수 있으며 JAI ImageIO도 생각합니다. – haraldK

답변

0

TIFF는 라이브러리에서 항상 지원되는 것은 아니지만 많은 사용자 지정 확장이 있으므로 끔찍한 형식입니다. OpenIMAJ는 모든 종류의 서로 다른 이미지를 읽으려면 여러 라이브러리를 사용하여 이러한 문제를 해결하려고 시도하지만이 경우 실패합니다. 당신이 알았 듯이, 문제를 일으키는 10MB의 버퍼 한계가 있습니다 - 100MB로 증가 시키면 링크 된 이미지를로드 할 수 있습니다. 이 문제를 해결하기 위해 코드를 업데이트 할 것입니다 (제한 사항이므로 기본 버퍼가 훨씬 작아서 문제가 발생하지 않아야합니다). 로

빠른 해결 방법 새로운 스냅 샷이 배포 될 때까지, 당신은 당신이와 연결하여 이미지를로드 할 수

MBFImage img = ImageUtilities. 
    createMBFImage(Sanselan.getBufferedImage(new File("tif.tif")), false); 

Sanselan이 될 것 같지 않는 별도의 문제로이 나타납니다 알 수없는 이미지 압축을 참조하는 스택 추적에 기초하여 모든 이미지를로드 할 수 있습니다. GitHub 버그 보고서 (https://github.com/openimaj/openimaj/issues/119)에서 이러한 이미지에 대한 링크를 제공 할 수 있다면 그러한 이미지에 대해 TwelveMonkeys를 사용하는 폴백을 코딩 할 수도 있고 더 새로운 버전의 Sanselan이 해당 문제를 수정하는지 확인할 수 있습니다. 다시, 그 동안 코드의 이미지에 TwelveMonkeys를 직접 사용할 수 있으며 위와 같이 ImageUtilities을 사용하여 MBFImage으로 변환 할 수 있습니다.

+0

"ImageUtilities.createMBFImage"라는 임시 해결책이 효과가 있습니다. –