理解ImageMagick的convert并将其翻译为Ruby RMagick

4

我在将以下PHP/ImageMagick代码翻译为Ruby RMagick时遇到了困难(为了方便未来用户和理解其真正作用):

$output = array();
$returnValue = 0;
$pngFiles = $myDir->find("/.png$/i");
foreach($pngFiles as $pngFile) {
   $cmd = 'convert '.$pngFile->path.' -resize 1x1 -alpha on -channel o -format "%[fx:u.a]" info:'
   exec($cmd, $output, $returnValue);
   if($output[0] != 1) {
      logMessage("PNG file contains some alpha transparency and will not be modified");
   }
}

到现在为止,我认为我更或多或少地理解了convert命令在做什么,但是将其翻译成RMagick让我重新考虑了这个问题。

例如:为什么$output[0] != 1$myDir中的PNG文件有时true,但是在$myDir中的PNG文件中,RMagick的Image.alpha?总是true?我错过了什么吗?

我认为让我回到正轨的最好方法是,如果有人能够解释一下convert命令到底在做什么(包括表达式%[fx:u.a])。

更新:与此同时,我已经编写了我需要这些信息的脚本。如果对您有帮助,您可以在Github上查看它


1
我认为 - Image.alpha 可能是在检查图像是否具有 alpha 通道,而 PNG 格式则具有该通道。而 that 则是检查单个像素的透明度级别。请参见下面我的答案。 - Orbling
5个回答

5
代码检查特定图像是否包含透明度。 -format '%[fx:u.a]' info: 这指示ImageMagick检查第一个图像,该的alpha通道并输出有关它的信息。如果左上角的像素是透明的,则返回0,否则返回非零值。因此将图像调整为1x1大小,只需要查询单个像素。-channel o是不透明通道。
因此,英文代码将读取:循环遍历所有PNG文件,仅查看Alpha通道(不透明度),将其调整为单个像素并查看其是否透明。因此出现了echo消息。
不幸的是,我不知道Ruby或RMagick,但快速查看API似乎建议使用image.channel(AlphaChannel)获取alpha通道(AlphaChannel是ChannelType值,不确定是否必须指定ChannelType.AlphaChannel),然后跟随.resize(1,1)以缩小大小,并以.pixel_color(0,0)或.get_pixels(0,0,1,1)结束以获取Pixel对象(get_pixels()返回数组),我相信它具有opacity属性。但是,channel()命令将RGB值更改为所选通道的值,我不确定它是否保留不透明度通道,因此您可能只需要查看red,或者完全省略.channel()调用-尽管我不知道这是否会破坏结果。
也许如果Ruby支持良好的函数式编程方法。
image.channel(AlphaChannel).resize(1,1).pixel_color(0,0).red

如果pixel_color()由于某些原因没有返回不透明度,则可以使用以下代码:
image.channel(AlphaChannel).resize(1,1).get_pixels(0,0,1,1)[0].red

没有channel()调用,它将是这样的:
image.resize(1,1).pixel_color(0,0).opacity

或者

image.resize(1,1).get_pixels(0,0,1,1)[0].opacity

再次说明,我不懂Ruby语言,所以你可能需要大量重新排列代码,但是基本的原理还在。

参考资料

  1. RMagick文档
  2. ImageMagick 'fx'转义字符
  3. ImageMagick -channel选项

1

0

我从未编写过一行Ruby代码,但这里是PHP脚本的部分重制:

require 'find'

pngFiles = Dir.glob("*.png")

Find.find('./') do |f|
  if system 'convert ' + f + ' -resize 1x1 -alpha on -channel o -format "%[fx:u.a]" info' do
    print "PNG file contains some alpha transparency and will not be modified"

我认为你需要检查的仅仅是一个alpha通道,不需要所有复杂的东西。查看这个页面以获取更多信息:http://www.imagemagick.org/script/escape.php。它有一个 %A 操作符,可以输出与alpha通道相关的信息。


谢谢,但这并没有真正回答我的问题。我不想重构PHP脚本,而且我仍然不知道convert命令到底在做什么。所有的“复杂的东西”已经以这种方式在一个工作的PHP脚本中实现了。 - Javier

0
你展示的 PHP 代码(实际上只是将工作发送到 shell 进行转换)没有检查图像是否具有 alpha 通道,它只是获取给定的任何文件并打开它。如果它已经有一个 alpha 通道,那么文件不会发生任何更改,但是 convert 没有被要求根据状态做出任何决定,只需继续添加通道。

抱歉,我忘记添加完整的PHP代码。请检查我编辑过的问题。如果转换命令没有检查现有的alpha值,为什么要检查和解释转换返回值呢? - Javier

0
为什么你不只复制命令并使用系统调用呢?
无需宝石...没有问题,代码应该几乎相同。
编辑:RMagic只是包装了ImageMagic,如果你已经有ImageMagic命令字符串,为什么还要费心去使用RMagic呢?

2
我刚刚编辑了我的问题,希望我的问题现在更清晰了一些。只要我不明白转换命令到底是在做什么,使用system调用它或者用RMagick包装它都无所谓。我不想使用我完全不理解的代码。 - Javier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接