2011-09-05 86 views
2

我已將我的圖像移至Rackspace Cloud Files並使用其PHP API。我試圖做到以下幾點:直接從Rackspace Cloud文件對象調整圖像大小而無需下載?

  1. 從我的「原件」獲取圖像容器
  2. 調整它的大小,磨它,等
  3. 保存調整後的圖像的「大拇指」容器

我的問題是#2。我希望調整大小,而不必先將原件複製到我的服務器(因爲圖像很大,我想動態調整大小),但無法弄清楚。這是我迄今爲止(不多):

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

部分問題是我不完全理解什麼是由read()函數返回。我知道$ img包含對象的「數據」(我可以將其打印爲亂碼),但它既不是文件也不是網址,也不是圖像資源,所以我不知道如何處理它。是否有可能以某種方式將$ img轉換爲圖像資源?我嘗試imagecreatefromjpeg($ img),但沒有奏效。

謝謝!

+0

您是否嘗試將$ img輸出到文件中,即modifiedImage.jpg?使用fopen()打開一個具有寫權限的文件,將變量$ img的內容轉儲到其中,然後關閉句柄。看看它是否工作...作爲一個完整性檢查,我會查看$ img變量中亂碼的前幾個字符,以查看其中包含的數據類型。 – Bassem

+0

什麼是「讀取」功能?我看不到從哪裏來。 – deceze

+0

@Link這似乎是一個好主意 - 你願意提供一些快速示例代碼嗎?我不是很熟悉fopen(),所以不確定如何去做,特別是傾銷內容的部分。 – Holly

回答

3

首先,如果不將圖像加載到內存中,您將無法調整圖像大小。除非遠程服務器提供了一些「爲我調整我的圖像大小,以下是參數」 API,您必須在腳本中加載圖像以操作它。因此,您必須將該文件從CloudFiles容器複製到您的服務器,然後對其進行處理,然後將其發回存儲。

$obj->read()收到的數據是圖像數據。那是檔案。它沒有文件名,它沒有保存在硬盤上,但它是整個文件。要將其加載到gd中進行操作,可以使用imagecreatefromstring。這與使用例如imagecreatefrompng類似,只有imagecreatefrompng想要從文件系統自己讀取文件,而imagecreatefromstring只接受已經加載到內存中的數據。

+0

imagecreatefromstring!我不知道這個功能,謝謝!這正是我所尋找的東西。我試了一下,效果很好。我將不得不測試它是否比其他方法更快,但它看起來應該是這樣,因爲它跳過了一步(從雲到服務器,然後_then_應用imagecreatefromjpg)。 – Holly

+0

@Holly您仍然需要將數據從雲端複製到您的服務器上,您無需將其寫入硬盤上的文件。 – deceze

+0

@deceze:請提供調整大小的代碼,然後再將該大小的圖像寫入雲服務器。 –

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,則文件的擴展名需要是相應地改變。

+1

或者你也可以使用'的file_get_contents()'和'file_put_contents()'執行相同的通用的上述功能。 –

+0

感謝這麼多的代碼。它的工作!不過,是不是基本上相同複製文件到我的服務器?(API h作爲一個函數:save_to_filename())。或者這種方法更快/更好?我一直希望避免完全複製,並在內存中處理圖像。但我意識到這可能是不可能的,我可以忍受。 – Holly

+0

我不認爲這種方法是通過任何方式更快\比API的save_to_filename()方法更好,但這種方法的優點是,你必須對你救什麼更多的控制。 Digg進一步討論了save_to_filename()方法並嘗試了一下。您可能會發現這是您一直在尋找的東西:) – Bassem