如何使用Google App Engine Blobstore压缩图像

我们有一个应用程序服务于blobstore的一系列图像。 这里有一个例子:

http://lh4.ggpht.com/f76xUkRZLRkb_Qz5uu82TX3LoBRh4eYb9hxYwMRMLCk5ghO_OL0DW2v4rRnkewUyDWfBuBttgbUvuJJXwtFQosEB=s0

这是一个巨大的png,因此下载量为536K。

如果我们将其调整为400,它仍然很大(263k):

http://lh4.ggpht.com/f76xUkRZLRkb_Qz5uu82TX3LoBRh4eYb9hxYwMRMLCk5ghO_OL0DW2v4rRnkewUyDWfBuBttgbUvuJJXwtFQosEB=s400

我们如何以某种更好的压缩方式请求或存储图片? 我们的应用程序有一个移动客户端,等待273K使它变得非常慢。

有Images API 。 压缩和调整图像大小:

// get image from blobstore ImagesService imagesService = ImagesServiceFactory.getImagesService(); Image oldImage = ImagesServiceFactory.makeImageFromBlob(blobKey); // compress & resize it OutputSettings settings = new OutputSettings(ImagesService.OutputEncoding.JPEG); settings.setQuality(90); Transform transform = ImagesServiceFactory.makeResize(newWidth, newHeight) Image newImage = imagesService.applyTransform(transform, oldImage, settings); byte[] blobData = newImage.getImageData(); //save data to blobstore FileService fileService = FileServiceFactory.getFileService(); AppEngineFile file = fileService.createNewBlobFile("image/jpeg", someFilename); FileWriteChannel writeChannel = fileService.openWriteChannel(file, true); writeChannel.write(ByteBuffer.wrap(blobData)); writeChannel.closeFinally(); // get the blobKey to newly written data BlobKey blobKey = fileService.getBlobKey(file); 

您可以启用Pagespeed服务来动态重新压缩图像。

您可以使用PIL从前端实例动态地提供重新压缩的图像。

您可以将图像的不同版本(具有不同压缩比)上载到blobstore或云存储,并选择要显示客户端的版本(使用CSS或客户端逻辑)。