2012-05-24 5 views
2

Я занимаюсь обработкой изображений с помощью команд ImageMagick, и я хотел бы поместить их в RMagick. Цель этой задачи - сделать снимок и пиксельные области (один или несколько) для целей конфиденциальности.Port ImageMagick команды для RMagick

Вот мой Баш скрипт (script.sh), который работает очень хорошо с помощью команды convert:

convert invoice.png -scale 10% -scale 1000% pixelated.png 
convert invoice.png -gamma 0 -fill white -draw "rectangle 35, 110, 215, 250" mask.png 
convert invoice.png pixelated.png mask.png -composite result.png 

Теперь я хочу, чтобы создать версию Ruby, этот сценарий с помощью ImageMagick. Вот что у меня есть сейчас:

require 'rmagick' 

# pixelate_areas('invoice.png', [ [ x1, y1, width, height ] ]) 
def pixelate_areas(image_path, areas) 
    image  = Magick::Image::read(image_path).first 
    pixelated = image.scale(0.1).scale(10) 
    mask  = Magick::Image.new(image.columns, image.rows) { self.background_color = '#000' } 

    areas.each do |coordinates| 
    area = Magick::Image.new(coordinates[2], coordinates[3]) { self.background_color = '#fff' } 
    mask.composite!(area, coordinates[0], coordinates[1], Magick::OverCompositeOp) 
    end 

    # Now, how can I merge my 3 images? 
    # I need to extract the part of pixelated that overlap with the white part of the mask (everything else must be transparent). 
    # Then I have to superpose the resulting image to the original (it's the easy part). 
end 

Как вы можете видеть, я застрял на последнем шаге. Какую операцию нужно делать с my original picture, my pixelated picture и my mask для того, чтобы иметь this result?

Как создать изображение только с перекрытием белой части маски и пиксельной картинки. Точно так же, как this one, но с прозрачностью вместо черного?

+0

Журнал ошибок или еще что-то еще? – kiddorails

+0

Ошибка отсутствует. Я просто не знаю, что делать с моим оригинальным изображением, пиксельной версией изображения и маской. Я добавил изображения к сообщению. –

ответ

2

Во-первых, почему вы переносите команды в RMagick, когда у вас есть что-то, что уже работает? Версия bash коротка и понятна. Если это всего лишь часть большого скрипта, который вы портируете, не бойтесь system().

Это говорит о том, что я придерживаюсь того, что вы пытаетесь сделать более простым способом.

require 'RMagick' 

def pixelate_area(image_path, x1, y1, x2, y2) 
    image   = Magick::Image::read(image_path).first 
    sensitive_area = image.crop(x1, y1, x2 - x1, y2 - y1).scale(0.1).scale(10) 

    image.composite!(sensitive_area, x1, y1, Magick::AtopCompositeOp) 
    image.write('result.png') { self.depth = image.depth } 
end 

Это то, кажется, сделать то же самое, что и исходный Баш команды:

pixelate_area('invoice.png', 35, 110, 215, 250) 

Так это выглядит, как вы хотите обрабатывать несколько областей, чтобы размыть, вот версия, которая принимает массив областей (каждый как [x1, y1, x2, y2]):

def pixelate_areas(image_path, areas) 
    image = Magick::Image::read(image_path).first 

    areas.each do |area| 
    x1, y1, x2, y2 = area 

    sensitive_area = image.crop(x1, y1, x2 - x1, y2 - y1).scale(0.1).scale(10) 
    image.composite!(sensitive_area, x1, y1, Magick::AtopCompositeOp) 
    end 

    image.write('result.png') { self.depth = image.depth } 
end 
+0

Спасибо Даршан, я попробую. Причина, по которой я хочу преобразовать ее в Rmagick, заключается в том, что я буду хранить временные файлы в ОЗУ, чтобы избежать конфликта между несколькими процессами. Я считаю, что я мог бы предотвратить использование случайного каталога для каждого преобразования, но он еще проще в ОЗУ. –

+0

@RomainTribes 'mktemp' полезен для избежания конфликтов имен в таких ситуациях. Не то, чтобы я действительно рекомендовал придерживаться сценария оболочки; Я думаю, что версия Ruby более гибкая и удобная в работе. Я просто хотел убедиться, что вы знаете, что у вас есть возможность просто выложить свои существующие рабочие команды. Это часто бывает просто и вполне достаточно. –

+0

@RomainTribes как в стороне: вы можете использовать stdin и stdout с 'convert', чтобы избежать временных файлов из команд оболочки, например. 'convert -rotate 90 - png: fd: 1', эта команда будет вращать все, что вы передаете stdin (первый из них' -' достигает этого), и выводит его как png в stdout (это делает png: fd: 1) , –

Смежные вопросы