用PIL加载png图片的问题



    工作中需要对一幅PNG的16位灰度图片进行处理,因为用于处理的程序很多天以前用Python和PIL写好了,只不过有些参数因为时间太久记不清了。连蒙带猜的凑齐了参数,运行时却发现,运行过程中读png文件并复制的时候总是报错。找了一下,很快发现原来是文件格式不太合适,用的是16位灰度图,赶快到PIL的文档里面去查,这一查心里凉了半截,文档里面所说的PIL支持的文件格式和类型没有16位的,而且也没有合适的可以转换的格式:

    摘自“Python Imaging Library Overview,PIL1.1.3”
    正在着急的时候,忽然想起PIL也是开源的,赶紧到安装目录下看看。很快在里面找到了png文件的解析代码(PngImagePlugin.py),里面关于文件格式的定义比文档里可丰富多了:
_MODES = {
    # supported bits/color combinations, and corresponding modes/rawmodes
    (1, 0): ("1", "1"),
    (2, 0): ("L", "L;2"),
    (4, 0): ("L", "L;4"),
    (8, 0): ("L", "L"),
    (16,0): ("I", "I;16B"),
    (8, 2): ("RGB", "RGB"),
    (16,2): ("RGB", "RGB;16B"),
    (1, 3): ("P", "P;1"),
    (2, 3): ("P", "P;2"),
    (4, 3): ("P", "P;4"),
    (8, 3): ("P", "P"),
    (8, 4): ("LA", "LA"),
    (16,4): ("RGBA", "LA;16B"), # LA;16B->LA not yet available
    (8, 6): ("RGBA", "RGBA"),
    (16,6): ("RGBA", "RGBA;16B"),
}
不光有16位灰度图的支持,还可以支持RGB16位的图像,估计连作HDR都够了,哈哈。用的时候也非常简单,读取文件是可以自动识别的,而在创建文件时,只要声明其模式(mode)为
"I;16B"即可。

还有一点需要小心,PIL所处理的16位灰度图中,图像数据必须要作为图片的背景,而不是其它的图层来保存,否则PIL会将该图以RGB8的格式读取和处理。
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 使用tkinter加载png、jpg等图片可以通过PIL库来实现。具体步骤如下: 1. 安装PIL库:在命令行中输入pip install pillow进行安装。 2. 导入PIL库:在Python代码中导入PIL库,如下所示: from PIL import Image, ImageTk 3. 打开图片:使用Image.open()方法打开图片,如下所示: image = Image.open("image.png") 4. 将图片转换为Tkinter可用的格式:使用ImageTk.PhotoImage()方法将图片转换为Tkinter可用的格式,如下所示: photo = ImageTk.PhotoImage(image) 5. 在Tkinter窗口中显示图片:使用Label组件将图片显示在Tkinter窗口中,如下所示: label = tk.Label(root, image=photo) label.pack() 其中,root为Tkinter窗口对象。 ### 回答2: 可以使用tkinter中的PhotoImage模块加载并显示png、jpg等格式的图片。 首先,需要导入tkinter模块和PILPython Image Library)模块,如果没有安装PIL模块,可以使用以下命令进行安装: ``` pip install pillow ``` 然后,可以使用tkinter创建一个窗口,并使用PhotoImage模块加载图片,并将其作为背景或放置在窗口上: ```python import tkinter as tk from PIL import ImageTk, Image # 创建窗口 window = tk.Tk() # 加载图片 image = ImageTk.PhotoImage(file="image.png") # 加载png格式的图片 # image = ImageTk.PhotoImage(file="image.jpg") # 加载jpg格式的图片 # 将图片作为背景 background_label = tk.Label(window, image=image) background_label.place(x=0, y=0, relwidth=1, relheight=1) # 将图片放置在窗口上 image_label = tk.Label(window, image=image) image_label.pack() # 运行窗口 window.mainloop() ``` 通过以上代码,可以成功使用tkinter加载并显示png、jpg等图片。 ### 回答3: 在使用tkinter加载png、jpg等图片时,我们可以使用PIL库(Python Imaging Library)来实现。 首先,我们需要安装PIL库。可以使用pip命令来安装,命令如下: pip install pillow 然后,我们需要导入相关的模块,代码如下: from PIL import Image, ImageTk import tkinter as tk 接下来,我们需要创建一个Tk窗口,代码如下: root = tk.Tk() 然后,我们需要打开图片文件,可以使用PIL库中的Image.open()函数来打开图片,代码如下: image = Image.open("image.png") 接着,我们需要将图片转换为Tkinter的PhotoImage类型,以便在Tkinter窗口中显示图片,代码如下: photo = ImageTk.PhotoImage(image) 然后,我们需要创建一个Label以显示图片,代码如下: label = tk.Label(root, image=photo) 最后,我们需要将Label显示在Tkinter窗口中,代码如下: label.pack() 最后,我们需要调用Tkinter的mainloop()函数来进入消息循环,以便显示窗口和图片,代码如下: root.mainloop() 通过以上步骤,我们就可以在Tkinter窗口中成功加载并显示png、jpg等图片了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值