Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将base64字符串图像从上载转换为SVG而不写入文件_Php_Svg_Command Line_Imagick - Fatal编程技术网

Php 将base64字符串图像从上载转换为SVG而不写入文件

Php 将base64字符串图像从上载转换为SVG而不写入文件,php,svg,command-line,imagick,Php,Svg,Command Line,Imagick,我已经用ajax上传的base64字符串将画布生成的jpg上传到php。我有以下工作代码来处理数据:image/jpeg;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

我已经用ajax上传的base64字符串将画布生成的jpg上传到php。我有以下工作代码来处理数据:image/jpeg;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");
因此,我尝试将字符串包装到文本文件中,但失败了,因为内容不同,并且没有数据:image/jpeg;开始时是64。我也不想每次都写一个文本文件

if(strlen($b64)> 4000){
    $arr = str_split($b64, 4000);
    foreach ($arr as $key => $a) {
        $test = exec("echo ".$a." >> out.b64 2>&1", $output, $e);
    }
}
问题1:有没有可能将b64字符串包装到临时文本文件中,作为imagick的输入

问题2:我想回显svg xml,而不是将其作为文件下载。同样,这会写入一个新文件,尽管速度更快。我希望在php中有一种方法不是作为文件输出,而是作为变量或类似对象的东西输出


欢迎提出任何建议。谢谢。

我不确定您是否正在寻找:

要获取上载图像tmp图像的base64_编码:

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

        $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);

很抱歉回答这样一个老问题,但我有点困惑,为什么要尝试将base64编码的JPG a图像格式转换为SVG图像格式


这是行不通的,在最好的情况下,SVG只包含对原始JPG的引用。这就是你想要做的吗?

谢谢你的回复。上传的数据是由Canvas方法toDataURL生成的URI base64字符串,而不是.jpg文件。谢谢,但我想将长base64字符串作为参数传递到命令行应用程序(如imagick)中,而不是将base64保存到具有随机名称的png文件中。