将base64字符串图像从上传转换为SVG而无需写入文件

时间:2017-02-13 07:37:41

标签: php svg command-line imagick

我在ajax上传给base的base64字符串中有canvas生成的jpg。我有以下工作代码来执行数据:image / jpeg; base64到svg转换。

void sortArray(struct List list[]);
void sortArray(struct List* list, int n); // n = size of array

然而,我发现写文件是一个非常缓慢的过程并使我的文件系统混乱。我希望通过管道命令来消除写入过程,这样就不需要写入文件,但我不熟悉命令行。

Imagick将输入字符串限制为最多5000个字符,所以我不能这样做,因为一旦b64太长,它就会失败。

//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);
}

因此,我尝试执行以下操作将字符串包装到文本文件中,但由于内容不同且开头没有“data:image / jpeg; base64”,因此会失败。我也不想每次都写一个文本文件。

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

Q1:我有机会将b64字符串包装成临时文本文件作为想象的输入吗?

Q2:我想回复svg xml而不是将其下载为文件。再次,这写了一个新文件,虽然这更快。我希望有一种方法不能作为文件输出,而是像php中的变量或对象一样输出。

欢迎任何建议。谢谢。

3 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分: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);

答案 2 :(得分:0)

很抱歉回答这么老的问题,但我有点困惑,您为什么要尝试将 base64 编码的 JPG(raster 图像格式)转换为 SVG({{3 }} 图像格式)?

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