我有一个png,上面有一个不规则形状的对象的轮廓,我想把它变成一个蒙版。我需要用黑色填充内部,然后交换黑色和白色。它是8位灰度,仅具有0和255的值。
我不能填充外部,而使内部保持白色,因为轮廓本身必须包含在正区域中。 (假设已经定义了黑色,白色和红色的数组值。)
mask = Vips::Image.new_from_file(fl)
mask = mask.draw_flood(black, center_x, center_y, :equal => true) * -1
这将返回全黑栅格。嘘!这是可行的,但是难看且效率低下。
mask = mask.draw_flood(black, center_x, center_y, :equal => true)
mask = mask.draw_flood(red, 0, 0, :equal => true)
mask = mask.draw_flood(white, center_x, center_y, :equal => true)
mask = mask.draw_flood(black, 0, 0, :equal => true)
有人知道更优雅的解决方案吗?感谢您的指导。
答案 0 :(得分:0)
您已经明白了,是fetch(url, {
method: 'POST',
body: $.param(data),
headers:{
'Content-Type': 'application/x-www-form-urlencoded'
}
})
弄乱了您。这将使每个像素* -1成为浮动图像(很明显),因此您的白色区域将变为-255。再次将其另存为PNG时,图像将被投射回uint8,负片将被切掉,您只会看到零。
您确实想要* -1
,但是Ruby不会让您在二进制图像运算符的左侧留下一个数字,因此您需要编写255 - x
。
您可以做得更好:ruby-vips具有x * -1 + 255
,它可以计算(image-format-max-image-pixel)并且不更改数字格式。在这种情况下,这表示(255-x)并保持为uint8。
所以这个:
#invert
做到这一点:
(边缘都是螺丝钉-对不起,您的示例在我拿到它时就已经消除了锯齿)