非常快速(主要是)无损jpeg转换

jpegtran-cffi的Python项目详细描述


Build status

jpegtran cffi是一个用于快速jpeg转换的python包。与 其他更通用的图像处理库,如wand-pyPIL/Pillow,转换的速度通常是 Benchmarks)。此外,除了缩放以外的所有操作都是无损的, 因为在此过程中图像没有被重新压缩。这是因为 所有转换操作都直接处理jpeg数据。

这是通过使用启蒙计划中的多个C例程来实现的 epeg library(用于缩放)和jpegtran来自独立jpeg组的 libjpeg库(用于所有其他操作)。这些例程是从 python通过CFFI模块,即不启动外部进程。

该包还包括获取和设置exif的基本支持。 方向标签,根据它自动转换图像 获取jfif缩略图。

jpegtran cffi是作为spreads 项目中,必须准备大量来自数码相机的图像 由树莓皮展示。使用pi相当慢的armv6处理器,两者 魔杖和皮尔太慢,无法使用。

要求

  • cpython 2.6、2.7、3.3或pypy
  • CFFI
  • 带标题的libjpeg8(早期版本不起作用)

安装

$ pip install jpegtran-cffi

用法

from jpegtran import JPEGImage

img = JPEGImage('image.jpg')

# JPEGImage can also be initialized from a bytestring
blob = requests.get("http://example.com/image.jpg").content
from_blob = JPEGImage(blob=blob)

# Reading various image parameters
print img.width, img.height  # "640 480"
print img.exif_orientation  # "1" (= "normal")

# If present, the JFIF thumbnail can be obtained as a bytestring
thumb = img.exif_thumbnail

# Transforming the image
img.scale(320, 240).save('scaled.jpg')
img.rotate(90).save('rotated.jpg')
img.crop(0, 0, 100, 100).save('cropped.jpg')

# Transformations can be chained
data = (img.scale(320, 240)
            .rotate(90)
            .flip('horizontal')
            .as_blob())

# jpegtran can transform the image automatically according to the EXIF
# orientation tag
photo = JPEGImage(blob=requests.get("http://example.com/photo.jpg").content)
print photo.exif_orientation  # "6" (= 270°)
print photo.width, photo.height # "4320 3240"
corrected = photo.exif_autotransform()
print corrected.exif_orientation  # "1" (= "normal")
print corrected.width, corrected.height  # "3240 4320"

有关详细信息,请参阅API Reference

基准

所有操作均在3.4GHz i7-3770上完成,内存16GiB,转速7200RPM 具有以下2560x1920 8bit rgb jpeg的硬盘:

http://upload.wikimedia.org/wikipedia/commons/8/82/Mandel_zoom_05_tail_part.jpg

http://jpegtran-cffi.readthedocs.org/en/latest/_images/benchmark.png

Wand Py和Pil都是用最快的缩放算法运行的, 对于wand py,这意味着使用Image.sample而不是Image.resize 对于pil,最近邻过滤器用于Image.resize 打电话来。

许可证

麻省理工学院许可证(MIT)

版权所有(C)2014 Johannes Baiter<;johannes.baiter@gmail.com>;

兹免费准许任何人取得 本软件和相关文档文件(“软件”),用于处理 不受限制的软件,包括但不限于 使用、复制、修改、合并、发布、分发、再授权和/或销售副本 以及允许向其提供软件的人员 因此,必须满足以下条件:

上述版权公告及本许可公告须包括在 软件的拷贝或大部分。

本软件按“原样”提供,无任何形式的保证,明示或 默示的,包括但不限于适销性保证, 适合特定目的和不侵权。在任何情况下 作者或版权所有者应对任何索赔、损害或其他 责任,无论是在合同诉讼、侵权诉讼或其他诉讼中, 不属于或与本软件有关,或使用或进行其他交易

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java Kafka producer大量内存使用(泄漏?)   java NullPointerException。。。正在插入数据但无法检索数据[Mysql DB]   java spring+jpa+hibernate=没有可用于当前线程的实际事务的EntityManager无法可靠地处理“persist”调用   getelementbyid在没有ID的情况下如何在java中使用GetElementsById   java有没有一种使用WatchService强制轮询的方法?   java将值从jframe传递给另一个jframe并使用它   Java/Groovy中带重试的反应式事件处理   具有两个包装器元素的java Jackson XML ArrayList输出   java总是在范围内使用不同的随机元素   取消选择java下拉列表值   多线程如何在Java中为对象的不同成员拥有不同的同步块   java如何使用多线程从文本文件中读取输入   java Spring启动附加崩溃命令   java使用公共或单独的actionPerfomed方法有什么区别   java用Spring3.0中的SpEL替换JSP中的EL   java作为windows服务运行应用程序时无法访问共享文件夹   java xml 1.1规范中的“解析数据”是什么意思?   以编程方式设置JComboBox索引时java触发ItemListener   java Android WebView:只加载HTML,不加载JS或CSS(在某些设备中)   Java:计算do/while循环的数量