2017-02-13 14 views
1

У меня есть холст, сгенерированный jpg в base64 string, загруженный ajax на php. У меня есть следующий рабочий код для выполнения данных: 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 в текстовый файл temp в качестве входного сигнала для воображения?

Q2: Я хочу, чтобы echo обратно svg xml вместо загрузки его в файл. И снова, это пишет новый файл, хотя это быстрее. Я надеюсь, что есть метод, который не выводится как файл, а как переменная или объект вроде вещи в php.

Любые предложения приветствуются. Спасибо.

ответ

0

Я не уверен, если вы ищете это:

получить base64_encode загруженного изображения (TMP изображения):.

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

Спасибо за ваш ответ. Загруженные данные представляют собой строку base64 URI, сгенерированную методом Canvas toDataURL(), а не файл .jpg. –

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

Спасибо, но я хочу передать длинную строку base64 в приложение командной строки, как imagick, в качестве аргумента вместо сохранения base64 в png-файл со случайным именем. –