了解ImageMagick的转换并转换为Ruby RMagick

时间:2010-11-09 10:44:18

标签: php ruby imagemagick rmagick

我无法将以下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");
   }
}

By now我以为我或多或少地理解了convert-command正在做什么,但将其翻译成RMagick让我重新思考。

例如:$output[0] != 1为什么true 有时 $myDirtrue的PNG上,但RMagick的Image.alpha? 总是$myDir中的PNG上的%[fx:u.a]?我错过了什么吗?

我认为,如果有人能够向我解释convert-command正在做什么(包括表达式{{1}}),那么让我回到正轨的最佳方式就是。

更新:与此同时,我编写了我需要此信息的脚本。如果对您有任何帮助,您可以check it out at Github

5 个答案:

答案 0 :(得分:5)

代码检查特定图像是否包含透明度。

-format '%[fx:u.a]' info:

这指示图像magick检查第一个图像u,该a的alpha通道并在其上输出信息,如果左上角像素是透明且非零,则返回0如果没有,我想。这就是为什么图像被调整为1x1的原因,因此只需要查询一个像素。 -channel o是不透明度渠道。

因此,英文代码会读取,循环浏览所有PNG文件,仅查看alpha通道(不透明度),调整大小为单个像素并查看它是否透明。因此回音信息。

不幸的是我不知道Ruby或RMagick,但是快速查看API似乎建议使用image.channel(AlphaChannel)来获取alpha通道(AlphaChannelChannelType值,而不是确定您是否必须指定ChannelType.AlphaChannel),然后点击.resize(1,1)以缩小尺寸,并使用.pixel_color(0,0).get_pixels(0,0,1,1)完成Pixel object back(get_pixels()返回一个数组),我相信它有一个opacity属性。但是,channel()命令会将RGB值更改为所选通道的值,并且我不确定它是否保留了不透明度通道,因此您可能只需要查看红色实例,或省略{{1}完全打电话 - 虽然我不知道这是否会破坏结果。

也许如果Ruby支持体面的函数式编程方法。

.channel()
如果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

同样,我的Ruby不存在,所以你可能不得不重新排列那些,但原语就在那里。

<强>参考

  1. RMagick Documentation
  2. ImageMagick 'fx' escapes
  3. ImageMagick -channel options

答案 1 :(得分:1)

对于仍在寻找解决方案的任何人发布此信息,有一种方法可以使用此处所述的somelist_variable = sorted(somelist_variable, key = lambda x: x.get("idx")) 宝石在红宝石中执行此操作enter image description here

答案 2 :(得分:0)

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

答案 3 :(得分:0)

为什么不复制命令并用系统调用它?

不需要宝石......没有问题,代码应该看起来几乎相同。

编辑:RMagic只包装了imagemagic,所以如果你已经有了figmagic命令字符串,为什么要打扰rmagic。

答案 4 :(得分: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通道的内容。