zoukankan      html  css  js  c++  java
  • python pillow库, 图片处理,把png图片处理后保存jpg报错

    Pillow

    安装

    $ pip install pillow

    缩放 resize

    from PIL import Image
    im = Image.open("xiao.png")
    print(im.size)  # 获取图片尺寸
    im_resize = im.resize((256,256))
    print(im_resize.size)
    输出:
    (670, 502)
    (256,256)

    注:resize方法有参数filter。不赋值的话,resize()默认使用NEAREST滤波器

    PIL提供了4中采用滤波器

    NEAREST:最近滤波。从输入图像中选取最近的像素作为输出像素。它忽略了所有其他的像素。
    BILINEAR:双线性滤波。在输入图像的2x2矩阵上进行线性插值。注意:PIL的当前版本,做下采样时该滤波器使用了固定输入模板。
    BICUBIC:双立方滤波。在输入图像的4x4矩阵上进行立方插值。注意:PIL的当前版本,做下采样时该滤波器使用了固定输入模板。
    ANTIALIAS:平滑滤波。这是PIL 1.1.3版本中新的滤波器。对所有可以影响输出像素的输入像素进行高质量的重采样滤波,以计算输出像素值。在当前的PIL版本中,这个滤波器只用于改变尺寸和缩略图方法。
    注意:在当前的PIL版本中,ANTIALIAS滤波器是下采样(例如,将一个大的图像转换为小图)时唯一正确的滤波器。BILIEAR和BICUBIC滤波器使用固定的输入模板,用于固定比例的几何变换和上采样是最好的。

    Image模块模块

    Image模块是PIL中最重要的模块,它有一个类叫做image,与模块名称相同。Image类有很多函数、方法及属性,接下来将依次对image类的属性、函数和方法进行介绍。

    一、Image类的属性

    1、Format

    定义:im.format ⇒ string or None
    含义:源文件的文件格式。如果是由PIL创建的图像,则其文件格式为None。
    例子:
    from PIL import Image
    im= Image.open("xiao.png")
    print(im.format)
    输出:
    'png'

    2、Size

    定义:im.size ⇒ (width, height)
    含义:图像的尺寸,按照像素数计算。它的返回值为宽度和高度的二元组(width, height)。

    二、类的函数:

    1、Open

    定义:Image.open(file) ⇒ image
         Image.open(file, mode) ⇒ image
    含义:打开并确认给定的图像文件。这个是一个懒操作;该函数只会读文件头,而真实的图像数据直到试图处理该数据才会从文件读取(调用load()方法将强行加载图像数据)。如果变量mode被设置,那必须是“r”。
         用户可以使用一个字符串(表示文件名称的字符串)或者文件对象作为变量file的值。文件对象必须实现read(),seek()和tell()方法,并且以二进制模式打开。
    例子:
    from PIL import Image
    im = Image.open("xiao.png")

    三、Image类的方法

    除非另作说明,Image类的所有方法都将返回一个Image类的新实例,这个实例对应于结果图像。

    1、Convert

    定义1:im.convert(mode)⇒ image
    含义1:将当前图像转换为其他模式,并且返回新的图像。
    当从一个调色板图像转换时,这个方法通过这个调色板来转换像素。如果不对变量mode赋值,该方法将会选择一种模式,在没有调色板的情况下,使得图像和调色板中的所有信息都可以被表示出来。
    
    定义2:im.convert(“P”,**options) ⇒ image
    含义2:这个与第一个方法定义一样,但是当“RGB”图像转换为8位调色板图像时能更好的处理。可供选择的选项为:
          Dither=. 控制颜色抖动。默认是FLOYDSTEINBERG,与邻近的像素一起承担错误。不使能该功能,则赋值为NONE。
          Palette=. 控制调色板的产生。默认是WEB,这是标准的216色的“web palette”。要使用优化的调色板,则赋值为ADAPTIVE。
          Colors=. 当选项palette为ADAPTIVE时,控制用于调色板的颜色数目。默认是最大值,即256种颜色。
     
    定义3:im.convert(mode,matrix) ⇒ image
    含义3:使用转换矩阵将一个“RGB”图像转换为“L”或者“RGB”图像。变量matrix为4或者16元组。

    2、Copy

    定义:im.copy() ⇒ image
    含义:拷贝这个图像。如果用户想粘贴一些数据到这张图,可以使用这个方法,但是原始图像不会受到影响。
    
    例子:
    from PIL import Image
    im1 = Image.open("jing.jpg")
    im2 = im1.copy()
    im2.save("he.jpg")
    注:图像im_copy和im01完全一样。

    3、Crop

    定义:im.crop(box) ⇒ image
    含义:从当前的图像中返回一个矩形区域的拷贝。变量box是一个四元组,定义了左、上、右和下的像素坐标。
    这是一个懒操作。对源图像的改变可能或者可能不体现在裁减下来的图像中。为了获取一个分离的拷贝,对裁剪的拷贝调用方法load()。
    
    例子:
    from PIL import Image
    im1 = Image.open("jing.jpg")
    print(im1.size)
    box = [0,0,650,400]   #650(长)400(高)
    im_crop = im1.crop(box)
    im_crop.save("he.jpg")

    把png图片处理后保存jpg报错

    参考: https://blog.csdn.net/weixin_41010198/article/details/87200236

    img = Image.open("abc.png")
    size = img.size # 图片尺寸,元组格式 (180, 180)
    length = size[0]
    width = size[1]
    # 截取4:3尺寸
    if (length / width) > (4 / 3):  # 长宽比大于1.33333333
        length_space = (length - (width / 3 * 4)) / 2  # 左右分割的间距
        cropped = img.crop((length_space, 0, length - length_space, width))  # (left, upper, right, lower)
    else:  # 长宽比小于4/3
        width_space = (width - (length / 4 * 3)) / 2  # 上下分割的间距
        cropped = img.crop((0, width_space, length, width - width_space))  # (left, upper, right, lower)
    # cropped.save("xxx.jpg")    # 当abc为jpg,jpeg格式,不会报错。为png格式会报错,经查询, png图片为四通道RGBA,A代表透明度。如果变为jpg需要转为三通道。
    
    try:    # jpg,jpeg三通道图片
        cropped.save("xxx.jpg")  # 保存截取的图片
    except: # 四通道图片
        cropped = cropped.convert('RGB')  # 例如png,tif这种RGBA4通道图片,要转为转为RGB三通道
        cropped.save("xxx.jpg")  # 保存截取的图片

    全文参考网址:

    https://www.cnblogs.com/chimeiwangliang/p/7130434.html

  • 相关阅读:
    Django测试开发-4-django3.0.3报错:/mysql ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.3
    Django测试开发-3-新建一个Django工程
    Django测试开发-2-创建虚拟环境
    Django测试开发-1-MVC/MVT的概念
    sqlserver中复合索引和include索引到底有多大区别?
    PLSQL开发笔记和小结(转载)
    PL/sql语法单元
    jquery 获取下拉框值与select text
    jquery 事件
    jquery dom操作
  • 原文地址:https://www.cnblogs.com/ludingchao/p/15421569.html
Copyright © 2011-2022 走看看