程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了在Google App Engine中存储旋转/翻转的图像大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决在Google App ENGIne中存储旋转/翻转的图像?

开发过程中遇到在Google App ENGIne中存储旋转/翻转的图像的问题如何解决?下面主要结合日常开发的经验,给出你关于在Google App ENGIne中存储旋转/翻转的图像的解决方法建议,希望对你解决在Google App ENGIne中存储旋转/翻转的图像有所启发或帮助;

要覆盖原始映像,您只需要指定相同的Cloud Storage文件名。

我们了解您已通过BlobStore API通过App ENGIne将图像上传到Cloud Storage。要获取原始图像的实际文件名,必须 添加以下代码

  Map<String,List<BlobInfo>> uploadInfos = getfileInfos(httpServletrequest);
  String theGCSfilename = uploadInfos.get("yourfilename").getGsObjectname();

请注意,如果您不想覆盖原始文件,但想向客户提供服务网址,则可以:

  • 像这样使用Imageservice:

    Imagesservice imagesservice = ImagesserviceFactory.getimagesservice();
    

    String url = imagesservice.getservingUrl(servingUrlOptions.builder.withGoogleStoragefilename(java));

  • 创建一个GCSservingServlet将使用该Blobstoreservice.serve()方法为Blobstore或Cloud Storage中的文件提供服务的自定义用户。在这种情况下,您必须自己检查权限。请注意,您可以创建一个BlobKeyGCSfilename使用BlobStoreservice.createGSBlobKey()

  • 使用Cloud Storage服务网址:

    • 私人:http : //commondatastorage.googleapis.com/bucket/filename
    • 公开:http : //storage.googleapis.com//bucket/filename

解决方法

我正在尝试旋转/翻转已经位于Google Cloud Storage内部的图像。

这是Blobkey:

BlobKey blobKey = new BlobKey(upload.getBlobKey());

然后,我检索图像并应用图像变换:

Imagesservice imagesservice = ImagesserviceFactory.getImagesservice();
Image image = ImagesserviceFactory.makeImageFromBlob(blobKey);
Transform transform = ImagesserviceFactory.makeRotate(90);
Image newImage = imagesservice.applyTransform(transform,imagE);

我可以使用以下方式在字节数组中获取RAW图像数据:

newImage.getImageData()

直接使用GCS,我可以将其写入云存储服务:

GcsFilename filename = new GcsFilename("bucket-name",upload.getFilename());
GcsOutputChAnnel outputChAnnel = GcsserviceFactory.createGcsservice().createOrreplace(filename,GcsFiLeoptions.getDefaulTinstance());
outputChAnnel.write(ByteBuffer.wrap(newImage.getImageData()));
outputChAnnel.close();

在本地,我可以看到旋转的图像位于appENGIne生成的文件夹中,如何获取新的服务url或objectName应该是什么以覆盖原始图像?objectName是否与上传时的原始文件名相同,是Blobkey,&Hellip;?

更新:

上传时,我将存储GcsFilename

Blobstoreservice blobstoreservice = BlobstoreserviceFactory.getBlobstoreservice();
Map<String,List<FileInfo>> finfos = blobstoreservice.getFileInfos(req);
String gcsFilename = finfos.get("uploadKey").get(0).getGsObjectName();
upload.setGcsFilename(gcsFileName);
upload.persist();

GcsFilename看起来像这样(本地):

然后在我的rotate方法中,执行以下操作:

GcsFilename filename = new GcsFilename( "bucket-name",upload.getGcsFilename());
GcsOutputChAnnel outputChAnnel = GcsserviceFactory.createGcsservice().createOrreplace(filename,GcsFiLeoptions.getDefaulTinstance());
outputChAnnel.write(ByteBuffer.wrap(newImage.getImageData()));
outputChAnnel.close();

Blobstoreservice bs = BlobstoreserviceFactory.getBlobstoreservice();
BlobKey bk = bs.createGsBlobKey(filename.getObjectName());

当我使用bk.getKeyString()打印新的blobKey时,我得到了一个巨大的blobkey:

当我尝试:

