svg到png的转换与svg不相似

I am creating an SVG image, and then converting it to PNG. This is not working, however - the PNG is either not created or created incorrectly.

Sample SVG: http://placementearth.com/977013694537154275/svg52136945630084.svg

Sample PNG: http://placementearth.com/977013694537154275/svg52136945630084.png

$im = new Imagick(); 
$im->setBackgroundColor(new ImagickPixel('transparent')); 
$svg = file_get_contents($svgImage); 
$im->readImageBlob($svg); 
$im->setImageFormat("png32"); 
$dpngImage= $imgname.'.png'; 
file_put_contents($dpngImage,$im); 

AND

shell_exec('convert ex.svg ex.png;);

Any other way to do this. please tell me.

1个回答

You dont have to use imagemagick for this..

Try this..

In svg-editor.js

var exportHandler = function(window, data) {
            var issues = data.issues;

            if(!$('#export_canvas').length) {
                $('<canvas>', {id: 'export_canvas'}).hide().appendTo('body');
            }
            var c = $('#export_canvas')[0];

            c.width = svgCanvas.contentW;
            c.height = svgCanvas.contentH;

            var mime = 'image/png';
            var type = 'PNG';
            var datauri = "";
            if(typeof svgCanvas.export_as != 'undefined' && svgCanvas.export_as != null && typeof svgCanvas.export_as.length != 'undefined' && svgCanvas.export_as.length != null && svgCanvas.export_as.length > 0) {
                if(svgCanvas.export_as != 'image/png') {
                    mime = svgCanvas.export_as;
                    /* to make white backgrounf for jpeg images */
                    if(mime == 'image/jpeg') {
                        type = 'JPG';
                        data.svg = data.svg.replace('<svg width="800" height="600" xmlns="http://www.w3.org/2000/svg">', '<svg width="800" height="600" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><rect width="100%" height="100%" fill="white" />');   // baseProfile="tiny"
                        data.svg = data.svg.replace('<svg width="800" height="600" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">', '<svg width="800" height="600" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><rect width="100%" height="100%" fill="white" />');    // baseProfile="tiny"
                    }
                }
            }
                            svgCanvas.export_as = '';
            canvg(c, data.svg, {renderCallback: function() {
                // var datauri = c.toDataURL('image/png');
                var datauri = c.toDataURL(mime);
                                    $.ajax({
                                        type:"post",
                                        url: 'create.php',
                                        data:{
                                            'datauri' : datauri,
                                            'type' : type
                                        },
                                        success: function(data) {
                                            console.log(window.location.toString().replace('svg-editor.html',data));
                                            exportWindow.location.href = window.location.toString().replace('svg-editor.html',data);
                                        }
                                    });
                // exportWindow.location.href = datauri;
                var done = $.pref('export_notice_done');
                if(done !== "all") {
                    //var note = uiStrings.notification.saveFromBrowser.replace('%s', 'PNG');
                    var note = uiStrings.notification.saveFromBrowser.replace('%s', type);

                    // Check if there's issues
                    if(issues.length) {
                        var pre = "
 \u2022 ";
                        note += ("

" + uiStrings.notification.noteTheseIssues + pre + issues.join(pre));
                    }

                    // Note that this will also prevent the notice even though new issues may appear later.
                    // May want to find a way to deal with that without annoying the user
                    $.pref('export_notice_done', 'all');
                    exportWindow.alert(note);
                }
            }});
        };

create.php

<?php
$imgFile = "generated/test-".time().".".strtolower($_POST['type']);
$fh = fopen($imgFile, 'w');
// ='data:image/png;base64,data:image/png;base64
$image_content = $_POST['datauri'];
$image_content = substr($image_content, strpos($image_content,'base64,')+7);
fwrite($fh, base64_decode($image_content));
fclose($fh);
echo $imgFile;
exit;
?>

Use the image content from URI and write that into a file

duan2477
duan2477 如果你愿意,我可以寄一些svg。 请分享邮件ID。
7 年多之前 回复
doupiai5597
doupiai5597 是的我只收到svg。 我需要在png中转换它们。
7 年多之前 回复
drvlf9739
drvlf9739 您没有文件访问权限?
7 年多之前 回复
duanfenhui5511
duanfenhui5511 我没有使用js文件,因为svg已经从拖放方法创建了。
7 年多之前 回复
dongyue5686
dongyue5686 过去我曾经被认为我的标记渲染与用户在野外看到的相同 - 我认为这种方法有很多好处。
7 年多之前 回复
duangai1916
duangai1916 你在svg-editor.js中更改了exportHandler函数吗?
7 年多之前 回复
dpb75177
dpb75177 $ imgFile = time()。“t.png”; $ fh = fopen($ imgFile,'w'); $ image_content ='svg52136945630084.svg'; $ image_content = substr($ image_content,strpos($ image_content,'base64,')+ 7); fwrite($ fh,base64_decode($ image_content)); FCLOSE($ FH); echo $ imgFile; 出口; 我试过这个,但图像没有创建。 如果我使用错误,请告诉我。
7 年多之前 回复
dtsjq28482
dtsjq28482 这应该是一种非常简单的方式来再现用户看到的内容。
7 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