Ruby、RSVG 和 PNG 流

2024-01-23

我正在尝试在 Rails 应用程序中将图像从 SVG 转换为 PNG。 ImageMagick 不适合我,因为 Heroku 此时无法/想要升级 IM。我正在测试在开发中使用 RSVG2 / Cairo 的一些想法,但遇到了障碍。

我可以轻松地将 SVG 转换并保存为 PNG,如下所示:

#svg_test.rb
require 'debugger'
require 'rubygems'
require 'rsvg2'

SRC = 'test.svg'
DST = 'test.png'

svg = RSVG::Handle.new_from_file(SRC)
surface = Cairo::ImageSurface.new(Cairo::FORMAT_ARGB32, 800, 800)
context = Cairo::Context.new(surface)
context.render_rsvg_handle(svg)
surface.write_to_png(DST)

但这只能让我写出 PNG 文件。在应用程序中,我需要能够动态生成这些,然后将它们作为数据发送到客户端浏览器。我不知道如何做到这一点,或者即使它受支持。我知道我至少可以调用 surface.data 来获取原始数据,但我对图像格式了解不够,不知道如何将其获取为 PNG 格式。

Thanks


啊哈!我是如此接近,事后看来这是非常明显的。只需使用 StringIO 对象调用 surface.write_to_png 函数即可。这将填充字符串对象,然后您可以获取其字节。这是我编写的已完成的 svg_to_png 函数,以及调用它的示例控制器。希望这对其他人有帮助。

图像转换函数:

  def self.svg_to_png(svg)
    svg = RSVG::Handle.new_from_data(svg)
    surface = Cairo::ImageSurface.new(Cairo::FORMAT_ARGB32, 800, 800)
    context = Cairo::Context.new(surface)
    context.render_rsvg_handle(svg)
    b = StringIO.new
    surface.write_to_png(b)
    return b.string
  end

测试控制器:

  def svg_img
    path = File.expand_path('../../../public/images/test.svg', __FILE__)
    f = File.open(path, 'r')
    t = ImageConvert.svg_to_png(f.read)
    send_data(t , :filename => 'test.png', :type=>'image/png')
  end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Ruby、RSVG 和 PNG 流 的相关文章

