如何在红宝石VIP中实现BW负值

时间:2018-07-19 20:00:10

标签: ruby vips

我有一个png,上面有一个不规则形状的对象的轮廓,我想把它变成一个蒙版。我需要用黑色填充内部,然后交换黑色和白色。它是8位灰度,仅具有0和255的值。

enter image description here

我不能填充外部,而使内部保持白色,因为轮廓本身必须包含在正区域中。 (假设已经定义了黑色,白色和红色的数组值。)

    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)

有人知道更优雅的解决方案吗?感谢您的指导。

1 个答案:

答案 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

做到这一点:

enter image description here

(边缘都是螺丝钉-对不起,您的示例在我拿到它时就已经消除了锯齿)