(NET) NET (2017)

ImageMagick.NET file converter

Існує не тільки утілітка командної строки convert, але й Nuget package для бейсіка Magick.NET, який дозволяє конвертувати більш ста форматів світлин одне в одне. Взагалі в Windows icнує GDI+, який вільно виконує половину усієї роботи без всяких утіліт, які виросли з Лінукса. Наприклад, щоб накласти на світлину водяний знак, ніяких юніскових утіліт не потрібно, бо в GDI+ це робиться парою стрічок коду - це було написано у 2006-му році та з тих часів нічого не змінилося Наложение копирайта на рисунки.

Користуватися пакетом дуже просто:


   1:  Imports ImageMagick
   2:   
   3:  Module Magick_NET
   4:   
   5:      Public Sub SvgToPdf(InputSvgFileName As String, OutPdfFileName As String)
   6:          Try
   7:              MagickNET.SetLogEvents(LogEvents.All)
   8:              'MagickNET.SetGhostscriptFontDirectory("C:\Program Files\gs\gs9.27\Resource\Font")
   9:              'MagickNET.SetGhostscriptDirectory("C:\Program Files\gs\gs9.27\bin")
  10:              AddHandler MagickNET.Log, AddressOf MagickNET_Logger
  11:              Dim Bytes As Byte() = IO.File.ReadAllBytes(InputSvgFileName)
  12:              Dim ReadSettings As MagickReadSettings = New MagickReadSettings With {.Format = MagickFormat.Svg}
  13:              ReadSettings.Debug = True
  14:              ReadSettings.Verbose = True
  15:              Dim objImage As MagickImage = New MagickImage(Bytes, ReadSettings)
  16:              objImage.Write(OutPdfFileName, MagickFormat.Pdf)
  17:          Catch ex As Exception
  18:              MsgBox(ex.Message)
  19:          End Try
  20:      End Sub
  21:   
  22:      Sub MagickNET_Logger(sender As Object, arguments As LogEventArgs)
  23:          Debug.Print(arguments.Message)
  24:      End Sub
  25:   
  26:  End Module

Пакет ImageMagick.NET має:.


Configure delegates

