ruby - 如何在 Ruby (Rmagick) 中停止 ImageMagick 评估文本注释中的 @ 符号

标签 ruby rmagick

在我最近为客户构建的应用程序中,以下代码导致变量 @nameText 被评估,然后导致错误“无文本”(因为变量不存在) .

为了解决这个问题,我使用了 gsub,如下例所示。有没有办法告诉 Magick 根本不要评估字符串?

require 'RMagick'

@image = Magick::Image.read( '/path/to/image.jpg' ).first
@nameText = '@SomeTwitterUser'
@text = Magick::Draw.new
@text.font_family = 'Futura'
@text.pointsize = 22
@text.font_weight = Magick::BoldWeight

# Causes error 'no text'...
# @text.annotate( @image, 0,0,200,54, @nameText )

@text.annotate( @image, 0,0,200,54, @nameText.gsub('@', '\@') )

最佳答案

这是返回错误的 RMagick 的 C 代码:

// Translate & store in Draw structure
draw->info->text = InterpretImageProperties(NULL, image, StringValuePtr(text));
if (!draw->info->text)
{
    rb_raise(rb_eArgError, "no text");
}

它是对正在修改输入文本的 InterpretImageProperties 的调用 - 但它不是 Ruby,也不是它试图引用的 Ruby 实例变量。该函数在 Image Magick 核心库中定义:http://www.imagemagick.org/api/MagickCore/property_8c_source.html#l02966

再往下看,可以看到代码:

/* handle a '@' replace string from file */
if (*p == '@') {
   p++;
   if (*p != '-' && (IsPathAccessible(p) == MagickFalse) ) {
     (void) ThrowMagickException(&image->exception,GetMagickModule(),
         OptionError,"UnableToAccessPath","%s",p);
     return((char *) NULL);
   }
   return(FileToString(p,~0,&image->exception));
}

总而言之,这是一个核心库功能,它将尝试从文件(在您的情况下名为 SomeTwitterUser,我已经确认了这一点 - 尝试一下!)加载文本,您的解决方法是可能是你能做的最好的。

为了提高效率并尽量减少对输入字符串的更改,您可以依赖库代码的选择性,并且只修改以@开头的字符串:

@text.annotate( @image, 0,0,200,54, @name_string.gsub( /^@/, '\@') )

关于ruby - 如何在 Ruby (Rmagick) 中停止 ImageMagick 评估文本注释中的 @ 符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18697306/

相关文章:

ruby-on-rails - 对象常量的内部结构

ruby - 将 Time.now 类的剩余时间打印到控制台

ruby - 字符串替换 Ruby 正则表达式

ruby - Liquid 模板在自定义 block 中获取 token

ruby-on-rails - Ruby on Rails 种子数据

ruby-on-rails - 如何使用回形针保存 RMagick 处理的图像而不写入文件

ruby-on-rails - 使用 RMagick 将 PDF 文件转换为 PNG 并保持高质量的最佳方法是什么?

R:将 3D 矩阵转换/读取为 'magick' 对象,反之亦然

ruby-on-rails - Carrierwave - 将图像调整为固定宽度

ruby-on-rails - DreamHost 共享主机上的 rails 3.2.8 ruby​​ 1.9.3 fcgi RMagic 问题