使用ImageMagick生成“文本”图像的正确语法

时间:2016-12-18 14:27:13

标签: imagemagick

我正在尝试使用ImageMagick生成测试图像。图像只需包含文本。直截了当地使用example on the IM site不起作用:

class CustomTableViewCell: UITableViewCell {

    @IBOutlet weak var titleData: UILabel!
    @IBOutlet weak var titleDataTrailingConstraint: NSLayoutConstraint!

    var data: String? {
        didSet {
            titleData.text = data ?? ""
        }
    }

    var row: Int! 
    var alternativeMode = false 

    override func layoutSubviews() {
        super.layoutSubviews()

        if titleDataTrailingConstraint != nil {
            let screenSizeWidth = UIScreen.main.bounds.width
            if alternativeMode {
                titleDataTrailingConstraint.constant = (row % 2 == 0) ? (screenSizeWidth - titleData.bounds.width - 80) : 10
            } else {
                titleDataTrailingConstraint.constant = 10
            }
        }
    }

    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
        self.selectionStyle = .none
    }

}

收率:

convert -background lightblue -fill blue -font Roboto -pointsize 72 label:Anthony label.gif

所以1)能够使用字体名称需要什么(我的整个桌面使用Roboto,所以我认为它已正确安装,其他字体名称也不起作用)和2)如果我删除字体规范我仍然得到第二行,没有输出。

我错过了什么吗?

在Ubuntu 14.04上使用convert.im6: unable to read font `Roboto' @ warning/annotate.c/RenderType/853. convert.im6: no images defined `label.gif' @ error/convert.c/ConvertImageCommand/3044.

4 个答案:

答案 0 :(得分:1)

convert -background lightblue -fill blue -font Arial -pointsize 72 label:"Anthony" label.gif

在IM 6.9.7.0 Q16 Mac OSX

上,上述工作正常

答案 1 :(得分:1)

这是您正在使用的特定版本的ImageMagick中的一个错误,这是由错误修正补丁的错误后退造成的。

有问题的补丁是Debian补丁0161-Do-not-ignore-SetImageBias-bias-value。我不清楚这是否包含在2016年11月14日的8:6.7.7.10-6ubuntu3.2或2016年11月29日安全补丁8:6.7.7.10-6ubuntu3.3的安全更新中(或者,至少我没有打扰)试图找出它,因为它并不重要。)补丁是作为this security patch的后端创建的,但由于文件coders/label.c中逻辑的重组,更正最终被插入在错误的地方。

本质上,label.c的逻辑如下:

  1. 如果未指定图片的大小或分数,请计算出最合适的
  2. 如果未指定图像的宽度,请从计算宽度
  3. 复制它
  4. 如果未指定图像的高度,请从计算高度
  5. 复制它
  6. 如果未指定图像的pointsize,则从计算的pointsize
  7. 复制它
  8. 对图像参数进行一些其他相关设置
  9. 将文字渲染到图像中。
  10. 如果无法使用生成的图像大小,则安全补丁旨在避免步骤6。这可以避免在Web后端使用ImageMagick时出现可能的拒绝服务攻击(这很常见)。它补充说:

    3A。如果图像尺寸不可用,请立即失败。

    不幸的是,在要应用补丁的版本中,上述步骤的顺序不同,第三步与步骤5混合。(据我所知,这没有什么区别,但它有点混乱,这可能是它随后被修复的原因。)结果是添加的步骤3a插入之前从计算高度复制了图像的高度。如果图像最初没有高度,这会导致检查失败,即使此时已计算出正确的高度。

    说明清楚地表明label:来源不需要-size(或-pointsize)参数。但由于错误的补丁,这结果是不正确的;除非在几何体中指定了高度,否则不会生成标签。

    我没有为此生成错误报告,因为它仅适用于过时版本的Ubuntu(可能还有Debian)的过时版本的ImageMagic。碰巧我和OP都在某台机器上使用这个过时的Ubuntu版本,我向我们两个人推荐的是升级。但是,如果其他人有这个问题,我正在回答这个问题(我在尝试研究机器上的相同问题时发现了这个问题。)

答案 2 :(得分:0)

除了字体错误之外,我在Windows安装版本7上工作正常,因为我没有安装该字体。将其设置为arial会删除字体错误。

试试看Imagemagick是否能看到你的字体:

identify -list type

否则我会尝试使用路径直接链接到您的字体并将.ttf放在最后。我假设你的字体是.ttf,因为Imagemagick支持那种类型,另一种我不记得了。

出于兴趣,您的版本已有4.5年的历史。

答案 3 :(得分:0)

最终使用-size代替-pointsize使其工作,并切换到caption,因为我可以更好地控制位置:

convert -background transparent -fill darkblue -font Roboto-Regular -size 200x100 -gravity center 'caption:Test' out.png