Vips - 在 Ruby 调整大小后在图像顶部添加文本
Vips - add text on top of image, after resize in 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]);
你的例子看起来像 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 = shadow_mask.gaussblur(blur_radius / 2) if blur_radius > 0.1
# 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
制作:
我正在使用 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]);
你的例子看起来像 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 = shadow_mask.gaussblur(blur_radius / 2) if blur_radius > 0.1
# 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
制作: