Vips-在Ruby中调整大小后,在图像顶部添加文本

我正在使用Vips通过Shrine调整图像大小,希望可以使用Vips库在图像顶部合并一层文本。

ImageProcessing::Vips.source(image).resize_to_fill!(width,height)

这段代码很好用,如何在resize_to_fill之后添加一层文本?

目标是用白色文字写“ Hello world”,并在图像的中心带有CSS文字阴影。

我尝试编写类似这样的内容,但到目前为止我只得到错误提示:

Vips\Image::text('Hello world!',['font' => 'sans 120','width' => $image->width - 100]);
iCMS 回答:Vips-在Ruby中调整大小后,在图像顶部添加文本

您的示例看起来像PHP –在Ruby中,您将编写如下内容:

text = Vips::Image.text 'Hello world!',font: 'sans 120',width: image.width - 100

我为您制作了一个演示

#!/usr/bin/ruby

require "vips"

image = Vips::Image.new_from_file ARGV[0],access: :sequential

text_colour = [255,128,128]
shadow_colour = [128,255,128]
h_shadow = 2
v_shadow = 5
blur_radius = 10

# position to render the top-left of the text
text_left = 100
text_top = 200

# render some text ... this will make a one-band uchar image,with 0 
# for black,255 for white and intermediate values for anti-aliasing
text_mask = Vips::Image.text "Hello world!",dpi: 300

# we need to enlarge the text mask before we blur so that the soft edges 
# don't get clipped
shadow_mask = text_mask.embed(blur_radius,blur_radius,text_mask.width + 2 * blur_radius,text_mask.height + 2 * blur_radius)

# gaussblur() takes sigma as a parameter -- approximate as radius / 2
shadow_mask = blur_radius > 0.1 ? 
                shadow_mask.gaussblur(blur_radius / 2) : shadow_mask

# make an RGB image the size of the text mask with each pixel set to the
# constant,then attach the text mask as the alpha
rgb = text_mask.new_from_image(text_colour).copy(interpretation: "srgb")
text = rgb.bandjoin(text_mask)

rgb = shadow_mask.new_from_image(shadow_colour).copy(interpretation: "srgb")
shadow = rgb.bandjoin(shadow_mask)

# composite the three layers together
image = image.composite([shadow,text],"over",x: [text_left + h_shadow,text_left],y: [text_top + v_shadow,text_top]) 

image.write_to_file ARGV[1]

像这样运行:

$ ./try319.rb ~/pics/PNG_transparency_demonstration_1.png x.png

制作:

enter image description here

本文链接:https://www.f2er.com/1548466.html

大家都在问