如何停止Ruby中的ImageMagick(Rmagick)评估@sign-in文本注释
在我最近为客户端构建的一个应用程序中,以下代码导致对变量如何停止Ruby中的ImageMagick(Rmagick)评估@sign-in文本注释,ruby,rmagick,Ruby,Rmagick,在我最近为客户端构建的一个应用程序中,以下代码导致对变量@nameText进行求值,然后导致错误“无文本”(因为该变量不存在) 为了解决这个问题,我使用了gsub,如下例所示。有没有办法告诉Magick不要对字符串求值 require 'RMagick' @image = Magick::Image.read( '/path/to/image.jpg' ).first @nameText = '@SomeTwitterUser' @text = Magick::Draw.new @text.f
@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代码:
//转换并存储在绘图结构中
绘图->信息->文本=解释图像属性(NULL、图像、StringValuePtr(文本));
如果(!绘图->信息->文本)
{
rb_raise(rb_eArgError,“无文本”);
}
正是对interpretatimageproperties
的调用修改了输入文本,但它不是Ruby,也不是试图引用的Ruby实例变量。此函数在Image Magick core库中定义:
再往下看一点,您可以看到代码:
/*处理文件中的“@”替换字符串*/
如果(*p=='@')){
p++;
if(*p!='-'&&(IsPathAccessible(p)=MagickFalse)){
(void)ThrowMagickException(&image->exception,GetMagickModule(),
选项错误,“无法访问路径”,“%s”,p);
返回((char*)NULL);
}
返回(FileToString(p,~0,&image->exception));
}
总之,这是一个核心库功能,它将尝试从文件中加载文本(名为SomeTwitterUser
,在您的情况下,我已经确认了这一点-尝试一下!),您的工作可能是您所能做的最好的
为了提高效率,并尽量减少对输入字符串的更改,您可以依赖库代码的选择性,仅当字符串以@
开头时才修改字符串:
@text.annotate(@image,0,0200,54,@name\u string.gsub(/^@/,'\@'))
您想对字符串中的变量做什么?@nameText变量实际上是用户发送的参数。他们创建了一个广告牌图像,上面有他们的twitter个人资料图片和twitter名称。我想你想要这个“#{@SomeTwitterUser}”
,顺便说一句,你违反了Ruby命名约定。它们应该是@name\u text
和@twitter\u用户
@screenmut,我想你没有抓住重点@SomeTwitterUser
是Twitter用户名。。。不是一个实例变量。我想你可能犯了和Rmagick一样的错误谢谢尼尔,这太奇怪了,我不得不和大家分享。