如何将文本准确地转换为(多个)图像?
How to convert text to (mutiple) images exactly?
我正在尝试将内容、图像、文本和 link 的页面转换为纯图像,如果不是因为 link 必须保持不变(仍然有效)(我考虑过将 links 转换为硬文本以便可以阅读,但这会改变内容布局的方式)。
文本和图像都将使用 Inconsolata,因为它是一个 "Monospaced font" 这允许我们假设每行将有 66 个字符,前提是字体设置为 18px 并且最大容器(div) 是 595px.
我的计划是计算字符数并获取创建图像的大小和 "cutting up the links" 相关问题:How to count characters on a single html line with PHP。
我正在谈论的一个小例子是像下面这样转换文本(假装它是当前文本):
并使用 PHP 或任何可以快速完成工作的网络语言,找出 link(s) 的位置并创建允许新图像版本包含工作 links,在外观和功能上与文本版本完全相同 (links)。
您是否考虑过使用图像地图?使用图像映射,您可以在图像中定义可点击的热点。这样就不需要将图像切割成多个。 link 坐标的计算应该可以按照您在问题中详述的方式进行。只要字体是等宽的(参考halfer的评论)
我会将 link 背景和前景色更改为您的图像中不存在的颜色,并使用 webkit2png
呈现页面。然后使用ImageMagick
找到与您的link颜色对应的颜色块来制作图像映射。
所以,具体来说,假设您更改 HTML 以将 link 的前景色和背景色设置为红色 (#ff0000),这样您的 HTML 看起来像像这样:
<p>
A link to Google follows:
<a style="color:#ff0000;background:#ff0000" href="www.google.com">Google</a> - a link to Google.
</p>
然后你做
webkit2png a.html
它给你一个像这样的 PNG 文件:
然后使用 ImageMagick
将所有非红色的内容着色为黑色,如下所示:
convert fileUsersmarktmpahtml-full.png -colorspace RGB -fill black +opaque "#ff0000" x.png
然后你告诉 ImageMagick trim 背景,只留下红色块,然后用 identify
查看它的坐标,你可以看到 link 在哪里得到图像地图的坐标。
convert out.png -trim y.png
identify y.png
y.png PNG 47x18 800x600+176+16 8-bit sRGB 2c 3.18KB 0.000u 0:00.000
您可以看到红色块在图像中的偏移量为 +176+16。
您可能希望一次执行一个 link,然后重新渲染,或者多次 link。如果你做多个 links,要么问另一个关于在图像中找到多个斑点的问题,要么搜索其他答案(由我),其中包含单词 connected-components
。例如,如果您在选择未使用的颜色或找到多个斑点时遇到困难,只需问另一个问题 - 它们是免费的:-)
如果您有多个 link,更像这样:
<!DOCTYPE html>
<html>
<body>
<p>Here comes a link...
<a style="color:#ff0000;background:#ff0000" href="www.google.com">Google</a> - a link to Google.</p>
<p>And there will be another (longer) one along shortly...
<a style="color:#ff0000;background:#ff0000" href="www.google.com">Google, but longer</a> - a link to Google.</p>
</body>
</html>
你 运行 webkit2png
如上,然后这样分析:
convert out-full.png -colorspace RGB -fuzz 10% \
-fill black +opaque red \
-fill white -opaque red \
-define connected-components:verbose=true \
-define connected-components:area-threshold=100 \
-connected-components 4 -auto-level \
output.png
输出
Objects (id: bounding-box centroid area mean-color):
0: 800x600+0+0 399.8,301.1 476976 rgba(0,0,0,1)
2: 121x18+357+50 417.0,58.5 2178 rgba(255,255,255,1)
1: 47x18+140+16 163.0,24.5 846 rgba(255,255,255,1)
现在可以看到第二行和第三行的link对应的blobs
了。您可以像这样使用 ImageMagick 的 crop
工具从图像中裁剪那些和两边的片段:
convert input.png -crop 121x18+357+50 firstLink.png
convert input.png -crop 47x18+140+16 secondLink.png
好吧,看来您所做的不仅仅是转换文本,还包括转换 HTML(可能只是文本 HTML),因为您有能力拥有 link。并且由于您正在谈论具有宽度的 div ,因此您还需要执行自动换行(这本身实际上比听起来更难)。当您开始接触类似的东西时,您将开始越来越多地关注 HTML 解析器。
图像映射不够吗?
当 link 跨越多行时,您打算做什么?或非英语语言(有些语言是从右到左而不是从左到右阅读的)?
图像映射是我的初步选择,如果不能接受,那么我会建议从 PHP 转移到其他语言(我会推荐 Java)。
您能否提供更多有关您试图整合的更广泛项目的详细信息?
我正在尝试将内容、图像、文本和 link 的页面转换为纯图像,如果不是因为 link 必须保持不变(仍然有效)(我考虑过将 links 转换为硬文本以便可以阅读,但这会改变内容布局的方式)。
文本和图像都将使用 Inconsolata,因为它是一个 "Monospaced font" 这允许我们假设每行将有 66 个字符,前提是字体设置为 18px 并且最大容器(div) 是 595px.
我的计划是计算字符数并获取创建图像的大小和 "cutting up the links" 相关问题:How to count characters on a single html line with PHP。
我正在谈论的一个小例子是像下面这样转换文本(假装它是当前文本):
并使用 PHP 或任何可以快速完成工作的网络语言,找出 link(s) 的位置并创建允许新图像版本包含工作 links,在外观和功能上与文本版本完全相同 (links)。
您是否考虑过使用图像地图?使用图像映射,您可以在图像中定义可点击的热点。这样就不需要将图像切割成多个。 link 坐标的计算应该可以按照您在问题中详述的方式进行。只要字体是等宽的(参考halfer的评论)
我会将 link 背景和前景色更改为您的图像中不存在的颜色,并使用 webkit2png
呈现页面。然后使用ImageMagick
找到与您的link颜色对应的颜色块来制作图像映射。
所以,具体来说,假设您更改 HTML 以将 link 的前景色和背景色设置为红色 (#ff0000),这样您的 HTML 看起来像像这样:
<p>
A link to Google follows:
<a style="color:#ff0000;background:#ff0000" href="www.google.com">Google</a> - a link to Google.
</p>
然后你做
webkit2png a.html
它给你一个像这样的 PNG 文件:
然后使用 ImageMagick
将所有非红色的内容着色为黑色,如下所示:
convert fileUsersmarktmpahtml-full.png -colorspace RGB -fill black +opaque "#ff0000" x.png
然后你告诉 ImageMagick trim 背景,只留下红色块,然后用 identify
查看它的坐标,你可以看到 link 在哪里得到图像地图的坐标。
convert out.png -trim y.png
identify y.png
y.png PNG 47x18 800x600+176+16 8-bit sRGB 2c 3.18KB 0.000u 0:00.000
您可以看到红色块在图像中的偏移量为 +176+16。
您可能希望一次执行一个 link,然后重新渲染,或者多次 link。如果你做多个 links,要么问另一个关于在图像中找到多个斑点的问题,要么搜索其他答案(由我),其中包含单词 connected-components
。例如,如果您在选择未使用的颜色或找到多个斑点时遇到困难,只需问另一个问题 - 它们是免费的:-)
如果您有多个 link,更像这样:
<!DOCTYPE html>
<html>
<body>
<p>Here comes a link...
<a style="color:#ff0000;background:#ff0000" href="www.google.com">Google</a> - a link to Google.</p>
<p>And there will be another (longer) one along shortly...
<a style="color:#ff0000;background:#ff0000" href="www.google.com">Google, but longer</a> - a link to Google.</p>
</body>
</html>
你 运行 webkit2png
如上,然后这样分析:
convert out-full.png -colorspace RGB -fuzz 10% \
-fill black +opaque red \
-fill white -opaque red \
-define connected-components:verbose=true \
-define connected-components:area-threshold=100 \
-connected-components 4 -auto-level \
output.png
输出
Objects (id: bounding-box centroid area mean-color):
0: 800x600+0+0 399.8,301.1 476976 rgba(0,0,0,1)
2: 121x18+357+50 417.0,58.5 2178 rgba(255,255,255,1)
1: 47x18+140+16 163.0,24.5 846 rgba(255,255,255,1)
现在可以看到第二行和第三行的link对应的blobs
了。您可以像这样使用 ImageMagick 的 crop
工具从图像中裁剪那些和两边的片段:
convert input.png -crop 121x18+357+50 firstLink.png
convert input.png -crop 47x18+140+16 secondLink.png
好吧,看来您所做的不仅仅是转换文本,还包括转换 HTML(可能只是文本 HTML),因为您有能力拥有 link。并且由于您正在谈论具有宽度的 div ,因此您还需要执行自动换行(这本身实际上比听起来更难)。当您开始接触类似的东西时,您将开始越来越多地关注 HTML 解析器。
图像映射不够吗?
当 link 跨越多行时,您打算做什么?或非英语语言(有些语言是从右到左而不是从左到右阅读的)?
图像映射是我的初步选择,如果不能接受,那么我会建议从 PHP 转移到其他语言(我会推荐 Java)。
您能否提供更多有关您试图整合的更广泛项目的详细信息?