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-command 的作用,但是将其翻译为 RMagick 让我重新思考了这一点。

例如:为什么$output[0] != 1 有时 true$myDirPNGs 上,但 RMagickImage.alpha?总是 truePNGs上$myDir?我错过了什么吗?

我认为让我回到正轨的最好方法是,如果有人可以向我解释 convert-command 到底在做什么(包括表达式%[fx:u.a])。

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

4

5 回答 5

5

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

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

这指示图像魔法检查第一个图像u,该图像的 alpha 通道a并在其上输出信息,如果左上角的像素是透明的,它将返回 0,如果不是,则返回非零。这就是将图像调整为 1x1 的原因,因此只需要参考单个像素。是-channel o不透明通道。

所以英文代码会读取,循环遍历所有PNG文件,只查看alpha通道(不透明度),调整到单个像素,看看它是否透明。因此,回声消息。

不幸的是,我不知道 Ruby 或 RMagick,但快速查看 API 似乎建议使用image.channel(AlphaChannel)来获取 alpha 通道(AlphaChannel是一个ChannelType值,不确定是否必须指定ChannelType.AlphaChannel),然后跟随以.resize(1,1)减小大小,并且完成或者.pixel_color(0,0)返回.get_pixels(0,0,1,1)对象Pixelget_pixels()返回一个数组),我相信它有一个opacity属性。但是,该channel()命令将 RGB 值更改为所选通道的值,并且我不确定它是否保留了不透明度通道,因此您可能只需要查看红色例如,或.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 通道选项
于 2010-11-20T19:20:29.827 回答
1

为仍在寻找解决方案的任何人发布此内容,有一种方法可以使用rmagick此处描述的 gem在 ruby​​ 中执行此操作https://stackoverflow.com/a/41282162/1975112

于 2016-12-22T11:33:13.557 回答
0

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

于 2010-11-09T14:25:30.940 回答
0

你为什么不只复制命令并用 system 调用它?

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

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

于 2010-11-14T16:07:01.137 回答
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 通道的信息。

于 2010-11-19T04:08:18.250 回答