目录



  • 用python来PS照片
  • 图像的基础知识
  • 用Python玩转图像
  • 案例: mini照片管理系统
  • 项目: 51备忘录v0.38
  • 本章小结
  • 第三模块第二次作业总结



@(03.08 用python来PS照片)

用python来PS照片

  1. 图像的基本知识
  2. 用Python玩转图像
  3. 案例: mini照片管理系统
  4. 项目: 51备忘录V0.38

图像的基础知识

序号

内容

图像格式

常见: jpg, png, bmp ,tif, RAW...

分类

矢量图(向量) - 放大不失真

点阵图(位图) -放大会失真

颜色模型

常见的模型包括:

HSB (色相, 饱和度, 亮度): 基于人类的颜色感觉

RGB (三原色, 红绿蓝) :光色三色光, 照片, 视频

CMYK (减色模式 青, 洋红, 黄, 黑): 用于打印

波段

CIE LAB: 颜色度量的国际标准, 无关设备

L:明度通道, A:从红色到绿色, B: 从蓝色到黑色

从理论上说, 为最佳避免色彩的失真的方法是应用LAB模式编辑图片,转换成CMYK模式进行打印

大小

KB , MB, GB...

坐标

左上角开始(0, 0)

应用

照片, 图标, 图纸, 卫星遥感, 地图...

用Python玩转图像

from PIL import ImageColor
# 依赖包 pip install pillow
from PIL import ImageColor
# 依赖包 pip install pillow
# 图像颜色的数字表示方法
ImageColor.getcolor('red', 'RGB')
# 图像颜色的数字表示方法
ImageColor.getcolor('red', 'RGB')
(255, 0, 0)
ImageColor.getcolor('green', 'RGBA')  # A alpha通道, 透明度, png
ImageColor.getcolor('green', 'RGBA')  # A alpha通道, 透明度, png
(0, 128, 0, 255)
# 切换工作路径
%cd C:\study\03-notebook\No3_part02\0302-homework-lanjianlan\image_ctrl
# 切换工作路径
%cd C:\study\03-notebook\No3_part02\0302-homework-lanjianlan\image_ctrl
C:\study\03-notebook\No3_part02\0302-homework-lanjianlan\image_ctrl
  • 压缩图片,获取缩略图
  • 打开一个jpg图片, 指定工作路径
from PIL import Image
from PIL import Image

获取图片的格式, 大小, 格式

im = Image.open('luffy.jpg')
print(type('luffy.jpg'))
print(im.format, im.size, im.mode)
im = Image.open('luffy.jpg')
print(type('luffy.jpg'))
print(im.format, im.size, im.mode)
<class 'str'>
JPEG (800, 800) RGB

获取图像的尺寸

w, h = im.size
print("尺寸: %sx%s" % (w, h))
w, h = im.size
print("尺寸: %sx%s" % (w, h))
尺寸: 800x800

复制图像并进行缩放操作

im_copy = im.copy()
im_copy.save('luffy_a.jpg')
im_copy = im.copy()
im_copy.save('luffy_a.jpg')
im_a =Image.open("luffy_a.jpg")
print(im_a.format, im_a.size, im_a.mode)
im_a =Image.open("luffy_a.jpg")
print(im_a.format, im_a.size, im_a.mode)
JPEG (800, 800) RGB

缩小到50%