随机推荐

  • 在ConfigureServices方法中访问IHostingEnvironment

    我需要办理登机手续ConfigureServices方法当前托管环境名称是否为 开发 所以使用IHostingEnvironment IsDevelopment 方法对我来说可能没问题 但与配置方法不同 我没有IHostingEnviron
  • UPDATE 的 mysqli_affected_rows 有时在全行匹配时返回 0

    假设我有 MySQL 查询来更新一行 res mysqli query link UPDATE table SET val 1 WHERE id 5 if res if mysqli affected rows link gt 0 echo
  • Python Scrapy并不总是从网站下载数据

    Scrapy 用于解析 html 页面 我的问题是为什么有时scrapy返回我想要的响应 但有时不返回响应 是我的错吗 这是我的解析函数 class AmazonSpider BaseSpider name amazon allowed d
  • 如何使用 GCC 12.1 生成 C++23 堆栈跟踪?

    In the 发行说明 https www gnu org software gcc gcc 12 changes html对于 GCC12 在 运行时库 libstdc 它说 改进了实验性 C 23 支持 包括 默认情况下未构建 需要链接
  • 在 Haxe/OpenFL 应用程序中使用 SWF 动画

    尽管 Haxe 在 NME OpenFL 方面取得了巨大成就 但从 AS3 开发过渡的最大问题是资产 尽管 Haxe 与 as3 很相似 而且 OpenFL 试图提供熟悉的 API 但缺乏 SWF 支持吓跑了许多开发人员 我对此主题的研究使
  • Spark RDD 块在使用前被移除

    我正在使用 Future 对 RDD 执行阻塞操作 如下所示 dStreams foreach foreachRDD rdd gt Future writeRDD rdd 有时我会收到此错误 org apache spark SparkEx
  • Delphi IAccessible Get_accState 影响 Get_accName?

    我目前正在将 IAccessible Interface 添加到派生的 VCL 组件中 以便能够为我的应用程序实现自动化 UI 测试 实现接口后 我没有看到通过外部工具读出的组件属性中的名称 尽管我在调试时看到它已设置 经过 一些 或更可能
  • 在 ARCore 中添加的垂直平面上的对象始终旋转

    我正在 Sceneform ARFragment 中的垂直平面上添加图像 但它总是会旋转 该代码在水平面上运行良好 我将图像放置在垂直平面上的代码如下 arFragment setOnTapArPlaneListener hitResult
  • PHP 中的类模板就像 C++ 中的一样

    可以在中创建类模板PHP as in C PHP可能没有类似的语言结构 比如template中的关键词C 但也许有一些巧妙的技巧可以实现类似的功能 我有一个Point我想将其转换为模板的类 在类中 我使用类型参数 因此 对于每个类 我想传递
  • PHP 启动:无法加载动态库 'C:\xampp\php\ext\php_oci8_12c.dll' - 找不到指定的程序

    我们在php中连接oracle服务器面临一个大问题 我做了什么 Setp 1 安装 Windows 7 32 位 第2步 安装 XAMPP 32 包括 Apache 2 4 29 PHP 7 1 11 phpMyAdmin 4 7 4 Op
  • C++0x |为什么 std::atomic 使用 volatile 限定符重载每个方法?

    以下摘录自当前草案 说明了我的意思 namespace std typedef struct atomic bool bool is lock free const volatile bool is lock free const void
  • 使用 ExecuteNonQuery() 时返回值不正确

    我正在编写一个与 SQL Server 交互的 C 程序 我愚蠢地将查询字符串硬编码到 C 程序中 并希望将它们转换为服务器上的存储过程 由于某种原因 一个特定的 INSERT 语句 工作正常 不再有效 我不明白为什么 我什至运行了 SQL
  • 如何从十进制字符串中去掉零和小数点?

    当前输出以下代码 12 1 12 100 12 1000 12 00 12 12 0000 我怎样才能改变它 让它输出 12 1 12 1 12 1 12 12 12 Math Round 似乎就是这样 但它让我定义了我想要的小数位数 但我
  • Android java 百分比位图两幅图像之间的像素差异

    我需要在Android上的java中计算两个图像之间的像素差异 问题是我的代码返回不准确的结果 例如 我有 3 张非常相似的图片 但对于每张图片的比较 它返回显着不同的结果 pic1 vs pic2 1 71 pic1 与 pic3 0 0
  • 如何使用 Prisma 加密和解密数据?

    我已经研究了几周并寻找解决方案 但找不到针对我的具体问题的解决方案 我的前提 我使用NodeJS作为后端服务器 我通过Prisma管理数据 https www prisma io https www prisma io 我的客户要求对数据库
  • 识别标记并获取与其关联的对象的典型方法是什么?

    我在我的一个应用程序中使用地图 我想知道在点击标记时获取标记的关联对象的常见 有效方法是什么 我今天的计划是这样的 首先 我使用返回的标记创建对象的 ArrayList 和这些对象的 HashMapmMap addMarker 作为索引 A
  • 如何设置NSMenu/NSMenuItems的字体?

    我不知道如何在 NSMenu 中设置 NSMenuItems 的字体 样式 我在 NSMenu 上尝试了 setFont 方法 但它似乎对菜单项没有任何影响 NSMenuItem 似乎没有 setFont 方法 我希望它们都具有相同的字体
  • CSS 动画,单击时切换旋转

    我尝试让下面的插入符号在单击下拉菜单时旋转 180 度 在我尝试实现的解决方案中 它将插入符的类更改为单击时向上切换或向下切换 我第一次点击它时它会向上旋转 第二次它会立即返回到起始位置 然后再向上旋转 我闻到了脏代码的味道 添加此切换旋转
  • 在 ConstraintValidator 中注入服务 [Bean Validator - JSR 303] Spring

    下午好 我在 Bean Validator JSR 303 中注入服务时遇到问题 我将执行验证 但我需要验证数据库中的此记录 当我使用我的服务时 它抛出 NullPointerException 例外 Exception in thread
  • Ruby、RSVG 和 PNG 流

    我正在尝试在 Rails 应用程序中将图像从 SVG 转换为 PNG ImageMagick 不适合我 因为 Heroku 此时无法 想要升级 IM 我正在测试在开发中使用 RSVG2 Cairo 的一些想法 但遇到了障碍 我可以轻松地将