PIL ValueError: недостаточно данных изображения? - PullRequest
2 голосов
/ 30 ноября 2011

Я получаю сообщение об ошибке с указанным выше сообщением, когда я пытался извлечь изображение из URL и преобразовать строку в ответ в Image в App Engine. PIL , опция размера должна быть кортежем пикселей.Это я уточнил.Кто-нибудь может указать на мое недоразумение?

Ответы [ 3 ]

4 голосов
/ 30 ноября 2011

Данные, возвращаемые изображением, являются самим изображением, а не данными RAW RGB, поэтому вам не нужно загружать его как необработанные данные, вместо этого либо просто сохраните эти данные в файл, и это будет действительное изображение, либо используйте PIL откройте его например (Я преобразовал ваш код, чтобы он не использовал appengine api, чтобы любой желающий с обычной установкой Python мог запустить xample)

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.012318&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

выход:

(512, 512)
2 голосов
/ 30 ноября 2011

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 голосов
/ 30 ноября 2011

Обратите внимание, что PIL не поддерживается в App Engine. Он используется только в dev как заглушка для API изображений .

Вы можете сделать что-то вроде этого:

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.012318&markers=color:red|color:red|label:C|40.718217,-73.998284&sensor=false"
    img = images.Image(urlfetch.fetch(url).content)
...