2012-09-01 126 views
12

我有多個圖片 - 保存爲Base64編碼字符串,現在我想調整這些圖片,讓他們的縮略圖...調整大小的base64圖片

最好將使用Javascript(節點服務器)來調整它們的大小,但也可以用php調整它們的大小。

由於在node.js中提前

回答

3

不知道該怎麼做(或嗯,什麼事),但你的問題的PHP位當然是可能的。解析Base64後,將其加載到GD image然後resample它。

http://php.net/manual/en/function.imagecopyresampled.php

+0

好吧,我沒有直寫在我的服務器上的權利 - 我怎麼能連接這個拇指到我的node.js應用程序?任何想法? –

+0

這是屬於「不知道如何在node.js中做到這一點(或者說,任何事情)」的問題。希望其他人可能有一個好主意。 –

+0

尋找這個答案一2天,現在... 通常它會很好地工作節點 - 但在我節點應用程序我有沒有寫權限,太......,吸 –

9

我同意the method from Jon Hanna:你解析的Base64code然後將其加載到重採樣前的GD圖像。然而,要將它作爲數據取回,它並不像我那麼容易。在GAE的php中,需要通過在php.ini文件中設置output_buffering = "On"來獲得enable output buffering

下面我詳細解釋了一步。

此文檔被取爲參考使用Base64code的解析,以創建圖像資源http://php.net/manual/en/function.imagecreatefromstring.php

// Create image resource from Base64code 
$data64 = 'iVBORw0KGgoAAAANSUhEUgAAABwAAAASCAMAAAB/2U7WAAAABl' 
     . 'BMVEUAAAD///+l2Z/dAAAASUlEQVR4XqWQUQoAIAxC2/0vXZDr' 
     . 'EX4IJTRkb7lobNUStXsB0jIXIAMSsQnWlsV+wULF4Avk9fLq2r' 
     . '8a5HSE35Q3eO2XP1A1wQkZSgETvDtKdQAAAABJRU5ErkJggg=='; 
$image = imagecreatefromstring(base64_decode($data64)); 

這是可以直接付諸重新取樣功能的圖像資源:http://php.net/manual/en/function.imagecopyresampled.php

// Resample 
$image_p = imagecreatetruecolor($new_w, $new_h); 
imagecopyresampled($image_p, $image, 0, 0, 0, 0, $new_w, $new_h, $org_w, $org_h); 

結果也是一個圖像資源。爲了將其作爲數據,我們需要Buffering
how to create a base64encoded string from image resource

// Buffering 
ob_start(); 
imagepng($image_p); 
$data = ob_get_contents(); 
ob_end_clean(); 

使用文檔下面我設置my project一個GCS桶的網站,所以我可以商店&顯示它直接: https://cloud.google.com/storage/docs/website-configuration#tips

//Store & Display 
$context = stream_context_create([ 
    'gs' =>[ 
     'acl'=> 'public-read', 
     'Content-Type' => 'image/jpeg', 
     'enable_cache' => true, 
     'enable_optimistic_cache' => true, 
     'read_cache_expiry_seconds' => 300, 
    ] 
]); 
file_put_contents("gs://mybucket/resample/image.jpeg", $data, false, $context); 
header("Location: http://mybucket/resample/image.jpeg"); 
+0

值得指出的是'imagecopyresampled()'比'imagecopyresized()'產生更好的質量,因爲它插值了。 – garrettlynch