0

我正在尝试在 jpg 的底部边缘下添加标题 - 文件名。

我有以下 Python 代码:

    import Image, ImageDraw, ImageFont, os, glob

list = glob.glob('*.jpg')

for infile in list:
    print infile
    file, ext = os.path.splitext(infile)
    outname = file + "_test.jpg"
    print outname
    im = Image.open(infile)
    d = ImageDraw.Draw(im)
    f = ImageFont.truetype("Arial.ttf", 16)
    d.text((4,0), file, font=f)
    im.save(outname)

它打印出文件的名称,所以文件就在那里 - 为什么它不能打开它?

该文件存在,但我收到以下错误: 在此处输入图像描述

有没有更简单的方法在图像底部添加标题?

4

3 回答 3

0

该异常 ,Cannot identify image file意味着它能够打开文件,但无法确定它是什么类型的图像。PIL 通过读取前 16 个字节并查看它们是否匹配任何众所周知的幻数来做到这一点。

您能否验证您要读取的文件实际上是 jpeg 吗?

如果是这样,您是如何获得 PIL 的版本的?如果它是在没有 libjpeg(或任何 Windows 等价物)的机器上编译的,它可能不支持 jpeg。有关该问题的可能解决方案,请参阅this other question,尽管我没有要测试的Windows机器。

于 2013-08-30T04:52:04.523 回答
0

“您可以使用字符串(表示文件名)或文件对象作为文件参数。在后一种情况下,文件对象必须实现读取、查找和告诉方法,并以二进制模式打开。”

试试这个:

im = Image.open(open(infile, 'rb'))

或者:

from StringIO import StringIO
im = Image.open(StringIO(infile))
于 2013-08-30T04:56:12.160 回答
0

感谢 Nick 和 Manu 的帮助,为我指明了正确的方向,我制定了一个可行的解决方案:

    import Image, ImageDraw, ImageFont
from PIL import Image
import glob, os
import Tkinter
import ImageTk
import fnmatch

list = glob.glob('*.jpg')

cnt = 0
for infile in list:
    cnt += 1
    print infile
    file, ext = os.path.splitext(infile)
    outname = file + "_test.jpg"
    print outname
    #im = Image.open(infile)
    im = Image.open(open(infile, 'rb'))
    d = ImageDraw.Draw(im)
    f = ImageFont.truetype("c:/windows/fonts/arial.ttf", 200)
    x = 10
    y = 550
    d.text((x, y), str(cnt), font=f)
    im.save(outname)
    print "==========="

请注意,这使用了字体的直接路径,并且我在图像上设置了 x、y 位置。

我还必须使用非常大的字体,因为原始文件是来自相机的非常大的完整图像。

我使用 cnt 作为连续性的字符串 - 原件有多个名称。

我现在需要做的就是找到图像的底部并将字符串放在那里......

于 2013-08-30T20:20:03.230 回答