直接从Rackspace Cloud Files'对象'调整图像大小而不下载?

时间:2011-09-05 23:37:42

标签: php rackspace-cloud

我已将我的图片移至Rackspace Cloud Files并使用他们的PHP API。我正在尝试执行以下操作:

  1. 从我的“原件”容器中获取图像
  2. 调整大小,锐化等等。
  3. 将已调整大小的图像保存到“竖起”容器
  4. 我的问题在于#2。我希望调整大小而不必先将原件复制到我的服务器(因为图像很大,我想动态调整大小),但无法弄清楚如何。这是我到目前为止(不多):

    $container = $conn->get_container("originals"); 
    $obj = $container->get_object("example.jpg"); 
    $img = $obj->read();
    

    部分问题是我不完全理解read()函数返回的内容。我知道$ img包含对象的“数据”(我能够打印出来作为乱码),但它既不是文件也不是网址,也不是图像资源,所以我不知道如何处理它。有可能以某种方式将$ img转换为图像资源吗?我试过了imagecreatefromjpeg($ img)但是没有用。

    谢谢!

2 个答案:

答案 0 :(得分:3)

首先,如果不将图像加载到内存中,则无法调整图像大小。除非远程服务器提供了一些“为我调整图像大小,这里是参数” API,您必须在脚本中加载图像来操作它。因此,您必须将文件从CloudFiles容器复制到服务器,对其进行操作,然后将其发送回存储。

您从$obj->read()收到的数据是图像数据。那是文件。它没有文件名,它没有保存在硬盘上,但它是整个文件。要将其加载到gd以对其进行操作,您可以使用imagecreatefromstring。这类似于使用imagecreatefrompng,只有imagecreatefrompng想要从文件系统中读取文件,而imagecreatefromstring只接受数据你已经加载到内存中了。

答案 1 :(得分:0)

您可以尝试将$ img变量的内容转储到可写文件中,如下所示:

<?php
$filename = 'modifiedImage.jpg';

/* 
 * 'w+' Open for reading and writing; place the file pointer at the beginning of the file and truncate 
 * the file to zero length. If the file does not exist, attempt to create it. 
 */
$handle = fopen($filename, 'w+');

// Write $img to the opened\created file.
if (fwrite($handle, $img) === FALSE) {
    echo "Cannot write to file ($filename)";
    exit;
}

echo "Success, wrote to file ($filename)";

fclose($handle);
?>

更多详情:

http://www.php.net/manual/en/function.fopen.php

http://www.php.net/manual/en/function.fwrite.php

修改

您可能还想仔细检查read()函数返回的数据类型,因为如果数据不是jpg图像,如果它是例如png,则需要相应地更改文件的扩展名。