我的编程空间,编程开发者的网络收藏夹
学习永远不晚

python图片合成

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

python图片合成

python的PIL库简直好用的不得了,PIL下面的Image库更是封装了很多对图片处理的函数,关于Image库的介绍和使用,看这里:http://effbot.org/imagingbook/image.htm

这里用我半个月前看到的一篇博客写的demo作为背景,做一下图片的合成

图片可以看作是很多像素点组成的,每个像素点都是一个RGB颜色,(red, green, blue), 那么合成两张照片就有办法了,我们可以在一张新的RGB色的图片里一个像素点取图片一的对应位置的像素,下一个像素点取图片二的像素,直到遍历完成,代码如下:

from PIL import Image

##这里采用传入图片地址调用此函数

#这个方法目前不支持按比例合成,默认为1:1
#各取一个像素点合并,传入的参数为两张图片的地址
def merge1(img1_address,img2_addess):
    status=100
    #状态码100为正常
    #      200为地址错误
    try:
        img1=Image.open(img1_address)
        img2=Image.open(img2_address)
    except:
        status=200
        img_new=""
    else:
        width=min(img1.size[0],img2.size[0])
        height=min(img1.size[1],img2.size[1])
        print(width,height)
        img_new = Image.new('RGB',(width,height))
        for x in range(width):
            for y in range(height):
                if y%2==0:
                    pixel=img1.getpixel((x,y))
                    img_new.putpixel((x,y),pixel)
                else:
                    pixel=img2.getpixel((x,y))
                    img_new.putpixel((x,y),pixel)
    finally:
        return img_new,status

上述代码会返回一张新的图片和一个状态码,接受的时候用两个变量接受

另一种方法是每个像素点各取%50的原图片的颜色,然后把像素点放置在对应位置,为了功能更加强大,我把两者的混合比例设为可调,默认是50%的比例,代码如下:

from PIL import Image

#将像素点按比例取色,然后合成一个新像素点
#传入的参数为两张图片的地址和比例
#如果两者之和不为1则以第一个图片的比例为准
def merge2(img1_address,img2_address,percent1=0.50,percent2=0.50):
    status=100
    #状态码100为正常
    #      200为地址错误
    try:
        img1=Image.open(img1_address)
        img2=Image.open(img2_address)
    except:
        status=200
        img_new=""
    else:
        if percent1+percent2!=1:
            percent2=1-percent1
        width = min(img1.size[0],img2.size[0])
        height = min(img1.size[1],img2.size[1])
        img_new = Image.new('RGB',(width,height))
        for x in range(width):
            for y in range(height):
                r1,g1,b1=img1.getpixel((x,y))
                r2,g2,b2=img2.getpixel((x,y))
                r=int(percent1*r1+percent2*r2)
                g=int(percent1*g1+percent2*g2)
                b=int(percent1*b1+percent2*b2)
                img_new.putpixel((x,y),(r,g,b))
    finally:
        return img_new,status

返回的参数与上述相同
如果想要保存图片可用image.save()函数保存

总的代码如下:

from PIL import Image

##这里采用传入图片地址调用此函数

#这个方法目前不支持按比例合成,默认为1:1
#各取一个像素点合并,传入的参数为两张图片的地址
def merge1(img1_address, img2_addess, direct):
    status=100
    #状态码100为正常
    #      200为地址错误
    try:
        img1=Image.open(img1_address)
        img2=Image.open(img2_address)
    except:
        status=200
        img_new=""
    else:
        width=min(img1.size[0], img2.size[0])
        height=min(img1.size[1], img2.size[1])
        print(width,height)
        img_new = Image.new('RGB',(width, height))
        for x in range(width):
            for y in range(height):
                if y%2 == 0:
                    pixel = img1.getpixel((x,y))
                    img_new.putpixel((x,y), pixel)
                else:
                    pixel = img2.getpixel((x,y))
                    img_new.putpixel((x,y), pixel)
    finally:
        return status

#将像素点按比例取色,然后合成一个新像素点
#传入的参数为两张图片的地址和比例
#如果两者之和不为1则以第一个图片的比例为准
def merge2(img1_address, img2_address, direction, percent1):

    status = 100
    #状态码100为正常
    #   200为地址错误
    try:
        img1 = Image.open(img1_address)
        img2 = Image.open(img2_address)
    except:
        status = 200
        img_new = ""
    else:
        percent2 = 1 - percent1
        width = min(img1.size[0], img2.size[0])
        height = min(img1.size[1], img2.size[1])
        img_new = Image.new('RGB', (width,height))
        for x in range(width):
            for y in range(height):
                r1,g1,b1=img1.getpixel((x,y))
                r2,g2,b2=img2.getpixel((x,y))
                r = int(percent1 * r1 + percent2 * r2)
                g = int(percent1 * g1 +percent2 * g2)
                b = int(percent1 * b1 +percent2 * b2)
                img_new.putpixel((x,y),(r,g,b))
        img_new.save(direction)
        #img_new.show()
    finally:
        return status
    #切记在接受返回信息时先判断状态码是否异常,如果正确再执行相应操作
if __name__=='__main__':

    img1_address = "B:\Picture\YourName\1.jpg"
    img2_address = "B:\Picture\YourName\2.jpg"
    direction = "D:/Python/PyQt/课程设计/merges/merge9.png"
    status = merge2(img1_address, img2_address, direction, 0.30)
    print(status)

