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

时间:2013-09-09 11:33:04

标签: 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('@', '\@') )

1 个答案:

答案 0 :(得分:1)

这是来自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,我已经确认了这一点!),您的解决方案可能是最好的你可以做。

为了提高效率,对输入字符串进行最小的更改,您可以依赖库代码的选择性,只有在以<{1}}启动时才修改字符串:

@