我找到了关于如何在数据存储中存储png的example:
img = images.Image(img_data)
# Basically, we just want to make sure it's a PNG
# since we don't have a good way to determine image type
# through the API, but the API throws an exception
# if you don't do any transforms, so go ahead and use im_feeling_lucky.
img.im_feeling_lucky()
png_data = img.execute_transforms(images.PNG)
img.resize(60, 100)
thumbnail_data = img.execute_transforms(images.PNG)
Picture(data=png_data,
thumbnail_data=thumbnail_data).put()
这段代码对我来说很混乱,但它适用于png。但是,我应该怎么做才能存储所有最常见的格式(jpg,gif,tiff等)?
答案 0 :(得分:7)
您可以在模型中使用db.BlobProperty()
存储任何文件类型的二进制数据。
如果您使用Image
API来操作图片数据,则只能输入.jpg
,.png
,.gif
,.bmp
,{ {1}}和.tiff
类型,并输出到.ico
或.jpg
。
要简单地将图像存储在数据存储中,请在模型中使用.png
,并将其存储为图片的二进制数据。这是数据存储在您链接到的示例代码中的方式(参见Line 85)。
因为类型db.BlobProperty()
类型本身不是图片,但可以存储任何二进制数据,所以需要一些规则;没有简单的方法来以编程方式强制执行仅限图片的约束。幸运的是,这意味着您可以存储任何类型的数据,包括db.BlobProperty
,.jpg
,.gif
等文件以及.tiff
格式,如例子。
您可能希望像示例中那样为模型创建一个新类,并存储文件所需的某些元数据(“名称”,“文件类型”等),以及图像的二进制数据。您可以在链接到的示例中的Line 65处查看此示例。
要将图像存储在.png
中,您需要使用BlobProperty
来保存数据;这与任何类型相同。请参阅您链接到的示例代码中Line 215开头的代码。
如果您必须操纵图像,则可以使用Images API包。从Overview of the Images API我们可以看到以下内容:
该服务接受JPEG,PNG,GIF(包括动画GIF),BMP,TIFF和ICO格式的图像数据。
它可以返回JPEG和PNG格式的变换图像。如果输入格式和输出格式不同,服务会在执行转换之前将输入数据转换为输出格式。
因此,即使您可以在技术上将任何类型存储在数据存储区中,但如果您使用此API来处理图像,则有效的输入和输出类型将受到限制。
答案 1 :(得分:3)
class Profile(db.Model):
avatar=db.BlobProperty()
if(self.request.get):
image = self.request.get('MyFile')
if image:
mime=self.request.POST['MyFile'].type
mime=mime.split('/')
icon_image = db.Blob(images.resize(image,460,460))
prof.avatar = db.Blob(icon_image)
if mime[1]== 'jpeg' or 'jpg' or 'gif' or 'png':
prof.put()
class disp_image(webapp.RequestHandler):
def get(self):
if profile.avatar is not None:
image = view_profile.avatar
self.response.headers['Content-Type'] = "image/png"
return self.response.out.write(image)
<img id="crop" src='/module/disp_image' alt="profile image" >