2011-11-30 3 views
1

URL에서 이미지를 가져 와서 해당 문자열을 App Engine 내에서 Image으로 변환하려고하면 위와 같은 메시지에 오류가 발생합니다.PIL ValueError : 이미지 데이터가 충분하지 않습니까?

from google.appengine.api import urlfetch 

def fetch_img(url): 
    try: 
    result = urlfetch.fetch(url=url) 
    if result.status_code == 200: 
     return result.content 
    except Exception, e: 
    logging.error(e) 

url = "http://maps.googleapis.com/maps/api/staticmap?center=Narita+International+Airport,Narita,Chiba+Prefecture,+Japan&zoom=18&size=512x512&maptype=roadmap&markers=color:blue|label:S|40.702147,-74.015794&markers=color:green|label:G|40.711614,-74.&markers=color:red|color:red|label:C|40.718217,-73.998284&sensor=false" 

img = fetch_img(url) 
# As the URL above tells, its size is 512x512 
img = Image.fromstring('RGBA', (512, 512), img) 

PIL에 따르면, 크기 옵션은 픽셀의 튜플 것으로 생각된다. 내가 지정한이. 아무도 내 오해를 지적 할 수 있을까?

+0

질문을, 오히려 우리를 위해 오류를 의역보다는, 전체 스택 트레이스를 기입하십시오. –

답변

3

이미지에 의해 반환 된 데이터는 따라서 당신은 단지 데이터가 파일에 있음을 저장하고있을 것 중 하나 대신에, 원시 데이터로로드 할 필요가 없습니다, 이미지 자체가 아니라 RAW RGB 데이터입니다 유효한 이미지를 사용하거나 PIL을 사용하여 엽니 다. (일반 파이썬 설치에 사람이 xample을 실행할 수 있도록 I AppEngine에 API를 사용하지 않는 코드를 변환 한)

from urllib2 import urlopen 
import Image 
import sys 
import StringIO 

url = "http://maps.googleapis.com/maps/api/staticmap?center=Narita+International+Airport,Narita,Chiba+Prefecture,+Japan&zoom=18&size=512x512&maptype=roadmap&markers=color:blue|label:S|40.702147,-74.015794&markers=color:green|label:G|40.711614,-74.&markers=color:red|color:red|label:C|40.718217,-73.998284&sensor=false" 
result = urlopen(url=url) 
if result.getcode() != 200: 
    print "errrrrr" 
    sys.exit(1) 

imgdata = result.read() 
# As the URL above tells, its size is 512x512 
img = Image.open(StringIO.StringIO(imgdata)) 
print img.size 

출력 : PIL은 앱 엔진에서 지원되지 않습니다

(512, 512) 
2

fromstring은 원본 이미지 데이터를로드하는 데 사용됩니다. 문자열 img에있는 것은 PNG 형식으로 인코딩 된 이미지입니다. 당신이하고 싶은 것은 StringIO 객체를 만들고 그것으로부터 PIL을 읽는 것입니다. 이처럼 :

>>> from StringIO import StringIO 
>>> im = Image.open(StringIO(img)) 
>>> im 
<PngImagePlugin.PngImageFile image mode=P size=512x512 at 0xC585A8> 
0

참고. 이것은 단지 images API의 스텁으로 dev에 사용되었습니다.

당신은 같은 것을 할 수 있습니다

from google.appengine.api import urlfetch 
from google.appengine.api import images 

class MainHandler(webapp.RequestHandler): 
    def get(self): 
    url = "http://maps.googleapis.com/maps/api/staticmap?center=Narita+International+Airport,Narita,Chiba+Prefecture,+Japan&zoom=18&size=512x512&maptype=roadmap&markers=color:blue|label:S|40.702147,-74.015794&markers=color:green|label:G|40.711614,-74.&markers=color:red|color:red|label:C|40.718217,-73.998284&sensor=false" 
    img = images.Image(urlfetch.fetch(url).content) 
+3

Python 2.7 런타임은 PIL을 지원합니다. – geoffspear

관련 문제