这个方法效果一般般, 只是”可用”的程度, 近似于长微博(changweibo.com)的效果…
字体方面, 我选用了YaHeiYt等宽字体(来源: http://yutuo5.blog.163.com/blog/static/300846782010019113537523/), 效果一般, 具体见下图:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
def text2png(text): # Configurations: adtexts = [u'---------------', u'广告太多是不对的!'] textcolor = "#000000" adcolor = "#FF0000" # Don't touch the code below import Image, ImageDraw, ImageFont, uuid # Build rich text for ads ad = [] for adtext in adtexts: ad += [(adtext.encode('gbk'), adcolor)] # Wrap line for text # Special treated Chinese characters # Workaround By Felix Yan - 20110508 wraptext = [""] l = 0 for i in text.decode('utf-8'): fi = i.encode('gbk') delta = len(fi) if i == '\n': wraptext += [""] l = 0 elif l + delta > 40: wraptext += [fi] l = delta else: wraptext[-1] += fi l += delta # Format wrapped lines to rich text wrap = [(text, textcolor) for text in wraptext] wrap += ad # Draw picture i = Image.new("RGB", (330, len(wrap) * 17 + 5), "#FFFFFF") d = ImageDraw.Draw(i) f = ImageFont.truetype("YaHeiYt.ttf", 16) for num, (text, color) in enumerate(wrap): d.text((2, 17 * num + 1), text.decode('gbk'), font = f, fill = color) # Write result to a temp file filename = uuid.uuid4().hex + ".png" with open("/tmp/" + filename, "wb") as s: i.save(s, "PNG") return "/tmp/" + filename |
你没有打 cairo-ubuntu 补丁吧。
顺便你打上补丁之后再次渲染,对比一下,贴到哪个文章里面,证明 Ubuntu 的字体渲染真的有奇效。
话说我一般都是有两种解决方法,一是写成HTML然后截图(我一般常用),二是写成SVG再转PNG。
这个和cairo-ubuntu没有任何关系吧, 只是生成图片…
这个可以用于百度贴吧这么沃艹的地方用
嗯=.=必须的
赫然鲁迅的 一件小事 .
嗯= =|||||随便找的一段示例文本…
代码写的不好啊,decode就好了,为嘛要encode为gbk?list用append添加就可以了,干嘛要每次新创建个list然后做加法?
因为encode为gbk后用len才符合等宽字体的全半角字符宽度比例. 此外, 我这里list用append和用我这样的写法代码量有区别吗? 我只是习惯用加法而已…
代码量没区别,但内存上是有区别的,你的方法相当于新建了一个list,然后向前者添加了这个list的所有元素。而append是直接添加。
你应该用textsize来获取每个字符的宽度,然后自己计算来控制是否转行,而不是利用等宽字体这样兼容性不好的hack。
唔..这样啊…
我对获取每个字符的宽度需要多少内存和时间很感兴趣…
关于内存,可以看http://stackoverflow.com/questions/110259/python-memory-profiler
关于时间,自带的cProfile,Hotshot,timeit都可以,pypi上也有。
找了半天这才是原创……list用加法的确不够好。我看了代码后,也在想为什么用加法.特别是当文本数量大了之后。另外再一点注意事项……对英文的支持不好……我一开始用unicode,没有转为gbk。感觉没有必要。有英文行的话,会特别短……
所以才要像我说的那样,用textsize获取文字宽度,这样啥鸟语都能自动适应。
嗯, 各位大大们 patches welcome 😛
PS: 这个代码我已经没有在用了, 我现在是用 HTML + phantomjs 的方式实现富文本转换为图片的, 效果比这样硬写好多了 😛
唔……为啥不用YaHei.Consolas.Hybrid.ttf
因为我不知道有这个字体…嗯..
这个字体也就是码code时候有人用的多些,这种情景要hybird干嘛 =/=
不错的小软件,把自己的原创文章这样一转就ok,防抄袭,有点小邪恶啊!哈哈!
如果是这个目的的话, 还需要加些处理的=.=比如粗体 换行 字号 …
有空的话就把这些都加上,把这个小软件做的完美点,哈哈!
现在没空=.=哈哈
好吧,我是来沙发的!霍霍
好久不见呀 XD