RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 810933
Accepted
Дмитрий Полянин
Дмитрий Полянин
Asked:2020-04-07 22:13:12 +0000 UTC2020-04-07 22:13:12 +0000 UTC 2020-04-07 22:13:12 +0000 UTC

如何在 C# 中将 SVG 转换为 JPG 或 PNG?

  • 772

我在 C# 中生成 SVG 文件,我需要使用 C# 将它们呈现为 JPG 或 PNG。我怎样才能做到这一点?

任何选项都很有趣,但我只接受适用于共享主机的答案,因为脚本将在那里运行。ASP.NET MVC 5 托管 - Smarterasp。

c#
  • 3 3 个回答
  • 10 Views

3 个回答

  • Voted
  1. Best Answer
    Дмитрий Полянин
    2020-04-08T00:30:02Z2020-04-08T00:30:02Z

    C# 的SVG库。

    像这样工作:

    SvgDocument svgDoc = SvgDocument.Open("myFile.svg");
    System.Drawing.Bitmap bitmap = svgDoc.Draw();
    bitmap.Save("outFile.jpg", ImageFormat.Jpeg);
    

    不需要从NuGet拿包,因为版本比较老,bug很多,直接hot,要从github下载编译。

    该项目正在运行、支持和开发,但事实证明,开发人员正在逐步消除一些错误。

    该库不仅允许渲染现成的 SVG 文件,还允许使用其 API 动态创建它。

    • 5
  2. Дмитрий Полянин
    2020-04-08T15:41:11Z2020-04-08T15:41:11Z

    1. 使用Inkscape的方法。

    从命令行运行以下命令

    inkscape.exe -z "pathToSVGFile.svg" --export-png="pathToResultFile.png"
    

    在这种情况下,inskape我在系统路径中注册了它们。

    事实证明,Inkscape并非所有在浏览器中工作的文件都可以转换。href为了正确操作,必须将y属性use替换为 withxlink:href并将其写入 head 标签svg xmlns:xlink="http://www.w3.org/1999/xlink"中。

    2.使用node.js模块svgexport的方法

    全局安装svgexport模块

    npm install svgexport -g
    

    从控制台运行命令

    svgexport "FileNameWithPath.svg" "ResultFileNameWithPath.png" png 100%
    

    这种方法的优势在于它使用基于模块node.js svgexport的浏览器引擎进行渲染,这意味着结果将与基础浏览器中的显示最接近。此外,可以最大限度地使用浏览器语法。phantom.jsWebKitChromium

    这种方法的缺点是在处理带有俄文名称的路径时,转换命令会出错,因此所有文件都必须放在英文目录中。

    您可以在此处和此处阅读更多详细信息。

    添加:

    在 github 上阅读问题后,我意识到路径不起作用,很可能是由于路径中存在空格。

    • 3
  3. MSDN.WhiteKnight
    2020-04-10T12:04:42Z2020-04-10T12:04:42Z

    如果您有 Internet Explorer 11,则可以使用 MSHTML COM 对象:

    using System;
    using System.Collections.Generic;
    using System.Drawing;
    using System.Text;
    using System.Runtime.InteropServices;
    using System.ComponentModel;
    //Reference: System.Drawing
    //Reference: Microsoft HTML Object Library
    
    namespace SVG
    {
        public class SvgConvert
        {        
    
            public static void ToPng(string svgcontent, string outpath)
            {
                RECTL rcClient = new RECTL();
                bool b = SystemParametersInfo(SPI_GETWORKAREA, 0, ref rcClient, 0);
                if (b == false) { rcClient.bottom = 480; rcClient.right = 640; }
    
                int width = (int)(rcClient.right - rcClient.left);
                int height = (int)(rcClient.bottom - rcClient.top);
                IntPtr screendc = GetDC(IntPtr.Zero);
    
                string svghtml =
                    "<html><head><meta http-equiv=\"X-UA-Compatible\" content=\"IE=11\" /></head><body>" + svgcontent + "</body></html>";
    
                mshtml.HTMLDocument doc = null;
                mshtml.IHTMLDocument2 d2 = null;
                IOleObject pObj = null;
                IViewObject pView = null;
    
                try
                {
                    doc = new mshtml.HTMLDocument(); //создание документа
                    d2 = (mshtml.IHTMLDocument2)doc;
                    int hr;
    
                    //установка размера документа
                    pObj = (IOleObject)d2;
                    SIZEL sz = new SIZEL();
    
                    sz.x = (uint)MulDiv(width, HIMETRIC_INCH, GetDeviceCaps(screendc, LOGPIXELSX));
                    sz.y = (uint)MulDiv(height, HIMETRIC_INCH, GetDeviceCaps(screendc, LOGPIXELSY));
                    ;
                    hr = pObj.SetExtent((int)System.Runtime.InteropServices.ComTypes.DVASPECT.DVASPECT_CONTENT, ref sz);
                    if (hr != 0) throw Marshal.GetExceptionForHR(hr);
    
                    //запись SVG в документ
                    d2.write(svghtml);
                    d2.close();
    
                    //преобразование в Bitmap
                    pView = (IViewObject)d2;
                    Bitmap bmp = new Bitmap(width, height);
                    Graphics g = Graphics.FromImage(bmp);
                    using (g)
                    {
    
                        IntPtr hdc = g.GetHdc();
                        hr = pView.Draw((int)System.Runtime.InteropServices.ComTypes.DVASPECT.DVASPECT_CONTENT,
                            -1, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, hdc, ref rcClient, IntPtr.Zero,
                            IntPtr.Zero, 0);
                        if (hr != 0) throw Marshal.GetExceptionForHR(hr);
                        g.ReleaseHdc(hdc);
                    }
    
                    //сохранение в PNG
                    bmp.Save(outpath, System.Drawing.Imaging.ImageFormat.Png);
    
    
                }
                finally
                {
                    //освобождение ресурсов                
                    if (d2 != null) Marshal.ReleaseComObject(d2);
                    if (pObj != null) Marshal.ReleaseComObject(pObj);
                    if (pView != null) Marshal.ReleaseComObject(pView);
                    if (doc != null) Marshal.ReleaseComObject(doc);
                }
            }
    
            [DllImport("gdi32.dll")]
            static extern int GetDeviceCaps(IntPtr hdc, int nIndex);
    
            [DllImport("user32.dll")]
            static extern IntPtr GetDC(IntPtr hWnd);
    
            [DllImport("user32.dll")]
            static extern bool SystemParametersInfo(int nAction, int nParam, ref RECTL rc, int nUpdate);
    
            public static int MulDiv(int number, int numerator, int denominator)
            {
                return (int)(((long)number * numerator) / denominator);
            }
    
            const int LOGPIXELSX = 88;
            const int LOGPIXELSY = 90;
            const int HIMETRIC_INCH = 2540;
            const int SPI_GETWORKAREA = 48;
    
        }
    
        [ComImport()]
        [GuidAttribute("0000010d-0000-0000-C000-000000000046")]
        [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
        public interface IViewObject
        {
            int Draw([MarshalAs(UnmanagedType.U4)] int dwDrawAspect, int lindex, IntPtr pvAspect, IntPtr ptd, IntPtr hdcTargetDev, IntPtr hdcDraw,
                ref RECTL lprcBounds, IntPtr lprcWBounds, IntPtr pfnContinue, int dwContinue);
            int a();
            int b();
            int c();
            int d();
            int e();
        }
    
        [ComImport()]
        [Guid("00000112-0000-0000-C000-000000000046")]
        [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
        public interface IOleObject
        {
            void f();
            void g();
            void SetHostNames(object szContainerApp, object szContainerObj);
            void Close(uint dwSaveOption);
            void SetMoniker(uint dwWhichMoniker, object pmk);
            void GetMoniker(uint dwAssign, uint dwWhichMoniker, object ppmk);
            void x();
            void y();
            void DoVerb(uint iVerb, uint lpmsg, object pActiveSite, uint lindex, uint hwndParent, uint lprcPosRect);
            void EnumVerbs(ref object ppEnumOleVerb);
            void Update();
            void IsUpToDate();
            void GetUserClassID(uint pClsid);
            void GetUserType(uint dwFormOfType, uint pszUserType);
            int SetExtent(uint dwDrawAspect, ref SIZEL psizel);
            void GetExtent(uint dwDrawAspect, uint psizel);
            void Advise(object pAdvSink, uint pdwConnection);
            void Unadvise(uint dwConnection);
            void EnumAdvise(ref object ppenumAdvise);
            void GetMiscStatus(uint dwAspect, uint pdwStatus);
            void SetColorScheme(object pLogpal);
        };
    
    
    
        public struct RECTL
        {
            public uint left;
            public uint top;
            public uint right;
            public uint bottom;
        }
    
        public struct SIZEL
        {
            public uint x;
            public uint y;
        }
    }
    

    用法:

    string svgcontent = "<svg><circle cx=\"200\" cy=\"200\" r=\"150\" stroke=\"red\" fill=\"green\" stroke-width=\"10\"/></svg>";
    
    SvgConvert.ToPng(svgcontent,"c:\\test\\svgimage.png");
    

    来源:使用 IE 将 SVG 作为位图保存到任何位置

    • 2

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5