是否有任何字体或技术可以用于Cairo(通过Ruby绑定)来绘制包含emoji的文本?我读到的所有东西都说“使用Pango进行真实的的文本处理”,但Cairo做了我需要的所有其他事情,所以我希望有一种方法可以避免将其作为依赖项添加。
下面是我正在尝试制作的动态Open Graph图像的简化版本:
require 'cairo'
# Create a new image surface based on recommended OpenGraph dimensions
width = 1_200
height = 630
surface = Cairo::ImageSurface.new(width, height)
# Create a Cairo Context for the surface
cr = Cairo::Context.new(surface)
# Apply a background colour to the whole thing (almost white)
cr.set_source_rgb(0.95, 0.95, 0.95)
cr.paint
# Add a heading
heading = "Hi! 👋"
cr.set_source_rgb(0.31, 0.21, 0.27)
cr.select_font_face("Sans", Cairo::FONT_SLANT_NORMAL, Cairo::FONT_WEIGHT_BOLD)
cr.set_font_size(100.0)
extents = cr.text_extents(heading)
centred_text_left_edge = width / 2 - extents.width / 2
cr.move_to(centred_text_left_edge, 130)
cr.show_text(heading)
# Write the image surface to a PNG file
surface.write_to_png("emoji-test-#{Time.now.strftime('%Y-%m-%dT%H:%M:%S.%L%z')}.png")
不幸的是,emoji被渲染为矩形(在macOS上运行,在其他平台上可能会有所不同):
我可以使用自定义字体吗?或者是否有其他技术可以显示表情符号?
看起来“正确”的选择是使用Pango,但是这个建议仍然适用于Ruby吗?我无法在我的M1 Mac上安装Pango gem,即使我可以,经过大量搜索,我能找到的唯一参考使用Pango与开罗从Ruby是a very old sample script that's no longer included in the Pango distibution。
如果做不到这一点,我想我将不得不将表情符号保存为图像,并将它们绘制到Surface/Context上。这对我来说是可行的,因为我只想使用3个特定的表情符号,但它不能扩展到包括任意的表情符号。
1条答案
按热度按时间bpzcxfmw1#
如果其他人有更好的解决方案,我会很乐意接受另一个答案,但我最终还是回到了一个表情符号的PNG上。读到最后,了解这种方法的缺点。
首先,我保存了一个我想使用的表情符号的96x96像素PNG。
wave.png
)。然后我把它们画在表面上。下面是一个POC:这将生成我的OpenGraph图像,其中包含文本和表情符号:
这种方法的缺点是: