目前,我的小组正在运行一个流星应用程序,其中包含成千上万全尺寸很大的图像。我们应该早就这样做了,但是我们需要一种优化它们以帮助加载时间的方法。我正在寻找一种解决方案,当用户从我们的应用程序上载图像时(例如:全尺寸,中型,缩略图),并且能够自动旋转并允许用户旋转,因此能够以多种尺寸保存图像。我们使用Amazon S3托管所有图像。我们还需要一种从服务器端将所有现有图像转换为这些尺寸格式的方法。
我尝试过一段时间实施某项操作,但未成功。我在服务器上设置了imagemagick,但由于将图像临时保存在服务器内存中以进行处理而无法在生产环境中使用它,但是由于内存量有限而导致崩溃。我对这种事情几乎没有经验。
我的第二个想法是使用HTML画布来调整图像的大小。我认为这对新上传的图片有效。但是我仍在寻找一种处理现有图像的方法。
我考虑过:
如果有人可以给我一些建议,那么我可以助您一臂之力!
我看到两种完全不同的预算有两种方式:
除非您只有1-2 GB,否则我不建议您这样做(https://transloadit.com/demos/file-importing/resize-all-images-in-an-s3-bucket/)
将您的S3链接到Cloudinary服务,然后使用Cloudinary进行转换(您不喜欢它($$)拥有的图像数量)。
希望在AWS中,您可以使用Cloudfront服务您的资产。无论采用哪种转换技术,您都将主要做两件事:
代替Lambda Edge,您可以使用Node设置EC2计算机,并运行一个功能以遍历所有S3资产并进行转换。
无论如何,我觉得您想要做的就是所有AWS,而与您的Meteor无关。还有一件事要做:在上传图片之前先对其进行优化。如果您将React与Meteor一起使用,我可以为您提供必要的组件,否则,我可以为您提供这些组件,然后编写Blaze视图层或您可以使用的其他任何东西。
如果您有兴趣使用这种方法,我可以在基于ImageMagic的生产中使用Lambda转换功能。我还计划“升级”此功能以使用Sharp(如示例中所示),但是暂时它在生产中表现出色,将在我有空的时候切换。检查此示例:
Download the image from S3, transform, and upload to a different S3 bucket or folder.
const dstKeyResizedHalf = `p-half/` + imageName
s3.getObject({
Bucket: srcBucket,
Key: srcKey
}).promise()
.then(data => Sharp(data.Body)
.jpeg({
chromaSubsampling: '4:4:4',
progressive: true
})
.resize(WEB_WIDTH_MAX)
.toFormat('jpg')
.toBuffer()
)
.then(buffer => s3.putObject({
Body: buffer,
Bucket: dstBucket,
ContentType: 'image/jpg',
Key: dstKeyResizedHalf,
CacheControl: 'max-age=864000'
}).promise())
.catch(err => callback(err))
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句