img = Image.open(fp) AttributeError: 类Image没有属性'open'

31

我想把图片放进PDF文件中。下面是我的代码...

import sys
import xlrd
from PIL import Image
import ImageEnhance
from reportlab.platypus import *
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.rl_config import defaultPageSize
PAGE_HEIGHT=defaultPageSize[1]

styles = getSampleStyleSheet()

Title = "Integrating Diverse Data Sources with Gadfly 2"

Author = "Aaron Watters"

URL = "http://www.chordate.com/"

email = "arw@ifu.net"

from reportlab.lib.units import inch

pageinfo = "%s / %s / %s" % (Author, email, Title)

def myFirstPage(canvas, doc):
    canvas.saveState()
    #canvas.setStrokeColorRGB(1,0,0)
    #canvas.setLineWidth(5)
    #canvas.line(66,72,66,PAGE_HEIGHT-72)
    canvas.setFont('Times-Bold',16)
    canvas.drawString(108, PAGE_HEIGHT-108, Title)
    canvas.setFont('Times-Roman',9)
    canvas.drawString(inch, 0.75 * inch, "First Page / %s" % pageinfo)
    canvas.restoreState()

def myLaterPages(canvas, doc):
    #canvas.drawImage("snkanim.gif", 36, 36)
    canvas.saveState()
    #canvas.setStrokeColorRGB(1,0,0)
    #canvas.setLineWidth(5)
    #canvas.line(66,72,66,PAGE_HEIGHT-72)
    canvas.setFont('Times-Roman',9)
    canvas.drawString(inch, 0.75 * inch, "Page %d %s" % (doc.page, pageinfo))
    canvas.restoreState()

def go():
    Elements.insert(0,Spacer(0,inch))
    doc = SimpleDocTemplate('ss.pdf')
    doc.build(Elements,onFirstPage=myFirstPage, onLaterPages=myLaterPages)

Elements = []

HeaderStyle = styles["Heading1"] # XXXX

def header(txt, style=HeaderStyle, klass=Paragraph, sep=0.3):
    s = Spacer(0.2*inch, sep*inch)
    Elements.append(s)
    para = klass(txt, style)
    Elements.append(para)

ParaStyle = styles["Normal"]

def p(txt):
    return header(txt, style=ParaStyle, sep=0.1)

def open_excel(file= 'exc.xls'):
    try:
        data = xlrd.open_workbook(file)
        return data
    except Exception,e:
        print str(e)

#pre = p # XXX

PreStyle = styles["Code"]

def pre(txt):
    s = Spacer(0.1*inch, 0.1*inch)
    Elements.append(s)
    p = Preformatted(txt, PreStyle)
    Elements.append(p)
p("""\
Relational databases manipulate and store persistent
table structures called relations, such as the following
three tables""")

fp = open("/pdf-ex/downloadwin7.png","rb")
img = Image.open(fp)
img.show()
# HACK
Elements.append(PageBreak())


go()

请在此告诉我们您遇到的问题,并提供最少量的代码以演示问题。 - kindall
你不能通过提供所有这些东西,特别是那些不常见的模块来寻求帮助!我只保留了PIL Image和打开、显示图像的两个语句,没有问题。从我的经验来看,当在其他模块之前导入PIL Image时(例如Tkinter),会出现“class Image has no attribute 'open'”错误(可能存在一些冲突)。尝试在最后导入它。 - Apostolos
3个回答

72

你遇到了一个命名空间冲突。你的其中一条导入语句使用某个名为Image的类屏蔽了PIL.Image(它是一个模块而不是一个类)。

替代方法是...

from PIL import Image
尝试...
import PIL.Image

然后在您的代码中稍后...

fp = open("/pdf-ex/downloadwin7.png","rb")
img = PIL.Image.open(fp)
img.show()

当处理大量导入时,要注意命名空间冲突。我通常非常谨慎地使用from some_module import *语句。

祝你的项目顺利,编码愉快。


感谢您的评论。运行程序没有问题,但是图片无法打开。 - wangling
@王玲,我提供的解决方案解决了你帖子标题描述的问题。至于将图像添加到.pdf文件的整体问题,我无法回答,因为需要回答的信息远远超出了帖子中所呈现的内容。然而,从我对reportlab的粗略了解来看,我认为你正在正确的轨道上。继续努力,很快你就会解决它。 - parselmouth
当我在主文件中导入from PIL import Image, ImageTk,并在被导入到主文件的次要文件中导入from PIL import Image时,我遇到了这个问题。在各自的文件中将导入指定为import PIL.Image, PIL.ImageTkimport PIL.Image解决了这个答案中描述的问题。由于我不知道在两个文件中导入相同的类/模块可能会导致命名空间冲突,因此进行了注释。 - Dbercules

10

我在单个文件中遇到了与 TKInter 相似的问题:

我进行了更改:

from PIL import ImageTk, Image
from tkinter import *

to:

from tkinter import *
from PIL import ImageTk, Image

问题得到解决。


0

这是我能找到的唯一解决方案。

try:
    from PIL import Image
except ImportError:
    import Image

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接