php
  • ruby
  • imagemagick
  • rmagick
  • 2010-11-09 31 views 4 likes 
    4

    我在翻譯下面的PHP/ImageMagick的代碼轉換成紅寶石RMagick失敗(使它成爲未來用戶更易於管理,並瞭解它的真正在做什麼):瞭解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使我重新思考。

    例如:爲什麼在$myDir PNG格式$output[0] != 1有時true,但RMagick的Image.alpha?總是true$myDir PNG圖片?我錯過了什麼嗎?

    我認爲如果有人能向我解釋convert-command到底在做什麼(包括表達式%[fx:u.a]),最好的方法是讓我回到正軌。

    更新:在此期間,我寫了我需要此信息的腳本。你可以check it out at Github如果它對你有任何幫助。

    +1

    我認爲 - Image.alpha可能會檢查圖像是否具有alpha圖層,哪些PNG會這樣做。而這是檢查一個像素的透明度水平。請參閱下面的答案。 – Orbling 2010-11-20 19:25:50

    回答

    5

    代碼檢查特定圖像是否包含透明度。

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

    這指示難懂的查詢的第一圖像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對象(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不存在,所以你可能不得不重新排列那些,但是原始類在那裏。

    參考

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

    非常感謝您的幫助! – Javier 2010-11-21 22:36:39

    +0

    @Javier很好,希望它有幫助。 :-) – Orbling 2010-11-22 00:22:50

    0

    你顯示的php代碼(它真的只是將工作轉換到shell中)不檢查圖像是否具有alpha通道,它只需要提供任何文件並將其打開即可。如果它已經有一個沒有文件更改,但轉換沒有被要求根據狀態做出任何決定,只需繼續並添加通道即可。

    +0

    對不起,我忘了添加整個PHP代碼。請檢查我編輯的問題。如果convert-command沒有檢查現有的alpha值,爲什麼convert-return-value被檢查並解釋爲這樣? – Javier 2010-11-10 12:50:37

    0

    爲什麼你不復制只是命令,並與系統調用?

    無需寶石...沒有問題,代碼應該看起來幾乎相同。

    編輯:RMagic只包裝imagemagic,所以如果你已經有imagmagic命令字符串,爲什麼要打擾rmagic。

    +2

    我剛剛編輯了我的問題,希望我的問題現在有點清晰。只要我不明白convert-command到底在做什麼,如果我用系統調用這些東西或者用RMagick包裝它就沒有關係。我不想使用我不完全理解的代碼。 – Javier 2010-11-14 23:49:09

    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通道的內容。

    +0

    謝謝,但這並不能真正回答我的問題。我並沒有試圖重構PHP腳本,我仍然不知道轉換命令在做什麼。所有「複雜的東西」已經以這種方式在一個有效的PHP腳本中實現。 – Javier 2010-11-19 11:00:55

    1

    發佈此的人誰仍在尋找解決這個,還有在這樣做的方式使用這裏描述的rmagick寶石的紅寶石https://stackoverflow.com/a/41282162/1975112

    相關問題