imagesservice.getservingUrl(servingUrlOptions.builder.withBlobKey(bk);

我现在得到一个 INVALID_BLOB_KEY:无法读取blob。

与:

imagesservice.getservingUrl(servingUrlOptions.builder.withGoogleStorageFilename(filename.getObjectName()));

INVALID_BLOB_KEY:无法读取Blob。

更新-实时测试:

我已经进行了一些实时登录,以查看是否可以查明哪里出了问题

当我打印出GcsFilename时,这就是我得到的:

GcsFilename filename = new GcsFilename("bucket-name",upload.getGcsFilename());
System.out.println("filename.getObjectName(): " + filename.getObjectName());
System.out.println("filename.getBucketName(): " + filename.getBucketName());

2014-03-08 09:31:35.076 [s~_____/live-1-0-2.374269833496060124].<stdout>: filename.getObjectName(): /gs/bucket-name/L2FwcGhvc3RpbmdfcHJvZC9ibG9icy9BRW5CMlI 
2014-03-08 09:31:35.076 [s~_____/live-1-0-2.374269833496060124].<stdout>: filename.getBucketName(): bucket-name

然后生成新的blobkey:

Blobstoreservice bs = BlobstoreserviceFactory.getBlobstoreservice();
BlobKey bk = bs.createGsBlobKey(filename.getObjectName());

System.out.println("GSBlobKey: " + bk.getKeyString());

2014-03-08 09:31:37.993 [s~_____/live-1-0-2.374269833496060124].<stdout>: GSBlobKey: AMIfv94Tj3xO9hPWwMm314Id0obQs1gVWOHYVuGaaAjjMbieBUD6x0nNGbqiY8o5Jk9iLga4pPe9-8L1

然后使用3种不同的方法来获取新的投放网址:

String newImageUrl1 = imagesservice.getservingUrl(servingUrlOptions.builder.withGoogleStorageFilename(filename.getObjectName())); 
System.out.println("newImageUrl1: " + newImageUrl1);

String newImageUrl2 = imagesservice.getservingUrl(servingUrlOptions.builder.withBlobKey(bk));
System.out.println("newImageUrl2: " + newImageUrl2);

String newImageUrl3 = imagesservice.getservingUrl(bk);
System.out.println("newImageUrl3: " + newImageUrl3);


2014-03-08 09:31:38.116 [s~_____/live-1-0-2.374269833496060124].<stdout>: newImageUrl1: http://lh3.ggpht.com/My7zTT79xOltI3cMzHidx7-Us91Qlp13jdv-vJceQ_OpX3FONSr9YzI2...
2014-03-08 09:31:38.152 [s~_____/live-1-0-2.374269833496060124].<stdout>: newImageUrl2: http://lh3.ggpht.com/My7zTT79xOltI3cMzHidx7-Us91Qlp13jdv-vJceQ_OpX3FONSr9YzI2... 
2014-03-08 09:31:38.218 [s~_____/live-1-0-2.374269833496060124].<stdout>: newImageUrl3: http://lh3.ggpht.com/My7zTT79xOltI3cMzHidx7-Us91Qlp13jdv-vJceQ_OpX3FONSr9YzI2...

当我访问这些URL时,我得到的只是原始图像。

当我在Cloud Storage Dashboard中查看时,原始图像位于:Home / bucket-name /

但是,旋转后的图像位于:主页/存储桶名称// gs /存储桶名称/

因此,它没有覆盖原件的原因。我猜我正在创建的文件名不正确,或者我正在创建的GcsOutputChAnnel正在更改路径?我也很好奇为什么我要获取原始图像的URL而不是新图像的URL?

如果我分割了原始的GcsFilename只使用了最后一部分,那么我会得到一个错误:

GcsFilename filename = new GcsFilename("bucket-name",upload.getGcsFilename().split("/")[3]);

Google存储空间文件名必须以/ gs /作为前缀

有任何想法吗?

使用以下命令检索blobKey:

BlobKey blobKey = blobstoreservice.createGsBlobKey("/gs/" + filename.getBucketName() + "/" + filename.getObjectName());

&Hellip;即使filename.getObjectName()在对象名前面已经包含“ / gs / bucket-name
/”。当将其打印为标准输出时,您的filename应该包含两次/ gs / bucket-name /,很奇怪,但是可以使用。

使用该blobKey创建正确的服务网址

大佬总结

以上是大佬教程为你收集整理的在Google App Engine中存储旋转/翻转的图像全部内容,希望文章能够帮你解决在Google App Engine中存储旋转/翻转的图像所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。