如何使用 python 的 PIL 以一定角度绘制文本?
使用 Python 我希望能够使用 PIL 以不同角度绘制文本。
例如,假设您正在钟面周围绘制数字。 数字 3 将按预期显示,而 12 将逆时针旋转 90 度绘制。
因此,我需要能够从许多不同的角度绘制许多不同的弦。
Using Python I want to be able to draw text at different angles using PIL.
For example, imagine you were drawing the number around the face of a clock. The number 3 would appear as expected whereas 12 would we drawn rotated counter-clockwise 90 degrees.
Therefore, I need to be able to draw many different strings at many different angles.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
将文本绘制到临时空白图像中,旋转该图像,然后将其粘贴到原始图像上。 您可以将这些步骤包装在一个函数中。 祝你好运,找出要使用的确切坐标——我冰冷的大脑现在还不能胜任。
该演示在图像上倾斜书写黄色文本:
Draw text into a temporary blank image, rotate that, then paste that onto the original image. You could wrap up the steps in a function. Good luck figuring out the exact coordinates to use - my cold-fogged brain isn't up to it right now.
This demo writes yellow text on a slant over an image:
在创建 Image 对象之前了解文本的像素大小也很有用。 我在绘制图表时使用了这样的代码。 然后我就没有遇到任何问题,例如数据标签的对齐(图像与文本一样大)。
本页已描述了将两个图像连接在一起的其余部分。
当你旋转“不规则”的角度时,你必须稍微改进一下这段代码。 它实际上适用于 90、180、270...
It's also usefull to know our text's size in pixels before we create an Image object. I used such code when drawing graphs. Then I got no problems e.g. with alignment of data labels (the image is exactly as big as the text).
The rest of joining the two images together is already described on this page.
When you rotate by an "unregular" angle, you have to improve this code a little bit. It actually works for 90, 180, 270...
这是一个受答案启发的工作版本,但它无需打开或保存图像即可工作。
这两个图像具有彩色背景和不同于零的 Alpha 通道,以显示正在发生的情况。 将两个 Alpha 通道从 92 更改为 0 将使它们完全透明。
Here is a working version, inspired by the answer, but it works without opening or saving images.
The two images have colored background and alpha channel different from zero to show what's going on. Changing the two alpha channels from 92 to 0 will make them completely transparent.
前面的答案绘制成一个新图像,旋转它,然后将其绘制回源图像。 这会留下文本痕迹。 我们不希望这样。
这是一个版本,它会裁剪将要绘制的源图像区域,旋转它,绘制到其中,然后将其旋转回来。 这意味着我们可以立即在最终表面上绘制,而不必求助于掩模。
添加支持其他角度、颜色等很简单。
The previous answers draw into a new image, rotate it, and draw it back into the source image. This leaves text artifacts. We don't want that.
Here is a version that instead crops the area of the source image that will be drawn onto, rotates it, draws into that, and rotates it back. This means that we draw onto the final surface immediately, without having to resort to masks.
Supporting other angles, colors etc is trivial to add.
这是对角加水印的更完整示例。 通过计算对角线角度和字体大小来处理任意图像比例、大小和文本长度。
它位于 Colab https://colab.research.google.com/drive /1ERl7PiX6xKy5H9EEMulBKPgglF6euCNA?usp=sharing 您应该向 Colab 提供示例图像。
Here's a fuller example of watermarking diagonally. Handles arbitrary image ratios, sizes and text lengths by calculating the angle of the diagonal and font size.
Here it is in a colab https://colab.research.google.com/drive/1ERl7PiX6xKy5H9EEMulBKPgglF6euCNA?usp=sharing you should provide an example image to the colab.
我并不是说这会很容易,或者这个解决方案一定适合您,但请查看此处的文档:
http://effbot.org/imagingbook/pil-index.htm
特别要注意 Image、ImageDraw 和 ImageFont 模块。
这是一个可以帮助您的示例:
为了做你真正想做的事情,你可能需要制作一堆单独的正确旋转的文本图像,然后通过一些更奇特的操作将它们组合在一起。 毕竟它看起来可能仍然不太好。 例如,我不确定如何处理抗锯齿等,但这可能不好。 祝你好运,如果有人有更简单的方法,我也有兴趣知道。
I'm not saying this is going to be easy, or that this solution will necessarily be perfect for you, but look at the documentation here:
http://effbot.org/imagingbook/pil-index.htm
and especially pay attention to the Image, ImageDraw, and ImageFont modules.
Here's an example to help you out:
To do what you really want you may need to make a bunch of separate correctly rotated text images and then compose them all together with some more fancy manipulation. And after all that it still may not look great. I'm not sure how antialiasing and such is handled for instance, but it might not be good. Good luck, and if anyone has an easier way, I'd be interested to know as well.
如果您使用 aggdraw,则可以使用 settransform() 来旋转文本。 由于 effbot.org 处于离线状态,因此它有点没有记录。
If you a using aggdraw, you can use settransform() to rotate the text. It's a bit undocumented, since effbot.org is offline.
Pillow 还支持 Image.transpose(method) 将图像旋转 90、180 或 270 度,并相应地校正尺寸。 但是,它不适用于其他角度:
Pillow also supports Image.transpose(method) to rotate an image 90, 180 or 270 degrees, and corrects the size accordingly. However, it does not work for other angles: