在不写入文件的情况下,将base64字符串图像从上传转换为SVG



我用ajax上传到php的base64字符串生成了画布生成的jpg。我有以下的工作代码来做数据:图像/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");

因此,我尝试执行以下操作将字符串包装到文本文件中,但由于内容不同,并且开头没有"data:image/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中有一种方法不是作为文件输出,而是作为变量或类似对象的东西输出。

欢迎提出任何建议。非常感谢。

试试这个。,

$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(光栅图像格式)转换为SVG(矢量图像格式)?

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

我不确定你是否在寻找这个:

获取上传图像(tmp图像)的base64_encode:

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

最新更新