Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: PHP Problem z konwersją svg do png - biały obrazek wynikowy
Forum PHP.pl > Forum > PHP
ropsiU
Witam,

Mam problem z imagick w wersji 2.3.0 na PHP 5.2.13. Usiłuję konwertować plik svg do png, ale wynikowy plik png jest biały. Z tego, czego się doszukałem, to następująca konwersja powinna zadziałać:
  1. <?php
  2. $file_path = APPPATH . '../media/img/upload/';
  3. $im = new Imagick($file_path . 'ink.svg');
  4. $im->setImageFormat( "png" );
  5. $im->writeImage($file_path . 'ink.png');

Ale nie działa. Wynikowy png co prawda rozmiar ma prawidłowy, ale na tym się kończy podobieństwo do pliku svg.

Plik SVG wyglada tak:
  1. <?xml version="1.0" encoding="UTF-8" standalone="no"?>
  2. <!-- Created with Inkscape (http://www.inkscape.org/) -->
  3. <svg
  4. xmlns:dc="http://purl.org/dc/elements/1.1/"
  5. xmlns:cc="http://creativecommons.org/ns#"
  6. xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  7. xmlns:svg="http://www.w3.org/2000/svg"
  8. xmlns="http://www.w3.org/2000/svg"
  9. xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
  10. xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
  11. width="744.09448819"
  12. height="1052.3622047"
  13. id="svg2"
  14. sodipodi:version="0.32"
  15. inkscape:version="0.46"
  16. sodipodi:docname="ink.svg"
  17. inkscape:output_extension="org.inkscape.output.svg.inkscape">
  18. <defs
  19. id="defs4">
  20. <inkscape:perspective
  21. sodipodi:type="inkscape:persp3d"
  22. inkscape:vp_x="0 : 526.18109 : 1"
  23. inkscape:vp_y="0 : 1000 : 0"
  24. inkscape:vp_z="744.09448 : 526.18109 : 1"
  25. inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
  26. id="perspective10" />
  27. </defs>
  28. <sodipodi:namedview
  29. id="base"
  30. pagecolor="#ffffff"
  31. bordercolor="#666666"
  32. borderopacity="1.0"
  33. gridtolerance="10000"
  34. guidetolerance="10"
  35. objecttolerance="10"
  36. inkscape:pageopacity="0.0"
  37. inkscape:pageshadow="2"
  38. inkscape:zoom="0.35"
  39. inkscape:cx="375"
  40. inkscape:cy="177.14286"
  41. inkscape:document-units="px"
  42. inkscape:current-layer="layer1"
  43. showgrid="false"
  44. inkscape:window-width="1280"
  45. inkscape:window-height="954"
  46. inkscape:window-x="0"
  47. inkscape:window-y="0" />
  48. <metadata
  49. id="metadata7">
  50. <rdf:RDF>
  51. <cc:Work
  52. rdf:about="">
  53. <dc:format>image/svg+xml</dc:format>
  54. <dc:type
  55. rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
  56. </cc:Work>
  57. </rdf:RDF>
  58. </metadata>
  59. <g
  60. inkscape:label="Layer 1"
  61. inkscape:groupmode="layer"
  62. id="layer1">
  63. <path
  64. sodipodi:type="arc"
  65. style="fill:#00ff00;fill-opacity:1;stroke:#000000;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
  66. id="path2383"
  67. sodipodi:cx="250"
  68. sodipodi:cy="348.07648"
  69. sodipodi:rx="218.57143"
  70. sodipodi:ry="215.71428"
  71. d="M 468.57143,348.07648 A 218.57143,215.71428 0 1 1 31.428574,348.07648 A 218.57143,215.71428 0 1 1 468.57143,348.07648 z" />
  72. <rect
  73. style="fill:#ff0000;fill-opacity:1;stroke:#000000;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
  74. id="rect2385"
  75. width="462.85715"
  76. height="662.85712"
  77. x="214.28572"
  78. y="320.93362" />
  79. <path
  80. sodipodi:type="star"
  81. style="fill:#ffcc00;fill-opacity:1;stroke:#000000;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
  82. id="path2389"
  83. sodipodi:sides="5"
  84. sodipodi:cx="437.14286"
  85. sodipodi:cy="580.93361"
  86. sodipodi:r1="210.90669"
  87. sodipodi:r2="105.45335"
  88. sodipodi:arg1="0.62182429"
  89. sodipodi:arg2="1.2501428"
  90. inkscape:flatsided="false"
  91. inkscape:rounded="0"
  92. inkscape:randomized="0"
  93. d="M 608.57142,703.79074 L 470.38036,681.01194 L 373.27311,781.9368 L 352.23364,643.47025 L 226.24061,582.30326 L 351.42857,519.50502 L 370.66784,380.77689 L 469.07772,480.43199 L 606.96128,455.86028 L 542.59398,580.24876 L 608.57142,703.79074 z" />
  94. </g>
  95. </svg>


Ktoś może się z tym spotkał?

Pozdrawiam!
everth
Spróbuj tak :
  1. function convertSvgToPng($file_path) {
  2. $svg = new Imagick($file_path);
  3. $svg->writeImage($file_path); //nasze svg
  4.  
  5. $png = new Imagick(); //tworzymy obraz png
  6. $png->setFormat('png');
  7.  
  8. $size = $svg->getSize();
  9. $png->setSize($size['columns'],$size['rows']); //ustawiamy rozmiar png
  10.  
  11. $pix = new ImagickPixel("transparent");
  12. $png->setBackgroundColor($pix);// oraz tło
  13.  
  14. $png->compositeImage($svg, imagick::COMPOSITE_DEFAULT,0,0); //wreszcie przeklejamy svg w nasz png
  15.  
  16. return $png;
  17. }

Funkcja zwraca ci obiekt imagemagick który możesz zapisać. Nie testowałem ale tak wklejałem znaki wodne (w svg) do JPegów
ropsiU
Dzięki za kod. Niestety nie bangla. Pojawiają się błędu opisane w komentarzu kodu poniżej.

  1. protected static function _create_thumb($file_name) {
  2. $file_path = DOCROOT . 'media/img/upload/';
  3. $svg = new Imagick($file_path . $file_name . '.svg');
  4. // nasze svg
  5. // powoduje błąd:
  6. // unable to open image `[...]/htdocs/fb_shirts/media/img/upload/aa.svg': Brak dostępu @ blob.c/OpenBlob/2480
  7. $svg->writeImage($file_path . $file_name . '.svg');
  8.  
  9. // przy zmianie nazwy pliku, pojawia się błąd:
  10. // Non-conforming drawing primitive definition `0' @ draw.c/DrawImage/3140
  11. //$svg->writeImage($file_path . $file_name . '_tmp.svg');
  12.  
  13. // tworzymy obraz png
  14. $png = new Imagick();
  15. $png->setFormat('png');
  16. $size = $svg->getSize();
  17. // ustawiamy rozmiar png
  18. $png->setSize($size['columns'],$size['rows']);
  19. $pix = new ImagickPixel("transparent");
  20. // oraz tło
  21. $png->setBackgroundColor($pix);
  22. // wreszcie przeklejamy svg w nasz png
  23. $png->compositeImage($svg, imagick::COMPOSITE_DEFAULT,0,0);
  24. $png->writeImage($file_path . $file_name . '.png');
  25.  
  26. $path = $file_path . $file_name . '_tmp.svg';
  27. unset($path);
  28.  
  29. }

Wygląda to tak, jakby Imagick nie radził sobie z odczytem pliku svg :| Zabawne jest to, że bez problemu daje się ten plika obsłużyć z linii komend convertem:
  1. $ convert aa.svg aa.png

Może ktoś ma pomysł jak to debugować? Z opisów błędów za dużo nie wynika. Google nie pomogło.
everth
Sprawdź ścieżkę. Nie podoba mi się. Jeśli katalog media masz w katalogu z twoim projektem (tam gdzie index.php) to zastosuj po prostu /media/(reszta ścieżki). Ewentualnie za pomocą
  1. fileperms ($path)

sprawdź czy masz dostęp do pliku.
ropsiU
Problem rozwiązany.

Okazało się, że trzeba na serwerze przekompilować ImageMagica, PECLa i PHP z opcja włączającą obsługę svg sciana.gif

Jak widać, pomimo informacji w phpinfo, że imagick obsługuje svg, to wcale niekoniecznie to oznacza, że rzeczywiście tak jest. To chyba taki chwyt marketingowy...? blinksmiley.gif

Temat chyba do zamknięcia.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.