im_a.thumbnail((w//2, h//2))
im_a.thumbnail((w//2, h//2))
print("缩略图尺寸为: %sx%s" % (w//2, h//2))
print("缩略图尺寸为: %sx%s" % (w//2, h//2))
缩略图尺寸为: 400x400

保存缩略图格式为jpg

im_a.save('luffy_b.jpg', 'jpeg')
im_a.save('luffy_b.jpg', 'jpeg')

显示图片

im_a.show()
im_a.show()

调整大小

im_size = im_a.resize((w//4, h//4))
im_size.save('luffy_abb.jpg')
im_size = im_a.resize((w//4, h//4))
im_size.save('luffy_abb.jpg')

** 打开后记得关闭图像,会停留在后台

im_size.show()
im_size.show()

调整大小,指定大小

im_size = im_a.resize((w//2, h//4))
im_size.save('luffy-2-4.jpg')
im_size = im_a.resize((w//2, h//4))
im_size.save('luffy-2-4.jpg')

增强颜色效果模式

from PIL import ImageEnhance
from PIL import ImageEnhance
enh = ImageEnhance.Contrast(im)
enh.enhance(1.3).show("30% 增强对比度")
enh = ImageEnhance.Contrast(im)
enh.enhance(1.3).show("30% 增强对比度")

对图像进行裁剪

box = (100, 100, 400, 400)
region = im.crop(box)
region.save("luffy-300x300.jpg")
box = (100, 100, 400, 400)
region = im.crop(box)
region.save("luffy-300x300.jpg")

水平旋转图像

im.rotate(90).save("luffy-90.jpg")
im.rotate(90).save("luffy-90.jpg")
im.rotate(180).save("luffy-180.jpg")
im.rotate(180).save("luffy-180.jpg")
im.rotate(360).save("luffy-359.jpg")
im.rotate(360).save("luffy-359.jpg")

镜像翻转图像

im.transpose(Image.FLIP_LEFT_RIGHT).save("luffy_水平.jpg")
im.transpose(Image.FLIP_LEFT_RIGHT).save("luffy_水平.jpg")
im.transpose(Image.FLIP_TOP_BOTTOM).save("luffy_上下.jpg")
im.transpose(Image.FLIP_TOP_BOTTOM).save("luffy_上下.jpg")

图像叠加

  • 添加水印, 复制图片, 计算位置, 粘贴合并图片
# 打开logo
logo_file = 'luffy-300x300.jpg'
im_log = Image.open(logo_file)
logo_width, logo_height = im_log.size
# 打开logo
logo_file = 'luffy-300x300.jpg'
im_log = Image.open(logo_file)
logo_width, logo_height = im_log.size
# 打开目标文件
target = 'store.jpg'
print(type(target))
im_target = Image.open(target)
target_width, target_height = im_target.size
# 打开目标文件
target = 'store.jpg'
print(type(target))
im_target = Image.open(target)
target_width, target_height = im_target.size
# 粘贴
im_copya = im_target.copy()
im_copya.paste(im_log, (target_width-logo_width, target_height-logo_height))
im_copya.save("luffy_logo.jpg")
# 粘贴
im_copya = im_target.copy()
im_copya.paste(im_log, (target_width-logo_width, target_height-logo_height))
im_copya.save("luffy_logo.jpg")

查看波段和每个像素的颜色值

im.getbands()
im.getbands()
('R', 'G', 'B')
im.getpalette()
im.getpalette()
im.getpixel((1,1))
im.getpixel((1,1))
(10, 26, 52)
im.getpixel((50,50))
im.getpixel((50,50))
(10, 26, 52)

新建图片, 填充文字

from PIL import ImageDraw

im_new = Image.new("RGBA", (400, 400), 'white')
pic = ImageDraw.Draw(im_new)
pic.text((20, 20), 'lataku', fill='green')
im_new.save('lataku_words1.png')
from PIL import ImageDraw

im_new = Image.new("RGBA", (400, 400), 'white')
pic = ImageDraw.Draw(im_new)
pic.text((20, 20), 'lataku', fill='green')
im_new.save('lataku_words1.png')

新建图片, 填充文字并修改字体

import os
from PIL import ImageDraw, ImageFont
from PIL import Image
import os
from PIL import ImageDraw, ImageFont
from PIL import Image
font_path = r'c:\windows\fonts'
font = ImageFont.truetype(os.path.join(font_path, 'simsun.ttc'), 30)
font_path = r'c:\windows\fonts'
font = ImageFont.truetype(os.path.join(font_path, 'simsun.ttc'), 30)
Image.new?
Image.new?
import os
from PIL import ImageDraw, ImageFont

font_path = r'c:\windows\fonts'
font = ImageFont.truetype(os.path.join(font_path, 'simsun.ttc'), 40)
im_new = Image.new("RGBA", (400, 400), 'white')
pic = ImageDraw.Draw(im_new)
pic.text((20, 30), 'lataku', fill='black', font=font)
pic.text((150, 150), 'luffy', fill='red')

im_new.save("lataku_luffy.png")
import os
from PIL import ImageDraw, ImageFont

font_path = r'c:\windows\fonts'
font = ImageFont.truetype(os.path.join(font_path, 'simsun.ttc'), 40)
im_new = Image.new("RGBA", (400, 400), 'white')
pic = ImageDraw.Draw(im_new)
pic.text((20, 30), 'lataku', fill='black', font=font)
pic.text((150, 150), 'luffy', fill='red')

im_new.save("lataku_luffy.png")

案例: mini照片管理系统

class ImageSystem:
    """照片管理系统"""
#     def __init__(self, from_path, to_path):
#         self.from_path = from_path
#         self.to_path = to_path
    def __init__(self, source_dir, target_dir):
        self.source_dir = source_dir
        self.target_dir = target_dir
    
    def thumbnail_i(self, filename, percent=0.5):
        """缩略图"""
        # 打开一个jpg图片, 注意路径为当前:
        im = Image.open(filename)
        print(im.format, im.size, im.mode)
        
        w, h = im.size
        print("尺寸: %s x %s" % (w, h))
        
        # 缩放到50%
        im.thumbnail((int(w*percent), int(h*percent)))
        print("缩略图尺寸: %s X %s" % (int(w*percent), int(h*percent)))
        
        # 保存缩略图
        im.save(filename + '-thumnail.jpg', 'jpeg')
        
    def thumbnail_all(self, percent=0.5):
        """
        TODO: 循环 source_dir, 找到每一个图片文件, 生成缩略图效果
        """
        if filename:
            # 打开一个jpg图片, 注意路径为当前:
            im = Image.open(filename)
            print(im.format, im.size, im.mode)

            w, h = im.size
            print("尺寸: %s x %s" % (w, h))

            # 缩放到50%
            im.thumbnail((int(w*percent), int(h*percent)))
            print("缩略图尺寸: %s X %s" % (int(w*percent), int(h*percent)))

            # 保存缩略图
            im.save(filename + '-thumnail.jpg', 'jpeg')
        else:
            # TODO: 循环 source_dir, 找到每一个图片文件, 生成缩略图效果
            pass
    
    def resize(self, h_ratio, w_ratio):
        """调整大小"""
        pass
    
    def rotate(self, angle, isMirror=False):
        """图像旋转, 角度(angle), 镜像(Mirror)"""
        pass
    
    def add_logo(self):
        """添加logo"""
        pass
    
    def new_image(self, words, postion, font, color):
        """新建图像,添加字体 指定位置"""
        pass
class ImageSystem:
    """照片管理系统"""
#     def __init__(self, from_path, to_path):
#         self.from_path = from_path
#         self.to_path = to_path
    def __init__(self, source_dir, target_dir):
        self.source_dir = source_dir
        self.target_dir = target_dir
    
    def thumbnail_i(self, filename, percent=0.5):
        """缩略图"""
        # 打开一个jpg图片, 注意路径为当前:
        im = Image.open(filename)
        print(im.format, im.size, im.mode)
        
        w, h = im.size
        print("尺寸: %s x %s" % (w, h))
        
        # 缩放到50%
        im.thumbnail((int(w*percent), int(h*percent)))
        print("缩略图尺寸: %s X %s" % (int(w*percent), int(h*percent)))
        
        # 保存缩略图
        im.save(filename + '-thumnail.jpg', 'jpeg')
        
    def thumbnail_all(self, percent=0.5):
        """
        TODO: 循环 source_dir, 找到每一个图片文件, 生成缩略图效果
        """
        if filename:
            # 打开一个jpg图片, 注意路径为当前:
            im = Image.open(filename)
            print(im.format, im.size, im.mode)

            w, h = im.size
            print("尺寸: %s x %s" % (w, h))

            # 缩放到50%
            im.thumbnail((int(w*percent), int(h*percent)))
            print("缩略图尺寸: %s X %s" % (int(w*percent), int(h*percent)))

            # 保存缩略图
            im.save(filename + '-thumnail.jpg', 'jpeg')
        else:
            # TODO: 循环 source_dir, 找到每一个图片文件, 生成缩略图效果
            pass
    
    def resize(self, h_ratio, w_ratio):
        """调整大小"""
        pass
    
    def rotate(self, angle, isMirror=False):
        """图像旋转, 角度(angle), 镜像(Mirror)"""
        pass
    
    def add_logo(self):
        """添加logo"""
        pass
    
    def new_image(self, words, postion, font, color):
        """新建图像,添加字体 指定位置"""
        pass

项目: 51备忘录v0.38

  • 上传头像, 自动生成缩略图
  • 添加logo
def export_doc():
    """导出word图片, 包含图片, 添加水印或者logo"""
    pass

class MemoAdmin:
    pass

class ImageSystem:
    pass

# sys.argv[]
def export_doc():
    """导出word图片, 包含图片, 添加水印或者logo"""
    pass

class MemoAdmin:
    pass

class ImageSystem:
    pass

# sys.argv[]

本章小结

  • 时间
  • 邮件
  • 图像

很多第三方的库

  • 官方的文档,概览和教程
  • 尝试实现小的功能,封装成函数,最后是个类
  • 用类组成自己的工具包,应用到其他项目
  • 不用死记硬背每一个方法,大致知道名字和功能就ok
  • 数据:增删改查
  • 函数:输入,算法,输出

第三模块第二次作业总结

  • 能够使用目前学习的几个第三方API来书写一个基础的满足需求的类(功能性会不太强大)
  • 作业过程基本上使用jupyter notebook 按照 简单的判断的方式完成 → 写成 函数 → 再整合到包, 使用vscode进行测试
  • 异常判断的能力不足,代码不够熟练, 还没能够从提示错误的位置得出bug的大概方向,使用print来查看代码出错的位置从而实现功能模块的使用
  • 图片处理模块没有严格按照作业的要求而是根据一些小需求达成了一个批量的图片处理功能
  • 完成代码编写的能力弱, 没有能够在很短的时间内将需求完成,耗费了很多的时间在第三方搜索上