在Elixir中定位文本图像中方括号坐标用于图像合成
获取文本图像中方括号的坐标以用于图像合成
方法一:直接从文本布局数据中提取(推荐)
Image.Text.simple_text!本质是基于文本布局生成图像,你可以先调用Image.Text.layout_text/2获取完整的文本布局信息,其中包含每个字符的精确位置和尺寸:
# 获取文本布局详情 layout = Image.Text.layout_text( "This is some text with an [icon] surrounded by square brackets", [width: 500, height: 100, font_size: 0, text_fill_color: :black] ) # 筛选出所有方括号的坐标与尺寸 bracket_info = Enum.filter(layout.glyphs, fn glyph -> glyph.character in ["[", "]"] end) |> Enum.map(fn glyph -> %{x: glyph.x, y: glyph.y, width: glyph.width, height: glyph.height} end)
返回的bracket_info列表中,每个元素包含对应方括号的左上角坐标x/y,以及字符的宽高。这种方法完全基于文本布局计算,精度最高,不会受图像渲染干扰。
方法二:通过图像像素分析定位(备选)
如果已经生成了图像,也可以通过检测像素区域来定位方括号,但需要根据实际背景/文本颜色调整匹配规则,精度略低于布局法:
# 将图像转换为像素二进制数据 {pixels, width, height} = Image.to_binary(image_of_text, :rgba) # 查找所有黑色文本的像素区域(假设背景为白色,按需调整颜色匹配) text_regions = Image.Pixel.find_regions(pixels, width, height, fn {r, g, b, a} -> r == 0 && g == 0 && b == 0 && a == 255 end) # 根据方括号的宽高比例筛选目标区域 bracket_coords = Enum.filter(text_regions, fn region -> # 方括号的宽度通常远小于高度,可根据实际字体调整比例 region.width < region.height * 0.4 end) |> Enum.map(fn region -> {region.x, region.y} end)
合成图像的示例
拿到坐标后,直接传入Image.compose!/3即可完成合成,如果需要替换方括号,建议调整图标尺寸匹配方括号的大小:
# 假设已准备好要合成的图标图像icon_image Enum.each(bracket_info, fn info -> # 先调整图标尺寸适配方括号 resized_icon = Image.resize!(icon_image, info.width, info.height) # 在对应位置合成图像 image_of_text = Image.compose!(image_of_text, resized_icon, at: {info.x, info.y}) end)
内容的提问来源于stack exchange,提问作者Cody Jennings
相关产品推荐
相关产品推荐

