gpt4 book ai didi

ruby - 将 ImageMagick 命令移植到 RMagick

转载 作者:太空宇宙 更新时间:2023-11-03 16:07:23 25 4
gpt4 key购买 nike

我正在使用 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

如您所见,我卡在了最后一步。 my original picture需要做什么操作, my pixelated picturemy mask为了拥有this result

我怎样才能只用蒙版的白色部分和像素化图片的重叠来构建图像。就像this one但透明而不是黑色?

最佳答案

首先,当您已经有了一些可以工作的东西时,为什么要将命令移植到 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

关于ruby - 将 ImageMagick 命令移植到 RMagick,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10737382/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com