2013-02-19 2 views
2

나는 무손실로 제출 된 이미지가 필요한 응용 프로그램을 작성 중입니다. 현재 PIL로 이미지를 열고 "형식"속성이 무손실 형식인지 확인하고 있습니다. 예를 들어 제출 된 jpeg에 무손실 변형이 적용된 경우에는 수동으로 형식 목록을 유지해야합니다.파이썬에서 이미지 형식이 무손실인지 확인하고 싶습니까?

import PIL 
import PIL.Image 


def validate_image(path): 
    img = PIL.Image.open(path) 
    if not img.format.lower() in ['bmp', 'gif', 'png', ...]: 
     raise Exception("File %s has invalid image format %s" % (path, img.format)) 

이미지 파일은 무손실이 있는지 확인하는 더 좋은 방법이 있나요?

+0

PIL을 사용해야합니까? 예를 들어, PythonMagick을 사용하면'CompressionType' 속성을 확인할 수 있습니다. 그리고 이것은 훨씬 쉬운 테스트입니다. 손실이있는 유일한 원시 압축 유형은'JPEGCompression'입니다 (손실 JPEG 및 TIFF 파일에서 사용됨). non-native 압축의 경우'UndefinedCompression'을 얻지 만, 항상 손실이라는 것을 가정 할 수 있습니다. – abarnert

+0

무손실 JPEG는 여전히 "jpeg"이고 손실이 있거나 손실이없는 TIFF는 모두 "tiff"이므로 코드가 작동하지 않습니다. 하지만 한 걸음 물러서 ... 응용 프로그램에서 제출 된 이미지를 어떻게 처리합니까? 무손실 JPEG를 처리합니까? 그 문제는 PIL (또는 ImageMagick 등)이 처리하지 않는 모든 유형을 처리합니까, 아니면 PIL (등)이 수행하는 모든 유형을 처리하지 못합니까? 그렇다면 "무손실"을 검사하는 것만으로는 충분하지 않기 때문입니다. – abarnert

+0

다른 말로하면 : 앱에 무손실 이미지가 필요한 이유는 무엇입니까? 손실 된 이미지가 주어지면 예외 (또는 C 또는 Java 또는 그와 동등한 것)가 발생하면 괜찮습니다. 프론트 엔드에 같은 코드 (또는 동일한 C 라이브러리의 래퍼)를 넣으면 실패하고, 실패하면 앱이이를 처리 할 수 ​​없다는 것을 알 수있을 것입니다. 답이 무엇이든간에 솔루션은 아마도 무손실 여부를 확인하는 것보다 문제와 더 밀접한 관련이 있습니다. – abarnert

답변

3

나는 이제 물건을 이해한다고 생각한다. 당신은 PIL을 통해 이미지를 열고 싶다. 사람의 시각적 처리에 중요하지 않은 정보가 알고리즘에 중요하기 때문에 데이터를 잃어버린 모든 것을 필요로하는 과학적 처리를하고 있기 때문에 손실이 많은 이미지를 거부하려고합니다.

PIL에는 압축 유형을 구분할 수있는 최상위 수준의 인터페이스가 없습니다. 이미지 디코더 내부에 도달 할 수 있으며 "원시"디코더를 사용하는 모든 것이 무손실이라고 가정합니다.하지만 그렇게하고 싶어도 너무 제한적이어서 GIF, LZW 압축 TIFF 등은 배제됩니다. JPEG, JPEG 압축 TIFF 등이 포함됩니다.

실제 문제는 메시징 및 문서 관리 사용자의 기대치입니다. 손실이 심한 이미지를 확인하는 것은 사실 단순한 휴리스틱 (heuristic)이며보다 분명한 실수를 파악하고 사용자에게 요구 사항을 상기시키는 방법입니다. 그래서, 당신은 완벽한 것을 필요로하지 않지만, 꽤 좋은 것을 가지고 있으면 어쨌든 도움이 될 수 있습니다.

  1. 인코딩 정보를 유지하고 최고 수준으로 그것을 전달하는 PIL의 디코더 소스를 해킹 :

    그래서, 단지 몇 가지 옵션, 그들 중 누구도 아주 좋은있다. 이것은 명백하게, 30 가지의 다른 수입업자들에게, C와 파이썬을 포함하는 중요한 작업을 수행 할 것이고, (천천히) 진화하는 코드베이스에 대해 유지해야하는 패치가 될 것입니다. 물론 업스트림을 제출하여 PIL의 향후 버전으로 만들 수 있기를 바랍니다.

  2. 런타임시 정보를 얻기 위해 디코더 자체를 파헤십시오. 네가 실제로 찾을 수있는 준 표준적인 것은 원시 디코더 또는 비트 디코더를 사용하는지 여부이다. 비트 디코더는 유용하지 않다. (많은 무손실 포맷은 비트 디코더를 필요로 할 것이다.) 그래서 결국 30 개 모두를 읽게 될 것이다. 수입업자들로부터 정보를 추출하기 위해 12 개 정도의 코드를 작성해야합니다.

  3. PIL과 함께 (또는 대신) 다른 라이브러리를 사용하십시오. 예를 들어, ImageMagick은 확실히 이 아니지만 PIL보다 훨씬 쉽지만 이미지 파일이 사용하는 압축 유형을 알려주는 API를 가지고 있습니다. 기본적으로 UndefinedCompression 또는 JPEGCompression 인 경우 손실이 발생합니다. 다른 것은 손실이 없습니다. 두 가지 이미지 라이브러리를 설치해야하는 것 외에 큰 단점은 PIL은 열 수 있지만 IM은 할 수없고 PIL과 IM이 다르게 처리하는 다중 이미지 파일 등이 있다는 것입니다.

  4. 이미 수행중인 작업을 수행하십시오. 30 명의 수입업자를 통해 낭독되고 무손실 목록을 작성하십시오. 때로는 무손실 인 JPEG 및 TIFF와 같은 경우를 처리하기 위해 평평하지 않은 코드는 작성하지 말고 "이 파일은 손실 일 수 있습니다. 가져 오시겠습니까?"라는 경고가 표시됩니다. " (또는 대안으로, "나는 내가하고있는 일을 알고있다."모든 손실 형식을 재정의 한 다음 JPEG 및 TIFF 손실을 고려하십시오.)

많은 사용 사례에 대해 # 4로가는 것이 매우주의 할 만하지만 실제로는 상당히 합리적으로 보입니다. 코드가 손상되거나 보안상의 이유로 또는 그런 이유로 손실이 심한 이미지를 차단하려고하지 않습니다. 사람들은 JPEG을 제출하면 쓸모없는 정보를 얻는 데 많은 시간을 낭비 할 것이라고 사람들에게 경고하려고하는 것입니다.

+0

이러한 모든 옵션은 잘못되었습니다. 죄송합니다./이러한 검사는 아무 것도 보장하지 않습니다. 저쪽에있는 png 이미지를 보시겠습니까? 어쩌면 이전에는 jpeg 였고 그 전에는 특정 센서의 일부 원시 데이터 였을 것입니다. 따라서 그것을 바탕으로 입력을 구별하는 것은 의미가 없습니다. 유일하게 합당한 접근법은 다음과 같은 (조정 된) 선을 어딘가에 추가하는 것입니다. "친애하는 사용자, 수신 된 모든 입력은 추가 처리 전에 X 형식으로 변환됩니다." – mmgp

+0

@ mmgp : 그렇기 때문에 나는 프로그래밍보다는 메시징과 문서화의 문제가 더 심각하다고 대답했다. 어쩌면 나는 그 말을 해답을 재구성해야 할 것입니다. – abarnert