ImageMagick.NET має деякі переваги, для початку він не залежить від GDI+, та його можливості більше. В першу чергу тим, что цей пакет поширюється завдяки зовнішним делегатам, ось приклад файла delegates.xml для конфігурування делегатів. Якщо ви будете використовувати достатньо детальний рівень LogEvents - то ви побачити власними очима де ImageMagick.NET шукає delegates.XML та який файл він знаходить та використовує наприкінці-кінців.


   1:  <?xml version="1.0" encoding="UTF-8"?>
   2:  <!DOCTYPE delegatemap [
   3:    &lt;!ELEMENT delegatemap (delegate)+>
   4:    <!ATTLIST delegatemap xmlns CDATA #FIXED ''>
   5:    <!ELEMENT delegate EMPTY>
   6:    <!ATTLIST delegate xmlns CDATA #FIXED '' command CDATA #REQUIRED
   7:      decode NMTOKEN #IMPLIED encode NMTOKEN #IMPLIED mode NMTOKEN #IMPLIED
   8:      spawn NMTOKEN #IMPLIED stealth NMTOKEN #IMPLIED>
   9:  ]>
  10:  <!--
  11:    Delegate command file.
  12:  
  13:    Commands which specify
  14:  
  15:      decode="in_format" encode="out_format"
  16:  
  17:    specify the rules for converting from in_format to out_format.  Use these
  18:    rules to translate directly between formats.
  19:  
  20:    Commands which specify only
  21:  
  22:      decode="in_format"
  23:  
  24:    specify the rules for converting from in_format to some format that
  25:    ImageMagick automatically recognizes. Use these rules to decode formats.
  26:  
  27:    Commands which specify only
  28:  
  29:     encode="out_format"
  30:  
  31:    specify the rules for an "encoder" which may accept any input format.
  32:  
  33:    The substitution rules are as follows:
  34:  
  35:      %a  authentication passphrase
  36:      %b  image file size in bytes
  37:      %g  image geometry
  38:      %h  image rows (height)
  39:      %i  input image filename
  40:      %#  input image signature
  41:      %m  input image format
  42:      %o  output image filename
  43:      %p  page number
  44:      %q  input image depth
  45:      %s  scene number
  46:      %u  unique temporary filename
  47:      %w  image columns (width)
  48:      %x  input image x resolution
  49:      %y  input image y resolution
  50:  
  51:    Set option delegate:bimodal=true to process bimodal delegates otherwise they
  52:    are ignored.
  53:  
  54:    If stealth="True" the delegate is not listed in user requested
  55:    "-list delegate" listings. These are typically special internal delegates.
  56:  
  57:    If spawn="True", ImageMagick does not wait for the delegate to finish, nor
  58:    will it read any output image.
  59:  -->
  60:  <delegatemap>
  61:    <delegate decode="bpg" command="&quot;bpgdec&quot; -b 16 -o &quot;%o.png&quot; &quot;%i&quot;; /usr/bin/mv &quot;%o.png&quot; &quot;%o&quot;"/>
  62:    <delegate decode="png" encode="bpg" command="&quot;bpgenc&quot; -b 12 -o &quot;%o&quot; &quot;%i&quot;"/>
  63:    <delegate decode="blender" command="&quot;blender&quot; -b &quot;%i&quot; -F PNG -o &quot;%o&quot;&quot;\n&quot;magick&quot; convert -concatenate &quot;%o*.png&quot; &quot;%o&quot;"/>
  64:    <delegate decode="browse" stealth="True" spawn="True" command="&quot;xdg-open&quot; http://www.imagemagick.org/; /usr/bin/rm &quot;%i&quot;"/>
  65:    <delegate decode="cdr" command="&quot;uniconvertor&quot; &quot;%i&quot; &quot;%o.svg&quot;; /usr/bin/mv &quot;%o.svg&quot; &quot;%o&quot;"/>
  66:    <delegate decode="cgm" command="&quot;uniconvertor&quot; &quot;%i&quot; &quot;%o.svg&quot;; /usr/bin/mv &quot;%o.svg&quot; &quot;%o&quot;"/>
  67:    <delegate decode="https" command="&quot;curl&quot; -s -k -L -o &quot;%o&quot; &quot;https:%M&quot;"/>
  68:    <delegate decode="doc" command="&quot;soffice&quot; --convert-to pdf -outdir `dirname &quot;%i&quot;` &quot;%i&quot; 2&gt; &quot;%u&quot;; /usr/bin/mv &quot;%i.pdf&quot; &quot;%o&quot;"/>
  69:    <delegate decode="docx" command="&quot;soffice&quot; --convert-to pdf -outdir `dirname &quot;%i&quot;` &quot;%i&quot; 2&gt; &quot;%u&quot;; /usr/bin/mv &quot;%i.pdf&quot; &quot;%o&quot;"/>
  70:    <delegate decode="dng:decode" command="&quot;ufraw-batch&quot; --silent --create-id=also --out-type=png --out-depth=16 &quot;--output=%u.png&quot; &quot;%i&quot;"/>
  71:    <delegate decode="dot" command='&quot;dot&quot; -Tsvg &quot;%i&quot; -o &quot;%o&quot;' />
  72:    <delegate decode="dvi" command="&quot;dvips&quot; -sstdout=%%stderr -o &quot;%o&quot; &quot;%i&quot;"/>
  73:    <delegate decode="dxf" command="&quot;uniconvertor&quot; &quot;%i&quot; &quot;%o.svg&quot;; /usr/bin/mv &quot;%o.svg&quot; &quot;%o&quot;"/>
  74:    <delegate decode="edit" stealth="True" command="&quot;xterm&quot; -title &quot;Edit Image Comment&quot; -e vi &quot;%o&quot;"/>
  75:    <delegate decode="eps" encode="pdf" mode="bi" command="&quot;gs&quot; -sstdout=%%stderr -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 &quot;-sDEVICE=pdfwrite&quot; &quot;-sOutputFile=%o&quot; &quot;-f%i&quot;"/>
  76:    <delegate decode="eps" encode="ps" mode="bi" command="&quot;gs&quot; -sstdout=%%stderr -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 &quot;-sDEVICE=ps2write&quot; &quot;-sOutputFile=%o&quot; &quot;-f%i&quot;"/>
  77:    <delegate decode="fig" command="&quot;uniconvertor&quot; &quot;%i&quot; &quot;%o.svg&quot;; /usr/bin/mv &quot;%o.svg&quot; &quot;%o&quot;"/>
  78:    <delegate decode="hpg" command="&quot;hp2xx&quot; -sstdout=%%stderr -m eps -f `basename &quot;%o&quot;` &quot;%i&quot;;     /usr/bin/mv -f `basename &quot;%o&quot;` &quot;%o&quot;"/>
  79:    <delegate decode="hpgl" command="&quot;hp2xx&quot; -sstdout=%%stderr -m eps -f `basename &quot;%o&quot;` &quot;%i&quot;;     /usr/bin/mv -f `basename &quot;%o&quot;` &quot;%o&quot;"/>
  80:    <delegate decode="htm" command="&quot;html2ps&quot; -U -o &quot;%o&quot; &quot;%i&quot;"/>
  81:    <delegate decode="html" command="&quot;html2ps&quot; -U -o &quot;%o&quot; &quot;%i&quot;"/>
  82:    <delegate decode="ilbm" command="&quot;ilbmtoppm&quot; &quot;%i&quot; &gt; &quot;%o&quot;"/>
  83:    <delegate decode="jpg" encode="lep" mode="encode" command="&quot;lepton&quot; &quot;%i&quot; &quot;%o&quot;"/>
  84:    <delegate decode="jxr" command="/usr/bin/mv &quot;%i&quot; &quot;%i.jxr&quot;; &quot;JxrDecApp&quot; -i &quot;%i.jxr&quot; -o &quot;%o.pnm&quot;; /usr/bin/mv &quot;%i.jxr&quot; &quot;%i&quot;; /usr/bin/mv &quot;%o.pnm&quot; &quot;%o&quot;"/>
  85:    <delegate decode="lep" mode="decode" command="&quot;lepton&quot; &quot;%i&quot; &quot;%o&quot;"/>
  86:    <delegate decode="miff" encode="show" spawn="True" command="&quot;magick&quot; display -immutable -delay 0 -title &quot;%M&quot; &quot;%i&quot;"/>
  87:    <delegate decode="miff" encode="win" stealth="True" spawn="True" command="&quot;magick&quot; display -immutable -delay 0 -title &quot;%M&quot; &quot;%i&quot;"/>
  88:    <delegate decode="mpeg:decode" command="&quot;ffmpeg&quot; -nostdin -v -1 -i &quot;%i&quot; -vframes %S -vcodec pam -an -f rawvideo -y &quot;%u.pam&quot; 2&gt; &quot;%u&quot;"/>
  89:    <delegate decode="odt" command="&quot;soffice&quot; --convert-to pdf -outdir `dirname &quot;%i&quot;` &quot;%i&quot; 2&gt; &quot;%u&quot;; /usr/bin/mv &quot;%i.pdf&quot; &quot;%o&quot;"/>
  90:    <delegate decode="pcl:cmyk" stealth="True" command="&quot;pcl6&quot; -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 &quot;-sDEVICE=pamcmyk32&quot; -dTextAlphaBits=%u -dGraphicsAlphaBits=%u &quot;-r%s&quot; %s &quot;-sOutputFile=%s&quot; &quot;%s&quot;"/>
  91:    <delegate decode="pcl:color" stealth="True" command="&quot;pcl6&quot; -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 &quot;-sDEVICE=ppmraw&quot; -dTextAlphaBits=%u -dGraphicsAlphaBits=%u &quot;-r%s&quot; %s &quot;-sOutputFile=%s&quot; &quot;%s&quot;"/>
  92:    <delegate decode="pcl:mono" stealth="True" command="&quot;pcl6&quot; -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 &quot;-sDEVICE=pbmraw&quot; -dTextAlphaBits=%u -dGraphicsAlphaBits=%u &quot;-r%s&quot; %s &quot;-sOutputFile=%s&quot; &quot;%s&quot;"/>
  93:    <delegate decode="pdf" encode="eps" mode="bi" command="&quot;gs&quot; -sstdout=%%stderr -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 -sPDFPassword=&quot;%a&quot; &quot;-sDEVICE=eps2write&quot; &quot;-sOutputFile=%o&quot; &quot;-f%i&quot;"/>
  94:    <delegate decode="pdf" encode="ps" mode="bi" command="&quot;gs&quot; -sstdout=%%stderr -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 &quot;-sDEVICE=ps2write&quot; -sPDFPassword=&quot;%a&quot; &quot;-sOutputFile=%o&quot; &quot;-f%i&quot;"/>
  95:    <delegate decode="png" encode="webp" command="&quot;cwebp&quot; -quiet %Q &quot;%i&quot; -o &quot;%o&quot;"/>
  96:    <delegate decode="pnm" encode="ilbm" mode="encode" command="&quot;ppmtoilbm&quot; -24if &quot;%i&quot; &gt; &quot;%o&quot;"/>
  97:    <delegate decode="bmp" encode="jxr" command="/usr/bin/mv &quot;%i&quot; &quot;%i.bmp&quot;; &quot;JxrEncApp&quot; -i &quot;%i.bmp&quot; -o &quot;%o.jxr&quot;; /usr/bin/mv &quot;%i.bmp&quot; &quot;%i&quot;; /usr/bin/mv &quot;%o.jxr&quot; &quot;%o&quot;"/>
  98:    <delegate decode="bmp" encode="wdp" command="/usr/bin/mv &quot;%i&quot; &quot;%i.bmp&quot;; &quot;JxrEncApp&quot; -i &quot;%i.bmp&quot; -o &quot;%o.jxr&quot;; /usr/bin/mv &quot;%i.bmp&quot; &quot;%i&quot;; /usr/bin/mv &quot;%o.jxr&quot; &quot;%o&quot;"/>
  99:    <delegate decode="ppt" command="&quot;soffice&quot; --convert-to pdf -outdir `dirname &quot;%i&quot;` &quot;%i&quot; 2&gt; &quot;%u&quot;; /usr/bin/mv &quot;%i.pdf&quot; &quot;%o&quot;"/>
 100:    <delegate decode="pptx" command="&quot;soffice&quot; --convert-to pdf -outdir `dirname &quot;%i&quot;` &quot;%i&quot; 2&gt; &quot;%u&quot;; /usr/bin/mv &quot;%i.pdf&quot; &quot;%o&quot;"/>
 101:    <delegate decode="ps" encode="prt" command='&quot;/usr/bin/lpr&quot; &quot;%i&quot;'/>
 102:    <delegate decode="ps:alpha" stealth="True" command="&quot;gs&quot; -sstdout=%%stderr -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 &quot;-sDEVICE=pngalpha&quot; -dTextAlphaBits=%u -dGraphicsAlphaBits=%u &quot;-r%s&quot; %s &quot;-sOutputFile=%s&quot; &quot;-f%s&quot; &quot;-f%s&quot;"/>
 103:    <delegate decode="ps:cmyk" stealth="True" command="&quot;gs&quot; -sstdout=%%stderr -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 &quot;-sDEVICE=pamcmyk32&quot; -dTextAlphaBits=%u -dGraphicsAlphaBits=%u &quot;-r%s&quot; %s &quot;-sOutputFile=%s&quot; &quot;-f%s&quot; &quot;-f%s&quot;"/>
 104:    <delegate decode="ps:color" stealth="True" command="&quot;gs&quot; -sstdout=%%stderr -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 &quot;-sDEVICE=pnmraw&quot; -dTextAlphaBits=%u -dGraphicsAlphaBits=%u &quot;-r%s&quot; %s &quot;-sOutputFile=%s&quot; &quot;-f%s&quot; &quot;-f%s&quot;"/>
 105:    <delegate decode="ps" encode="eps" mode="bi" command="&quot;gs&quot; -sstdout=%%stderr -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 &quot;-sDEVICE=eps2write&quot; &quot;-sOutputFile=%o&quot; &quot;-f%i&quot;"/>
 106:    <delegate decode="ps" encode="pdf" mode="bi" command="&quot;gs&quot; -sstdout=%%stderr -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 &quot;-sDEVICE=pdfwrite&quot; &quot;-sOutputFile=%o&quot; &quot;-f%i&quot;"/>
 107:    <delegate decode="ps" encode="print" mode="encode" command="lpr &quot;%i&quot;"/>
 108:    <delegate decode="ps:mono" stealth="True" command="&quot;gs&quot; -sstdout=%%stderr -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 &quot;-sDEVICE=pbmraw&quot; -dTextAlphaBits=%u -dGraphicsAlphaBits=%u &quot;-r%s&quot; %s &quot;-sOutputFile=%s&quot; &quot;-f%s&quot; &quot;-f%s&quot;"/>
 109:    <delegate decode="shtml" command="&quot;html2ps&quot; -U -o &quot;%o&quot; &quot;%i&quot;"/>
 110:    <delegate decode="sid" command="&quot;mrsidgeodecode&quot; -if sid -i &quot;%i&quot; -of tif -o &quot;%o&quot; &gt; &quot;%u&quot;"/>
 111:    <!--<delegate decode="svg" command="&quot;rsvg-convert&quot; -o &quot;%o&quot; &quot;%i&quot;"/>-->
 112:    <delegate decode="svg:decode" stealth="True" command="&quot;C:\Program Files\Inkscape\inkscape.exe&quot; &quot;%s&quot; --export-png=&quot;%s&quot; --export-dpi=&quot;%s&quot; --export-background=&quot;%s&quot; --export-background-opacity=&quot;%s&quot; &gt; &quot;%s&quot; 2&gt;&amp;1"/>
 113:    <delegate decode="svg" stealth="True" command="&quot;C:\Program Files\Inkscape\inkscape.exe&quot;  -e &quot;%o&quot; &quot;%i&quot;"/>
 114:    <delegate decode="tiff" encode="launch" mode="encode" command="&quot;gimp&quot; &quot;%i&quot;"/>
 115:    <delegate decode="wdp" command="/usr/bin/mv &quot;%i&quot; &quot;%i.jxr&quot;; &quot;JxrDecApp&quot; -i &quot;%i.jxr&quot; -o &quot;%o.bmp&quot;; /usr/bin/mv &quot;%i.jxr&quot; &quot;%i&quot;; /usr/bin/mv &quot;%o.bmp&quot; &quot;%o&quot;"/>
 116:    <delegate decode="webp" command="&quot;dwebp&quot; -pam &quot;%i&quot; -o &quot;%o&quot;"/>
 117:    <delegate decode="xls" command="&quot;soffice&quot; --convert-to pdf -outdir `dirname &quot;%i&quot;` &quot;%i&quot; 2&gt; &quot;%u&quot;; /usr/bin/mv &quot;%i.pdf&quot; &quot;%o&quot;"/>
 118:    <delegate decode="xlsx" command="&quot;soffice&quot; --convert-to pdf -outdir `dirname &quot;%i&quot;` &quot;%i&quot; 2&gt; &quot;%u&quot;; /usr/bin/mv &quot;%i.pdf&quot; &quot;%o&quot;"/>
 119:    <delegate decode="xps:cmyk" stealth="True" command="&quot;gxps&quot; -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 &quot;-sDEVICE=bmpsep8&quot; -dTextAlphaBits=%u -dGraphicsAlphaBits=%u &quot;-r%s&quot; %s &quot;-sOutputFile=%s&quot; &quot;%s&quot;"/>
 120:    <delegate decode="xps:color" stealth="True" command="&quot;gxps&quot; -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 &quot;-sDEVICE=ppmraw&quot; -dTextAlphaBits=%u -dGraphicsAlphaBits=%u &quot;-r%s&quot; %s &quot;-sOutputFile=%s&quot; &quot;%s&quot;"/>
 121:    <delegate decode="xps:mono" stealth="True" command="&quot;gxps&quot; -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 &quot;-sDEVICE=pbmraw&quot; -dTextAlphaBits=%u -dGraphicsAlphaBits=%u &quot;-r%s&quot; %s &quot;-sOutputFile=%s&quot; &quot;%s&quot;"/>
 122:    <delegate encode="mpeg:encode" stealth="True" command="&quot;ffmpeg&quot; -nostdin -v -1 -i &quot;%M%%d.jpg&quot; &quot;%u.%m&quot; 2&gt; &quot;%u&quot;"/>
 123:  </delegatemap>

