当前位置: 首页 > news >正文

python PIL except: IOError: decoder jpeg not available

今天在Python运行环境的服务器弄一个有关图像处理的程序时报这样的错:

1NameError: global name 'Image' is not defined

import Image 了下,发现原来 Python 并没有自带图像处理库,需要独立安装……查了下,Python常用的图像处理库叫PIL,可以使用 pip 安装,不错~于是在 用virtualenv 里敲入 pip install PIL。

安装很快完成,于是愉悦地刷新,等待程序的通过,结果又报错:

1IOError: decoder jpeg not available

Google了下,发现通过 pip 安装的 PIL 不会安装 jpeg 的解码器……检查了下安装日志,也有这样的说明:

01--------------------------------------------------------------------
02PIL 1.1.7 SETUP SUMMARY
03--------------------------------------------------------------------
04version       1.1.7
05platform      linux2 2.7.5 (default, Sep 18 201309:53:07)
06              [GCC 4.1.2 20080704 (Red Hat 4.1.2-54)]
07--------------------------------------------------------------------
08*** TKINTER support not available
09*** JPEG support not available
10*** ZLIB (PNG/ZIP) support not available
11*** FREETYPE2 support not available
12*** LITTLECMS support not available
13--------------------------------------------------------------------
14To add a missing option, make sure you have the required
15library, and set the corresponding ROOT variable in the
16setup.py script.

JPEG support not available…… jpg都不支持,这是闹哪样……

于是只得手动安装了:

1wget http://effbot.org/downloads/Imaging-1.1.7.tar.gz
2tar xvfz Imaging-1.1.7.tar.gz

下载并解压成功之后,到解压目录,找到 Imaging-1.1.7/setup.py 这个文件,修改下面几行代码(默认TCL_ROOT的设置为NONE,这里要传到系统库的路径才行):

1TCL_ROOT = "/usr/lib64/"
2JPEG_ROOT = "/usr/lib64/"
3ZLIB_ROOT = "/usr/lib64/"
4TIFF_ROOT = "/usr/lib64/"
5FREETYPE_ROOT = "/usr/lib64/"
6LCMS_ROOT = "/usr/lib64/"

再进行安装前的检查:

1python /root/nowamagic_venv/Imaging-1.1.7/setup.py build_ext -i

检查没问题,可以执行安装了:

1python /root/nowamagic_venv/Imaging-1.1.7/setup.py install

安装成功:

01--------------------------------------------------------------------
02PIL 1.1.7 SETUP SUMMARY
03--------------------------------------------------------------------
04version       1.1.7
05platform      linux2 2.7.5 (default, Sep 18 201309:53:07)
06              [GCC 4.1.2 20080704 (Red Hat 4.1.2-54)]
07--------------------------------------------------------------------
08*** TKINTER support not available
09--- JPEG support available
10--- ZLIB (PNG/ZIP) support available
11--- FREETYPE2 support available
12*** LITTLECMS support not available
13--------------------------------------------------------------------

现在 jpg 已经被支持了,程序也执行成功,这里简单记录一下过程,方便后来者。顺便附带测试程序,用 Tornado 上传图片并生成缩略图:

01import time
02import tempfile
03import Image
04 
05class AsciiImageProcessHandler(tornado.web.RequestHandler):
06    def post(self):
07 
08        if self.request.files:
09            for in self.request.files['image']:
10                rawname = f['filename']
11                dstname =str(int(time.time()))+'.'+rawname.split('.').pop()
12                thbname = "thumb_"+dstname
13 
14                self.write( dstname )
15 
16                tf = tempfile.NamedTemporaryFile()
17                tf.write(f['body'])
18                tf.seek(0)
19 
20                # create normal file
21                # img = Image.open(src)
22                img = Image.open(tf.name)
23                img.thumbnail((920,920),resample=1)
24                img.save("./static/upload/asciiimg/"+dstname)
25 
26                # create thumb file
27                img.thumbnail((100,100),resample=1)
28                img.save("./static/upload/asciiimg_tn/"+thbname)
29  
30                tf.close()

相关文章:

  • Pyp 替代sed,awk的文本处理工具
  • 看电影读小说,你就能懂经济学
  • android 开发环境安装和测试中常出现的问题
  • 转---9 个开始使用 C++11 的理由
  • 技本功丨呀~我不会写CSS之vertical-align(上集)
  • 如何正确理解,内页权重高于首页?
  • Android adb 修改手机代理方式
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • 不测的秘密:精准测试之路----读书笔记(第四章)
  • (译) 函数式 JS #1:简介
  • 独热编码
  • Intellij Idea 关闭自动保存、标记修改未保存文件为星号、修改内存大小
  • 【18】让接口容易被正确使用,不易被误用
  • 【S13】vector和string优先于动态分配的内存
  • java程序调用序列,存储过程,函数等
  • android图片蒙层
  • Docker 笔记(2):Dockerfile
  • ES10 特性的完整指南
  • Linux各目录及每个目录的详细介绍
  • Nacos系列:Nacos的Java SDK使用
  • TypeScript实现数据结构(一)栈,队列,链表
  • vue 个人积累(使用工具,组件)
  • Vue.js源码(2):初探List Rendering
  • Vue实战(四)登录/注册页的实现
  • WebSocket使用
  • 从0实现一个tiny react(三)生命周期
  • 当SetTimeout遇到了字符串
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 基于游标的分页接口实现
  • 开源地图数据可视化库——mapnik
  • 如何编写一个可升级的智能合约
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • (5)STL算法之复制
  • (二)c52学习之旅-简单了解单片机
  • (四) 虚拟摄像头vivi体验
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • (原創) 未来三学期想要修的课 (日記)
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • .net 反编译_.net反编译的相关问题
  • .NET 中的轻量级线程安全
  • .NET成年了,然后呢?
  • .Net的C#语言取月份数值对应的MonthName值
  • .NET文档生成工具ADB使用图文教程
  • .Net语言中的StringBuilder:入门到精通
  • .NET值类型变量“活”在哪?
  • ?php echo $logosrc[0];?,如何在一行中显示logo和标题?
  • @Not - Empty-Null-Blank
  • @拔赤:Web前端开发十日谈
  • [ Linux ] git工具的基本使用(仓库的构建,提交)
  • [ NOI 2001 ] 食物链
  • [20171102]视图v$session中process字段含义
  • [Android]使用Git将项目提交到GitHub