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

原文地址:https://www.cnblogs.com/ludingchao/p/15421569.html