SVG and convert SVG-to-PDF

Зверніть увагу, що у переліку делегатів присутні і SVG, і PDF, які не можуть оброблятися GDI+. Насправді SVG-файли у дефолтної конфігурації з делегатом gswin32c (з пакету Ghostscript) ImageMagick.NET обробляє некоректно - наприклад SVG трансформуються у чистий PNG та вкрай неточно! Для дефолтної конфігурації потрібно доставити зовнішній делегат ghostscript. Щоб SVG оброблялося корректно, краще використовувати делегат https://inkscape.org/, правда я так і не зрозумів як його коректно викликати у якості делегата та став викликати його безпосередньо.

Також я не зрозумів як правильно сконфігурувати Ghostscript на доступ до фонтів, у мене є фонт Arial Narow, але Ghostscript його так і не побачив, що я з ним не робив. Так що, можливості SVG/PDF, мабуть добре працюють лише у Лінукс.




Мабуть у мене просто не вистачило часу розібратися з фонтами. Ось тут почитайте про фонти для SVG більш детальніше - imagemagick-net-embedded-fonts.



Comments ( )
<00>  <01>  <02>  <03>  <04>  <05>  <06>  <07>  <08>  <09>  <10>  <11>  <12>  <13>  <14>  <15>  <16>  <17>  <18>  <19>  <20>  <21>  <22>  <23
Link to this page: //www.vb-net.com/ImageMagick/index.htm
<SITEMAP>  <MVC>  <ASP>  <NET>  <DATA>  <KIOSK>  <FLEX>  <SQL>  <NOTES>  <LINUX>  <MONO>  <FREEWARE>  <DOCS>  <ENG>  <CHAT ME>  <ABOUT ME>  < THANKS ME>