2012-06-09 172 views
2

我正在使用Microsoft Azure云并需要在那里上传图片。它的类上传方法putBlob()和putBlobData()要求数据本身(不是资源)或目录字符串作为参数,但在图像实际写入Blob之前,这些方法都不可用。如何从图像资源获取图像数据?

$fp = fopen($tmp_name, 'r'); 
$data = fread($fp, filesize($tmp_name)); 
fclose($fp); 

//Setup watermark destination 
$new_watermarked_image_name = "watermark.jpg"; 

// Create image resources 
$image = imagecreatefromstring($data); 
$watermark = imagecreatefrompng('images/watermark_large.png'); 
$copyright = imagecreatefrompng('images/copyright.png'); 

// Merge image resource s 
$image = overlay_watermark_full_size($image, $watermark); 
$image = overlay_watermark_lower_right($image, $copyright); 
imagejpeg($image, $new_watermarked_image_name, 100); 

//put original image 
$AzureStorageBlob->putBlob("uploads", "name", $tmp_name); 
//put watermarked image 
$AzureStorageBlob->putBlobData("uploads", "name", ?); // ? needs to be data 
+0

所以你说你需要'imagejpeg()'的二进制数据,但它被写入输出缓冲区呢?参见[文档中的示例](http://php.net/manual/en/function.imagejpeg.php),它使用'ob_start()'和'ob_get_clean()'将其存储到变量中。 –

+0

这就是答案 –

回答

2

您需要捕获由ob_start缓冲,是这样的:

ob_start(); 
imagejpeg($tmp_img); 
$i = ob_get_clean(); 

$ i是你的形象的blob

+0

$ i的变量是空的 –

+0

当我删除imagejpeg(目标)的第二个参数时,var_dump工作。谢谢。 –

+0

这就是我一直在寻找的,真棒的家伙! – Heitor

0

通过使用最新的SDK for PHP你可以只是路过图像流做到这一点:

$image_stream = fopen($tmp_name, 'r'); 
// Check README.md of how to create $blobRestProxy 
$blobRestProxy->createBlockBlob('container_name', 'my_image', $image_stream); 

如果您有任何疑问,请告诉我

+0

我不需要图像流putBlob: //把原始图像 $ AzureStorageBlob-> putBlob(“uploads”,“name”,$ tmp_name); 我的问题是: //把水印图像 $ AzureStorageBlob-> putBlobData(“uploads”,“name”,?); //?需要成为数据。 请记住,我没有一个目录,用于将即时生成的水印用作putBlob中的参数。所以我必须使用putBlobData,这是我没有的数据。 –

+0

我不太明白这个问题。首先,你有什么?变量中的图像数据?图像的路径?与图像流? – Ogail