RMagick :: Image.from_blob方法不起作用

时间:2015-06-08 12:12:37

标签: ruby svg rmagick

我使用Ruby,Sinatra和RMagick

我不会使用浏览器图标(.svg文件),添加到图标文本 - 浏览器版本 - 并返回新的.svg以响应用户

我不会将.svg打开为字符串,使用我的文本添加一些行并使用RMagick将其保存为新的.svg文件。

但方法to_blobfrom_blob无效

# myapp.rb 

require 'sinatra'
require 'rmagick'

get '/test/:browser' do
  img = Magick::Image::read("icons/default/#{params[:browser]}.svg")[0]
  str = img.to_blob
  "<textarea name='image' cols='100' rows='100'>#{str}</textarea>"
end
来自https://rmagick.github.io/image3.html#to_blob

文档

  

img.to_blob [{optional arguments}] - &gt;串

     

描述:创建二进制大对象,直接到内存版本   图像。

chrome.svg:

<svg xmlns="http://www.w3.org/2000/svg" viewBox="15.5 15.5 224.5 224.5">
  <defs>
    <radialGradient cy="0" cx="0.5" id="r">
     <stop stop-color="#f06b59"/>
     <stop offset="1" stop-color="#df2227"/>
    </radialGradient>
    <radialGradient r="0.76" cy="0.3" cx="0.65" id="g">
     <stop offset="0.65" stop-color="#4cb749"/>
     <stop offset="1" stop-color="#388b41"/>
    </radialGradient>
    <radialGradient r="0.8" cy="0.25" cx="0.36" id="y">
     <stop offset="0.6" stop-color="#FCD209"/>
     <stop offset="0.7" stop-color="#f7c616"/>
     <stop offset="1" stop-color="#bc821e"/>
    </radialGradient>
    <radialGradient r="1" cy="0" cx="0.5" spreadMethod="pad" id="cf">
     <stop offset="0.1" stop-color="#7FB3DF"/>
     <stop offset="0.9" stop-color="#0F5B94"/>
    </radialGradient>
    <radialGradient id="cb" r="1" cy="0" cx="0.5">
     <stop offset="0" stop-color="#F6F0EE"/>
     <stop offset="1" stop-color="#ddd"/>
    </radialGradient>
  </defs>
  <path d="m198,148a70,70 0 0 0 -140,0l20,0a50,50 0 0 1 100,0" fill-opacity="0.1"/>
  <circle r="45" cx="127.5" cy="127.6" fill="url(#cf)" stroke="url(#cb)" stroke-width="9" />
  <path d="m228,78a112,112 0 0 0 -193,-13l45,78a50,50 0 0 1 47,-65" fill="url(#r)"/>
  <path d="m35,65a112,112 0 0 0 84,174l47,-80a50,50 0 0 1 -86,-16" fill="url(#g)"/>
  <path d="m119,239a112,112 0 0 0 109,-161l-101,0a50,50 0 0 1 39,81" fill="url(#y)"/>
  <path d="m35,65l45,78a50,50 0 0 1 2,-34l-45,-47" opacity="0.075"/>
  <path d="m119,239l47,-80a50,50 0 0 1 -29,17l-20,63" opacity="0.05"/>
  <path d="m228,78l-101,0a50,50 0 0 1 39,19l64,-16" opacity="0.05"/>
</svg>

但是to_blob会回复:

<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
  "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg width="225" height="225">
  <circle cx="0" cy="0" r="1" fill="white"/>
  <circle cx="1" cy="0" r="1" fill="white"/>
  <circle cx="2" cy="0" r="1" fill="white"/>
==============================
about 50 000 such lines here
if this save to file, size of file will be about 3 MB
==============================
  <circle cx="220" cy="224" r="1" fill="white"/>
  <circle cx="221" cy="224" r="1" fill="white"/>
  <circle cx="222" cy="224" r="1" fill="white"/>
  <circle cx="223" cy="224" r="1" fill="white"/>
  <circle cx="224" cy="224" r="1" fill="white"/>
</svg>

我做错了什么?

或者,如果您对如何执行此任务有另一个想法 - 请分享。

1 个答案:

答案 0 :(得分:-1)

get '/test/:browser' do
  image = File.open('icons/default/chrome.svg')
  blob = image.read
  "<textarea name='image' cols='100' rows='100'>#{blob}</textarea>"
end

这就是我需要的。 首先open文件,然后使用read方法。 在这种情况下,所有工作都正确并且.to_blob不需要