2

我正在使用 ImageMagick 命令进行图像处理,我想将它们移植到 RMagick。此任务的目标是为了隐私目的拍照并对给定区域(一个或多个)进行像素化。

这是我的 bash 脚本 ( ),使用以下命令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

现在我想使用 ImageMagick 创建这个脚本的 Ruby 版本。这是我现在拥有的:

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

如您所见,我被困在最后一步。为了得到这个结果,我需要对我的原始图片像素化图片蒙版进行什么操作?

如何仅通过蒙版的白色部分和像素化图片的重叠来构建图像。就像这个一样,但透明而不是黑色?

4

1 回答 1

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

这似乎与您原来的 bash 命令一样:

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
于 2012-06-29T09:37:26.327 回答