2015-01-07 5 views
1

나는과 같이 PIL에서 이미지를 연 :PIL.Image에서 이진 이미지 데이터를 가져 옵니까?

from PIL import Image 

i = Image.open("image.jpg") 

내가이 파일의 원시 내용에 액세스해야합니다. open(...).read()처럼 전체 사진 데이터를 가져올 수 있습니까?

+0

,이를 떠납니다 미래의 독자들에게 명확히하기 위해 코멘트 : 당신은 실제로 "원시 픽셀 데이터"가 아닌 "원시 픽셀 데이터"를 원했습니다. – jsbueno

+0

오, 정말요? 그럼 난 당신의 대답을 받아 들일거야, 난 원래의 원시 파일 싶어요. –

답변

2

PIL은 파일 열기가 필요한 경우에만 읽을 수있는 지연 열기 메커니즘을 사용합니다. 이렇게하면 파일 참조가 내부 (개인) 특성으로 유지됩니다.

이 속성에 액세스 할 수있는 경우에도 확실히 PIL API의 일부로 공개되지 않으며 확실히 이러한 방식으로 사용되지 않습니다.

일단 데이터가 읽혀지면 파일 내용이 디코딩되어 픽셀 값 -(일반적으로 이미지 처리시 원하는 것임)로 메모리에 보관됩니다. 라이브러리는 의미가 없으므로 압축되지 않은 파일 데이터를 메모리의 데이터 구조에 보관하지 않습니다. 만약 원시 파일 내용 개미 경우

하면 아마 몇몇 다른 모듈로 화상을 처리하거나, 저장하거나, 실제의 영상 콘텐츠에 얽매 있는 형태로 데이터 반복된다 - 수없는 경우 일반 "열린"파일을 다시 열면됩니까?

+0

정답. 생성시'Image' 객체를 생성하는데 사용 된 원본 파일을 가리키는'Image.fp' 속성이 있습니다. 속성은'Image' 객체가 전체 내용을 읽지 않는 한 파일을 가리 킵니다. 바로 그 순간에'Image.fp'는'None'을 가리키고 원본 파일에 대한 더 이상의 참조는 유지되지 않습니다. –

3

이미지의 실제 바이트를 가져 오려면 i.tobytes()을 사용하십시오. 이것은 Pillow으로, 원래 PIL 모듈에 있는지는 확실하지 않지만 문서에서 확인해야합니다.

+0

여전히 원본 파일의 바이트는 제공하지 않고 메모리의 원시 (압축되지 않은) 이미지 바이트 만 제공합니다. 작은 이미지가 있는지 쉽게 확인할 수 있습니다. f.seek (0);' 'img = PIL.Image.open (f) .tobytes();' 'f.seek (0);' 'img == f.read'f = open ('pic.jpg');(); ' 은'거짓 '으로 평가됩니다. –

9

당신은 python Image PIL to binary Hex

IMG 개체를 다시 저장해야이 답변을 볼 수 있습니다; 다른 BytesIO 객체에 쓰기 :

output = io.BytesIO() 
img.save(output, format='JPEG') 

다음() 메소드 .getvalue에 기록 된 데이터를 얻을 :

는 ".tobytes"질문을 받아 이후
hex_data = output.getvalue() 
+0

Microsoft Cognition API를 사용 중이며 이진 이미지 데이터가 필요합니다. 처음에는 일반 열기 기능을 사용하여 데이터를 보내려고했지만 base64로 인코딩/디코딩을 시도했지만 작동하지 않았습니다. 그래도 작동 했으므로 나중에 누구나 사용한다면이 양식으로 데이터를 가져 오십시오. –

관련 문제