2017-02-13 10 views
1

私は、ajaxによってphpにアップロードされたbase64文字列でjpgを生成しました。私はデータを行うために次の作業コードを持っています:image/jpeg; base64からsvgへの変換。ファイルを書き込まずに、base64文字列イメージをアップロードからSVGに変換します。

//Uploaded is a string start from data:image/jpeg;base64,...(not a .jpg) 
$b64 = (isset($_POST['img']) ? $_POST['img'] : null); 
if($b64){ 
    $b64= str_replace('data:image/jpeg;base64,', '', $b64); 
    $b64= str_replace(' ', '+', $b64); 
    $im = new Imagick(); 
    $im->readImageBlob(base64_decode($b64)); 
    $im->trimImage(2000); 
    $im->setImageFormat("ppm"); 
    $im->writeImage("out.ppm"); 
    $cmd = exec("potrace out.ppm -s -o out.svg 2>&1", $output, $e); 
} 

しかし、私はファイルの書き込みが非常に遅いプロセスであり、ファイルシステムが乱雑であることを発見しました。私は書き込みファイルを必要としないようにコマンドをパイプすることによって書き込みプロセスを排除したいが、コマンドラインに慣れていない。

Imagickは入力文字列を最大5000文字に制限しています。したがって、b64が長すぎると失敗するため、このようにすることはできません。

exec("convert inline:".$b64." ppm:- | potrace -s -o out.svg"); 

だから、私は、テキストファイルに文字列をラップするために次の操作を実行しようとしましたが、内容が異なると、「データ:画像/ JPEG; base64で」なしであるとして、それは失敗し始めました。私は毎回テキストファイルを書きたくはありません。

if(strlen($b64)> 4000){ 
    $arr = str_split($b64, 4000); 
    foreach ($arr as $key => $a) { 
     $test = exec("echo ".$a." >> out.b64 2>&1", $output, $e); 
    } 
} 

Q1:b64文字列をimagickの入力として一時テキストファイルにラップすることもできますか?

Q2:ファイルとしてダウンロードする代わりに、svg xmlをエコーバックします。また、これは新しいファイルを書きますが、これは高速です。私はファイルとして出力されないメソッドがphpのもののような変数やオブジェクトとして存在することを願っています。

ご提案は大歓迎です。ありがとうございました。

答えて

0

あなたはこのを探しているなら、私はわからない:

アップロードされた画像(TMP画像)のBASE64_ENCODEを取得するには:

$filename = $_FILES['image']['tmp_name']; 
$handle = fopen($filename, "r"); 
$data  = fread($handle, filesize($filename)); 
$encoded_img = base64_encode($data); 
+0

感謝。あなたの返信。アップロードされたデータは、.jpgファイルではなく、CanvasメソッドtoDataURL()によって生成されたURIのbase64文字列です。 –

0

これを試してみて、ため

 $base64_str = str_replace('data:image/png;base64,', '', $b64); 
     $base64_str = str_replace(' ', '+', $base64_str); 
     $decoded = base64_decode($base64_str); 
     $targetPath ="../your target path/"; 
     $png_url ="../your target path/"."product-".strtotime('now').".png"; 
     $image_name ="product-".strtotime('now').".png";    
     $result = file_put_contents($png_url, $decoded); 
+0

ありがとう、しかし、私は引数としてimagickのようなコマンドラインのアプリケーションにlong base64文字列を渡す代わりに、ランダムな名前でpngファイルにbase64を保存します。 –

関連する問題