2

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

  1. 从我的“原件”容器中获取图像
  2. 调整大小、锐化等。
  3. 将调整大小的图像保存到“thumbs”容器

我的问题是#2。我希望调整大小而不必先将原件复制到我的服务器(因为图像很大,我想动态调整大小),但不知道如何。这是我到目前为止(不多):

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

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

谢谢!

4

2 回答 2

3

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

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

于 2011-09-06T04:32:44.820 回答
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,则需要相应地更改文件的扩展名。

于 2011-09-06T00:23:28.253 回答