当前位置:  开发笔记 > 编程语言 > 正文

创建图像而不将其存储为本地文件

如何解决《创建图像而不将其存储为本地文件》经验,为你挑选了5个好方法。

这是我的情况 - 我想从用户上传的图像创建一个调整大小的jpeg图像,然后将其发送到S3进行存储,但我希望避免将调整大小的jpeg写入磁盘,然后为S3请求重新加载它.

有没有办法在内存中完全执行此操作,图像数据JPEG格式化,保存在变量中?



1> Jacco..:

大多数使用PHP的人选择ImageMagick 或Gd2

我从未使用过Imagemagick; Gd2方法:

storeResizedImage( $resizedJpegData );
?>

希望这可以帮助.



2> Artelius..:

这可以使用GD库和输出缓冲来完成.我不知道这与其他方法相比有多高效,但它不需要显式创建文件.

//$image contains the GD image resource you want to store

ob_start();
imagejpeg($image);
$jpeg_file_contents = ob_get_contents();
ob_end_clean();

//now send $jpeg_file_contents to S3



3> ConroyP..:

一旦你在内存中使用了JPEG(使用ImageMagick,GD或你选择的图形库),你就需要将对象从内存上传到S3.

许多PHP S3类似乎只支持文件上传,但Undesigned的那个似乎做了我们在这里的事情 -

// Manipulate image - assume ImageMagick, so $im is image object
$im = new Imagick();
// Get image source data
$im->readimageblob($image_source);

// Upload an object from a resource (requires size):
$s3->putObject($s3->inputResource($im->getimageblob(), $im->getSize()), 
                  $bucketName, $uploadName, S3::ACL_PUBLIC_READ);

如果您正在使用GD,您可以使用 imagecreatefromstring从流中读取图像,但我不确定您是否可以获得结果对象的大小,s3->inputResource如上所述 - getimagesize返回高度,宽度,等,但不是图像资源的大小.



4> benipsen..:

这个游戏的游戏相当晚,但如果你使用ConroyP和Imagick提到的S3库,你应该使用putObjectString()方法而不是putObject(),因为getImageBlob返回一个字符串.最终为我工作的例子:

$headers = array(
    'Content-Type' => 'image/jpeg'
);
$s3->putObjectString($im->getImageBlob(), $bucket, $file_name, S3::ACL_PUBLIC_READ, array(), $headers);

我有点挣扎这个,希望它可以帮助别人!



5> Bart..:

意识到这是一个古老的线索,但今天我花了一些时间在墙上撞到墙上,并且认为我会在这里为下一个人抓住我的解决方案.

此方法使用AWS SDK for PHP 2和GD进行图像调整大小(Imagick也可以轻松使用).

require_once('vendor/aws/aws-autoloader.php');

use Aws\Common\Aws;

define('AWS_BUCKET', 'your-bucket-name-here');

// Configure AWS factory 
$aws = Aws::factory(array(
    'key' => 'your-key-here',
    'secret' => 'your-secret-here',
    'region' => 'your-region-here'
));

// Create reference to S3
$s3 = $aws->get('S3');
$s3->createBucket(array('Bucket' => AWS_BUCKET));
$s3->waitUntilBucketExists(array('Bucket' => AWS_BUCKET));
$s3->registerStreamWrapper();

// Do your GD resizing here (omitted for brevity)

// Capture image stream in output buffer
ob_start();
imagejpeg($imageRes);
$imageFileContents = ob_get_contents();
ob_end_clean();

// Send stream to S3
$context = stream_context_create(
  array(
    's3' => array(
      'ContentType'=> 'image/jpeg'
    )
  )
);
$s3Stream = fopen('s3://'.AWS_BUCKET.'/'.$filename, 'w', false, $context);
fwrite($s3Stream, $imageFileContents);
fclose($s3Stream);

unset($context, $imageFileContents, $s3Stream);

推荐阅读
N个小灰流_701
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有