将jpg,gif,png等存储为gae-datastore

Vla*_*hev 2 python google-app-engine file-upload image

我找到了一个关于如何在数据存储区中存储png 的示例:

  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()
Run Code Online (Sandbox Code Playgroud)

这段代码对我来说很混乱,但它适用于png.但是,我应该怎么做才能存储所有最常见的格式(jpg,gif,tiff等)?

Ezr*_*zra 7

快速回答

您可以db.BlobProperty()在模型中使用任何文件类型的二进制数据.

如果您使用的ImageAPI来处理图像数据,你只限于输入 .jpg,.png,.gif,.bmp,.tiff,和.ico类型,并输出到任何.jpg.png.


存储图像

要将图像简单地存储在数据存储中,请db.BlobProperty()在模型中使用,并将其存储为图片的二进制数据.这是数据存储在您链接的示例代码中的方式(参见第85行).

因为类型db.BlobProperty类型本身不是图片,但可以存储任何二进制数据,所以需要一些规则; 没有简单的方法来以编程方式强制执行仅限图片的约束.幸运的是,这意味着你可以存储你想要的任何类型的数据,其中包括.jpg,.gif,.tiff等除了文件.png格式,如示例.

您可能希望,如示例中所示,为模型创建新类,并存储文件所需的某些元数据("名称","文件类型"等),以及图像的二进制数据.您可以在链接到的示例中的第65行看到此示例.

要将图像存储在中BlobProperty,您需要使用它db.put()来保存数据; 这与任何类型相同.请参阅您链接到的示例代码中从第215行开始的代码.


操纵图像

如果必须操作图像,则可以使用Images API包.从Images API概述我们可以看到以下内容:

该服务接受JPEG,PNG,GIF(包括动画GIF),BMP,TIFF和ICO格式的图像数据.

它可以返回JPEG和PNG格式的变换图像.如果输入格式和输出格式不同,则服务会在执行转换之前将输入数据转换为输出格式.

因此,即使您可以在技术上将任何类型存储在数据存储区中,但如果您使用此API来操作图像,则有效的输入和输出类型将受到限制.