首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调整VIPS中的对比度与匹配的CSS过滤器相同

调整VIPS中的对比度与匹配的CSS过滤器相同
EN

Stack Overflow用户
提问于 2022-09-04 17:19:00
回答 1查看 68关注 0票数 0

我有一个网页应用程序,用户可以使用过滤对比度来修改图像:filter: contrast(1.1),我想在贵宾中复制。(用Ruby)

虽然我还没有在贵宾中找到任何关于如何做到这一点的信息。我看到Vips实现了CLAHE算法https://github.com/libvips/libvips/issues/1576,但是它对我来说太过分了,可能不会返回类似于CSS过滤器的相同的对比度调整。

此外,我检查了这个线程的调整例子,但我找不到任何对比调整:https://github.com/libvips/libvips/issues/59 .

此外,我最后在W3解释页面上,他们清晰地解释了用于对比度调整的方法:https://www.w3.org/TR/filter-effects/#contrastEquivalent

代码语言:javascript
复制
<filter id="contrast">
  <feComponentTransfer>
      <feFuncR type="linear" slope="[amount]" intercept="-(0.5 * [amount]) + 0.5"/>
      <feFuncG type="linear" slope="[amount]" intercept="-(0.5 * [amount]) + 0.5"/>
      <feFuncB type="linear" slope="[amount]" intercept="-(0.5 * [amount]) + 0.5"/>
  </feComponentTransfer>
</filter>

绝对棒极了。

现在我知道他们使用线性字体(我知道如何在Vips中利用它),并且他们停留在RGB颜色空间中。我知道斜率只是一个正在进行的乘法。这很容易做到,因为我只需要传递一个数组作为Vips线性函数的第一个参数。方法

虽然我基本上不知道什么是拦截和如果贵宾线性功能提供类似的工具。

有什么想法吗?

编辑编辑

好吧,似乎W3做了一些有趣的事情。

将CSS筛选器contrast与贵宾完全匹配的解决方案是:

代码语言:javascript
复制
divider = 256
contrast = 1.5
intercept = 0.5-(contrast*0.5)
im = Vips::Image.new_from_file "pic.jpg", access: :sequential
im = ((im * contrast / divider) + intercept)*divider
im.write_to_file "output.jpg"
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-09-04 20:50:28

是的,只要乘一乘就能改变对比。来自CSS文档linear只计算:

代码语言:javascript
复制
C' = C * slope + intercept

所以在红宝石里你可以写:

代码语言:javascript
复制
#!/usr/bin/ruby

require 'vips'

contrast = 1.1

image = Vips::Image.new_from_file ARGV[0], access: :sequential
image = image.colourspace("scrgb")
image = image * contrast - (0.5 * contrast - 0.5)
image = image.colourspace("srgb")
image.write_to_file ARGV[1]

scRGB是sRGB,但是黑色到白色的线性浮点数在0-1范围内.

您可以使用linear而不是操作符重载,这样会稍微快一些。

代码语言:javascript
复制
image = image.linear contrast, -0.5 * contrast - 0.5
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73601395

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档