2012-12-19 2 views
7

이미지를 저장하지 않고 pyBarcode의 출력을 PIL 이미지 파일로 변환하려고합니다.pyBarcode 출력을 PIL 이미지 파일로 변환

>>> import barcode 
>>> from barcode.writer import ImageWriter 
>>> ean = barcode.get_barcode('ean', '123456789102', writer=ImageWriter()) 
>>> filename = ean.save('ean13') 
>>> filename 
u'ean13.png' 

은 위에서 볼 수 있듯이, 내가 출력이 PIL 이미지로 처리 할 원하기 때문에 이미지가 실제로 내 파일 시스템에 저장하지 않으려는 : 첫째, pyBarcode은 같은 이미지 파일을 생성 .

i = StringIO() 
ean = barcode.get_barcode('ean', '123456789102', writer=ImageWriter()) 
ean.write(i) 

지금 내가있는 StringIO 파일 객체를 가지고 있고 그것을 "읽기"및 PIL 이미지 파일로 변환 PIL 원하는 : 그래서 일부 수정했다. Image.new 또는 Image.frombuffer을 사용하고 싶었지만이 두 가지 기능 모두 내가 크기를 입력해야했습니다 ... 바코드 StringIO 데이터에서 크기를 결정할 수 없습니까? Image.open은 해당 설명서에서 다음과 같이 설명합니다.

문자열 (파일 이름) 또는 파일 개체를 사용할 수 있습니다. 후자의 경우 파일 객체는 read, seek 및 tell 메서드를 구현하고 바이너리 모드로 열어야합니다.

StringIO 인스턴스도 파일 객체가 아닌가요? 이진 파일로 어떻게 열 수 있습니까?

Image.open(i, 'rb') 
>>> Image.open(i, 'rb')                           
Traceback (most recent call last):                        
    File "<stdin>", line 1, in <module>                     
    File "/home/mark/.virtualenvs/barcode/local/lib/python2.7/site-packages/PIL/Image.py", line 1947, in open                              
    raise ValueError("bad mode")                     
ValueError: bad mode 

나는 누군가의지도가 필요하다는 대답에 꽤 가깝다. 미리 감사드립니다.

+1

당신이'Image.open'은 (내 말은, 단지 기본 모드로 엽니 다)에서 두 번째 매개 변수를 생략하려고 있나요? –

+1

'.seek (0)'은'StringIO'?의 처음으로 되돌아 갔습니까? 그런 다음 PauloScardine이 제안했듯이 두 번째 매개 변수는 생략하십시오. 'io.BytesIO'도 사용하려고 할 것입니다. –

+0

고마워요! seek (0)과 두 번째 매개 변수를 생략하면 트릭을 만들었습니다! – Mark

답변

7

StringIO 개체 파일 개체입니다. 당신이 cStringIO module합니다 (StringIO 모듈의 C-최적화 된 버전)을 사용하는 경우

그러나, 당신은 빈 StringIO 인스턴스를 ceate하면, 그것은 단지 쓰기에 최적화되어 있습니다 않으며, 당신은 입력에서로 사용할 수 없습니다 파일, 그 반대의 경우도 마찬가지입니다. 간단하게이 경우 다시 초기화 :

파이썬 버전합니다 ( StringIO 모듈)에 대한
i = StringIO(i.getvalue()) # create a cStringIO.StringO instance for a cStringIO.StringI instance. 

, 단순히 다시 시작 추구 :

i.seek(0) 

을 당신은 이에 대한 파일 모드를 지정할 필요가 없습니다 Image.open() 전화; i하지 않는 한 어떤 경우에 문자열이 무시됩니다된다

img = Image.open(i) 
+0

정말 고마워요! i.seek (0)이 트릭을했습니다. StringIO (i.getvalue()) – Mark

+0

@Mark :'from cStringIO import StringIO'에서 StringIO ('somevalue')'가 출력 (읽기 전용) 객체를 다시 생성한다는 의미는 이해하지 못한다. 'StringIO()'는 입력 객체를 생성합니다 (쓰기 전용). 따라서 쓰기에서 읽기로 전환하려면 후자로부터 첫 번째 유형을 만들어야합니다. –

+0

아 !! 알 겠어. 당신이 인수를 제공한다면, 출력은 읽기 전용이 될 것입니다. 인수를 생략한다면 출력은 쓰기 전용이됩니다. 너가 말하는게 이거니? – Mark