当然,我发现Image库中有Image.blend(image1, image2, alpha)这个混合图片的函数,还没看源码,不知道他是用什么方法实现的。

原先的两张照片:
这里写图片描述

合成后的照片:
这里写图片描述
左图是方法一,右图是方法二

优劣:
方法一不易造成曝光过度,因为实际的像素点并没改动,只是间隔变大了,但这样可能会造成轮廓不清晰
方法二在比例适当时效果是优于方式一的,但比例不合适就会看起来像曝光过度一样,示例中方法二用的比例是0.3:0.7,又是比例不当效果会很糟糕,孰优孰劣请按效果好坏使用。

找时间我会分析一下Image中blend的源码,到时候会更新在博客上。
2017.12.13更新:
Image库中的blend函数确实出色,前几天做课设看到知乎上的一段代码有人用过它,简直就是一个滤镜一样,找时间一定看看它的源码。

这个功能就当是课设中的一个小demo,到时候会集成在一起。

其实很想知道参考博客中那个示例中的妹子照片是不是他的女朋友,好漂亮!!!可惜我还没有女朋友(⊙﹏⊙)。

2017.12.22更新:
最近还在忙课设,看了一下PIL.Image中的blend函数,结果它是写在PIL._imaging.cp35-win_amd64.pyd中的,这个是二进制文件,要看源代码的话只能反编译。

参考:
http://www.cnblogs.com/ThrEcho/p/4979193.html

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

python图片合成

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

python图片合成

python的PIL库简直好用的不得了,PIL下面的Image库更是封装了很多对图片处理的函数,关于Image库的介绍和使用,看这里:http://effbot.org/imagingbook/image.htm这里用我半个月前看到的一篇博
2023-01-31

Python合并多张图片成PDF

目录前言过程拍照用到的Python 操作库Python遍历文件夹获取图片旋转图片展示方向并压缩像素整体代码将脚本打包成exe安装 PyInstaller打包脚本总结前言最近需要将记的笔记整理成一个 pdf 进行保存,所以就研究了一下如何利用
2022-06-02

Python怎么实现视频分解成图片及图片合成视频

这篇文章主要介绍了Python怎么实现视频分解成图片及图片合成视频的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python怎么实现视频分解成图片及图片合成视频文章都会有所收获,下面我们一起来看看吧。一、pyt
2023-06-29

Python如何合并多张图片成PDF

小编给大家分享一下Python如何合并多张图片成PDF,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!过程拿到一个需求最重要的就是将大块任务拆分成一个个小模块,逐个
2023-06-15

Python如何实现多张图片合成一张马赛克图片

这篇文章将为大家详细讲解有关Python如何实现多张图片合成一张马赛克图片,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。图片素材4K高清原图开发环境Python 3.6Pycharm实现代码先导入所需模块
2023-06-22

【python使用 Pillow 库】图片合成为 GIF 动画

from PIL import Imageimage_files = ["big-300-frame/frame0.png", "big-300-frame/frame1.png",
2023-08-30

Python如何实现合并多张图片成视频

本篇内容介绍了“Python如何实现合并多张图片成视频”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!合并多张图片到视频的方法说明除了使用 O
2023-07-05

用Python来合并图片(SoEasy)

开发游戏的时候,想要把几张小图合并成一个大图来使用。不是那种plist+png,而是单纯地想把图片合并一下。于是搜索了一下py的做法,代码大致如下:from PIL import Imagearr = ['p1.png', 'p2.png'
2023-01-31

java后端合成图片如何实现

本篇内容介绍了“java后端合成图片如何实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!环境jdk1.8spring boot搭建引入po
2023-07-02

使用ImageMagick进行图片缩放、合成与裁剪(js+python)

由于需要在服务器端处理,使用就研究使用imagemagick来进行。同时准备封装了一个Node.js和Python的方法,主要还是讲一下然后使用imagemagick来对图片进行缩放、合成后进行裁剪吧
2022-11-15

基于Python实现合并多张图片转成mp4视频

随着现代科技飞速发展和人们提升视觉上体验,利用图片生成视频的方法,确实为工作或者提升生活体验感做了很多成功案例,本文就来介绍一下具体实现方法吧
2023-05-15

基于C#实现图片合成功能

这篇文章主要为大家详细介绍了如何利用C#实现图片合成的功能,文中的示例代码讲解详细,对我们学习C#有一定的帮助,感兴趣的小伙伴可以跟随小编一起了解一下
2022-12-23

Python 多张图片合并成一个pdf的参考示例

目录过程拍照用到的Python 操作库Python遍历文件夹获取图片旋转图片展示方向并压缩像素整体代码整体代码将脚本打包成exe安装 PyInstaller打包脚本总结过程拿到一个需求最重要的就是将大块任务拆分成一个个小模块,逐个击破。 拍
2022-06-02

Python如何实现多张图片合成文字的效果

本篇内容主要讲解“Python如何实现多张图片合成文字的效果”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python如何实现多张图片合成文字的效果”吧!一、图片批量下载首先我们需要从百度下载大
2023-07-02

Python实现合并多张图片成视频的示例详解

随着短视频的兴起,越来越多的人开始用各种形式进行视频制作,本篇博客从程序员的角度为大家解析一下如何通过 Python 合并多个图片为一个视频,需要的可以参考一下
2023-02-01

Python怎么生成表格图片

本篇内容介绍了“Python怎么生成表格图片”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!pytab首先安装pip install pyta
2023-06-29

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录