PIL图片格式转换
PIL格式转换
原图:
1 2 3 4 5 6 7 | #!/usr/local/bin/python # -*- coding: utf8 -*- from PIL import Image, ImageFilter import os, sys BASE_PATH = os.path.dirname(os.path.abspath(__file__)) |
1 2 3 4 5 6 7 8 9 | · 1 ( 1 - bit pixels, black and white, stored with one pixel per byte) · L ( 8 - bit pixels, black and white) · P ( 8 - bit pixels, mapped to any other mode using a colour palette) · RGB ( 3x8 - bit pixels, true colour) · RGBA ( 4x8 - bit pixels, true colour with transparency mask) · CMYK ( 4x8 - bit pixels, colour separation) · YCbCr ( 3x8 - bit pixels, colour video format ) · I ( 32 - bit signed integer pixels) · F ( 32 - bit floating point pixels) |
origin-->L-->RGB
模式“L”转换为模式“RGB”
模式“RGB”转换为模式“L”以后,像素值为[0,255]之间的某个数值。而从模式“L”转换成“RGB”时,“RGB”的三个通道都是模式“L”的像素值的拷贝。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | file_path = os.path.join(BASE_PATH, "fj.jpg" ) # 打开图片 img = Image. open (file_path) # 转换为灰度模式 new_img_l = img.convert( "L" ) # 转换为RGB模式 new_img_rgb = new_img_l.convert( "RGB" ) print u "原图:" , img.getpixel(( 0 , 0 )) print u "L:" , new_img_l.getpixel(( 0 , 0 )) print u "RGB:" , new_img_rgb.getpixel(( 0 , 0 ))<br> # 存储图片<br>new_img_l.save("fj_l.jpg", "JPEG")<br>new_img_rgb.save("fj_rgb.jpg", "JPEG") # 结果 原图: ( 0 , 35 , 54 ) L: 26 RGB: ( 26 , 26 , 26 ) |
L图片:
RGB图片:
origin-->1-->RGB
模式“1”转换为模式“RGB”
模式“RGB”转换为模式“1”以后,像素点变成黑白两种点,要么是0,要么是255。而从模式“1”转换成“RGB”时,“RGB”的三个通道都是模式“1”的像素值的拷贝。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | file_path = os.path.join(BASE_PATH, "fj.jpg" ) # 打开图片 img = Image. open (file_path) # 转换为二值模式 new_img_1 = img.convert( "1" ) # 转换为RGB模式 new_img_rgb = new_img_1.convert( "RGB" ) print u "原图:" , img.getpixel(( 0 , 0 )) print u "1:" , new_img_1.getpixel(( 0 , 0 )) print u "RGB:" , new_img_rgb.getpixel(( 0 , 0 )) # 存储图片 new_img_1.save( "fj_1.jpg" , "JPEG" ) new_img_rgb.save( "fj_1_rgb.jpg" , "JPEG" ) 结果: 原图: ( 0 , 35 , 54 ) 1 : 0 RGB: ( 0 , 0 , 0 ) |
1图片:
RGB图片:
origin-->p-->RGB
模式“RGB”转换为模式“P”
像素值为[0,255]之间的某个数值,但它为调色板的索引值,其最终还是彩色图像。从模式“P”转换成“RGB”时,“RGB”的三个通道会变成模式“P”的像素值索引的彩色值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | file_path = os.path.join(BASE_PATH, "fj.jpg" ) # 打开图片 img = Image. open (file_path) # 转换为P模式 new_img_p = img.convert( "P" ) # 转换为RGB模式 new_img_rgb = new_img_p.convert( "RGB" ) print u "原图:" , img.getpixel(( 0 , 0 )) print u "p:" , new_img_p.getpixel(( 0 , 0 )) print u "RGB:" , new_img_rgb.getpixel(( 0 , 0 )) # 存储图片 new_img_p.save( "fj_p.jpg" , "JPEG" ) new_img_rgb.save( "fj_p_rgb.jpg" , "JPEG" )<br><br>结果:<br>原图: ( 0 , 35 , 54 )<br>p: 52 <br>RGB: ( 0 , 51 , 51 ) |
p图片:
RGB图片:
origin-->RGBA-->RGB
模式“RGB”转换为模式“RGBA”以后,图像从三通道变成了四通道,其R、G、B三个通道的数值没有变化,新增的alpha通道均为255,表示不透明。从模式“RGBA”转换成“RGB”时,“RGB”的三个通道又变回原来的数值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | file_path = os.path.join(BASE_PATH, "fj.jpg" ) # 打开图片 img = Image. open (file_path) # 转换为RGBA模式 new_img_rgba = img.convert( "RGBA" ) # 转换为RGB模式 new_img_rgb = new_img_rgba.convert( "RGB" ) print u "原图:" , img.getpixel(( 0 , 0 )) print u "p:" , new_img_rgba.getpixel(( 0 , 0 )) print u "RGB:" , new_img_rgb.getpixel(( 0 , 0 )) # 存储图片 # new_img_rgba.save("fj_rgba.jpg", "JPEG") new_img_rgb.save( "fj_rgba_rgb.jpg" , "JPEG" ) 结果: 原图: ( 0 , 35 , 54 ) RGBA: ( 0 , 35 , 54 , 255 ) RGB: ( 0 , 35 , 54 ) |
RGBA图片:
RGB图片:
origin-->CMYK-->RGB
模式“RGB”转换为模式“CMYK”以后,图像从三通道变成了四通道,其C、M、Y三个通道的数值是通过之前的公式计算得到,K通道被直接赋值为0。
C = 255 - R
M = 255 - G
Y = 255 - B
K = 0
从模式“CMYK”转换成“RGB”时,“RGB”的三个通道又变回原来的数值,这是无损的转换。
R = 255 - C
G = 255 - M
B = 255 - Y
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | file_path = os.path.join(BASE_PATH, "fj.jpg" ) # 打开图片 img = Image. open (file_path) # 转换为CMYK模式 new_img_cmyk = img.convert( "CMYK" ) # 转换为RGB模式 new_img_rgb = new_img_cmyk.convert( "RGB" ) print u "原图:" , img.getpixel(( 0 , 0 )) print u "CMYK:" , new_img_cmyk.getpixel(( 0 , 0 )) print u "RGB:" , new_img_rgb.getpixel(( 0 , 0 )) # 存储图片 new_img_cmyk.save( "fj_cmyk.jpg" , "JPEG" ) new_img_rgb.save( "fj_cmyk_rgb.jpg" , "JPEG" ) 结果: 原图: ( 0 , 35 , 54 ) CMYK: ( 255 , 220 , 201 , 0 ) RGB: ( 0 , 35 , 54 ) |
CMYK图片:
RGB图片:
带矩阵模式转换
im.convert(mode,matrix) ⇒ image
这种定义只适合将一个“RGB”图像转换为“L”或者“RGB”图像,不能转换为其他模式的图像。变量matrix为4或者16元组。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | file_path = os.path.join(BASE_PATH, "fj.jpg" ) # 打开图片 img = Image. open (file_path) rgb2xyz = ( 0.412453 , 0.357580 , 0.180423 , 0 , 0.212671 , 0.715160 , 0.072169 , 0 , 0.019334 , 0.119193 , 0.950227 , 0 ) img_L = img.convert( "L" , rgb2xyz) img_rgb = img.convert( "RGB" , rgb2xyz) img_L.save( "img_L.jpg" , "JPEG" ) img_rgb.save( "img_rgb.jpg" , "JPEG" ) |
img_L图片:
img_rgb图片:
调色板转换
1 2 3 4 5 6 7 8 9 10 11 | file_path = os.path.join(BASE_PATH, "fj.jpg" ) # 打开图片 img = Image. open (file_path) p1 = img.convert( "P" , dither = Image.NONE) p2 = img.convert( "P" , dither = Image.ADAPTIVE) p3 = img.convert( "P" , palette = Image.ADAPTIVE, colors = 10 ) p2_ = p2.convert( "RGB" ) p2_.save( "p2.jpg" , "JPEG" ) p3_ = p3.convert( "RGB" ) |
p2图片:
p3图片:
参考:http://blog.csdn.net/icamera0/article/details/50843196
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性