了解ImageMagick的转换并转换为Ruby 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:ua]" 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
有时在$myDir
PNG上$myDir
,但是RMagick的Image.alpha?
$myDir
PNG 总是 true
? 我错过了什么吗?
我认为,如果有人能够向我解释转换命令正在做什么(包括表达式%[fx:ua]
),让我回到正轨的最佳方法就是。
更新 :与此同时,我编写了我需要此信息的脚本。 您可以在Github上查看它是否对您有任何帮助。
代码检查特定图像是否包含透明度。
-format '%[fx:ua]' info:
这指示图像magick检查第一个图像u
,a的alpha通道并在其上输出信息,如果左上角像素是透明的,它将返回0,如果不是,我将返回非0。 这就是为什么图像被调整为1×1的原因,因此只需要咨询一个像素。 -channel o
是不透明度通道。
因此,英文代码将读取,遍历所有PNG文件,仅查看alpha通道(不透明度),resize为单个像素并查看它是否透明。 因此回声消息。
不幸的是我不知道Ruby或RMagick,但是快速查看API似乎建议使用image.channel(AlphaChannel)
来获取alpha通道( AlphaChannel
是一个AlphaChannel
值,不确定是否必须指定ChannelType.AlphaChannel
) ,然后使用.resize(1,1)
来缩小尺寸,并使用.pixel_color(0,0)
或.get_pixels(0,0,1,1)
以获取Pixel
对象( get_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不存在,所以你可能不得不重新安排那些,但原语在那里。
参考
- RMagick文档
- ImageMagick’fx’逃脱了
- ImageMagick -channel选项
发布此信息给任何仍在寻找解决方案的人,有一种方法可以使用此处描述的rmagick
gem在ruby中执行此操作https://stackoverflow.com/a/41282162/1975112
您显示的PHP代码(实际上只是发送工作以在shell中转换)不检查图像是否具有alpha通道,它只需要获取任何文件并将其打开。 如果它已经有一个没有文件更改,但转换不会被要求根据状态做出任何决定,只需继续添加频道。
为什么你不复制命令并用系统调用它?
没有gem……没有问题,代码应该看起来几乎一样。
编辑:RMagic只包装imagemagic所以如果你已经有了figmagic命令字符串,为什么要打扰rmagic。
我从来没有编写过一行Ruby,但这里是PHP脚本的部分重制:
require 'find' pngFiles = Dir.glob("*.png") Find.find('./') do |f| if system 'convert ' + f + ' -resize 1x1 -alpha on -channel o -format "%[fx:ua]" info' do print "PNG file contains some alpha transparency and will not be modified"
我认为你唯一需要检查的只是一个alpha通道,而不是所有复杂的东西。 请查看此页面以获取更多信息: http : //www.imagemagick.org/script/escape.php 。 它有一个%A
运算符,并输出有关alpha通道的信息。
- Ruby on Rails错误:“未定义的方法`call”表示“result == false”:字符串“create method中的错误
- Paperclip安装后未定义的方法has_attached_file?
- 如何改善里面的Rails / Paperclip图像压缩或ImageMagick / Rmagick?
- 将ImageMagick CLI转换为MiniMagick gem
- Rails Paperclip如何使用ImageMagick的filter选项?
- 从https使用RMagick读取pdf会导致无法打开文件错误
- ImageMagick多行文本和背景图像
- Ruby可以动态增加文件大小以进行测试
- 我的ImageMagick旋转时间到了哪里?