Python用61行代码实现图片像素化的示例代码


Posted in Python onDecember 10, 2018

起因

看到网上的像素图片,感觉蛮有趣的,就打算用python一些PIL类库写一个。

Python用61行代码实现图片像素化的示例代码

实现思路

把一张图片分成多个块,每个块的颜色都等于这个色块中颜色最多的颜色,如下图。

Python用61行代码实现图片像素化的示例代码

这个图取2×2的像素为块的大小,把快中颜色与每个颜色出现的数量存放到字典里,取最大的颜色,填充整个块。

具体实现

from PIL import Image

def init():
  # 设置每个像素区块的大小
  block_size = 75
  img = Image.open("a.jpg")
  # 获取图片的宽高
  width, height = img.size
  # 获取像素点对应RGB颜色值,可以改变img_array中的值来改变颜色值
  img_array = img.load()
  # 为了处理最后的区块,加了一次循环
  max_width = width + block_size
  max_height = height + block_size
  for x in range(block_size - 1, max_width, block_size):
    for y in range(block_size - 1, max_height, block_size):
      # 如果是最后一次循环,则x坐标等于width - 1
      if x == max_width - max_width % block_size - 1:
        x = width - 1
      # 如果是最后一次循环,则x坐标等于height - 1
      if y == max_height - max_height % block_size - 1:
        y = height - 1
      # 改变每个区块的颜色值
      change_block(x, y, block_size, img_array)
      y += block_size
    x += block_size
  img.save(r'D:\python\pixel_image\awesome_copy.png')
  img.show()

"""
:param x坐标 x: 
:param y坐标 y: 
:param 区块大小 black_size: 
:param 可操作图片数组 img_array: 
"""
def change_block(x, y, black_size, img_array):

  color_dist = {}
  block_pos_list = []
  for pos_x in range(-black_size + 1, 1):
    for pos_y in range(-black_size + 1, 1):
      # todo print(x + pos_x,y + pos_y)
      block_pos_list.append([x + pos_x, y + pos_y])
  for pixel in block_pos_list:
    if not str(img_array[pixel[0], pixel[1]]) in color_dist.keys():
      color_dist[str(img_array[pixel[0], pixel[1]])] = 1
    else:
      color_dist[str(img_array[pixel[0], pixel[1]])] += 1
  # key-->value => value-->key
  new_dict = {v: k for k, v in color_dist.items()}
  max_color = new_dict[max(color_dist.values())]
  # 将区块内所有的颜色值设置为颜色最多的颜色
  for a in block_pos_list:
    img_array[a[0], a[1]] = tuple(list(map(int, max_color[1:len(max_color) - 1].split(","))))


def get_key(dict, value):
  return [k for k, v in dict.items() if v == value]


if __name__ == "__main__":
  init()

效果对比

Python用61行代码实现图片像素化的示例代码

Python用61行代码实现图片像素化的示例代码

总结

开源地址https://github.com/MasakiOvO/pixel_image

还有很多改进的地方,比如取色值的算法上,应该有更好的解决方法,应该用多进程来实现,这样程序速度会快很多。OvO

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python删除列表中重复记录的方法
Apr 28 Python
Python设置Socket代理及实现远程摄像头控制的例子
Nov 13 Python
在python的类中动态添加属性与生成对象
Sep 17 Python
关于Python形参打包与解包小技巧分享
Aug 24 Python
python 初始化一个定长的数组实例
Dec 02 Python
python输出数学符号实例
May 11 Python
用python给csv里的数据排序的具体代码
Jul 17 Python
Django如何实现密码错误报错提醒
Sep 04 Python
基于tensorflow权重文件的解读
May 26 Python
用python批量解压带密码的压缩包
May 31 Python
python flask开发的简单基金查询工具
Jun 02 Python
Python实战之OpenCV实现猫脸检测
Jun 26 Python
Python从数据库读取大量数据批量写入文件的方法
Dec 10 #Python
对Python实现简单的API接口实例讲解
Dec 10 #Python
python中dir()与__dict__属性的区别浅析
Dec 10 #Python
python分块读取大数据,避免内存不足的方法
Dec 10 #Python
Python 文本文件内容批量抽取实例
Dec 10 #Python
Python中作用域的深入讲解
Dec 10 #Python
python实现根据文件关键字进行切分为多个文件的示例
Dec 10 #Python
You might like
PHP制作图型计数器的例子
2006/10/09 PHP
模仿OSO的论坛(五)
2006/10/09 PHP
使用php来实现网络服务
2009/09/15 PHP
PHP使用mysql_fetch_row查询获得数据行列表的方法
2015/03/18 PHP
利用PHPStorm如何开发Laravel应用详解
2017/08/30 PHP
基于jQuery的倒计时实现代码
2012/05/30 Javascript
javascript 判断整数方法分享
2014/12/16 Javascript
javascript如何定义对象数组
2016/06/07 Javascript
Bootstrap零基础入门教程(二)
2016/07/18 Javascript
javaScript嗅探执行神器-sniffer.js
2017/02/14 Javascript
Angular实现点击按钮后在上方显示输入内容的方法
2017/12/27 Javascript
vue 设置proxyTable参数进行代理跨域
2018/04/09 Javascript
vue使用技巧及vue项目中遇到的问题
2018/06/04 Javascript
解决使用bootstrap的dropdown部件时报错:error:Bootstrap dropdown require Popper.js问题
2018/08/30 Javascript
JavaScript数据结构与算法之检索算法示例【二分查找法、计算重复次数】
2019/02/22 Javascript
vuex state中的数组变化监听实例
2019/11/06 Javascript
js实现特别简单的钟表效果
2020/09/14 Javascript
[01:09]DOTAPLUS——DOTA2的新时代
2018/04/04 DOTA
Python实现拼接多张图片的方法
2014/12/01 Python
Python中方法链的使用方法
2016/02/23 Python
Python装饰器用法实例总结
2018/02/07 Python
python使用turtle库绘制奥运五环
2020/02/24 Python
Anaconda+Pycharm环境下的PyTorch配置方法
2020/03/13 Python
tensorflow 大于某个值为1,小于为0的实例
2020/06/30 Python
python 获取计算机的网卡信息
2021/02/18 Python
Python与C/C++的相互调用案例
2021/03/04 Python
体验完美剃须:The Art of Shaving
2018/08/06 全球购物
介绍一下write命令
2012/09/24 面试题
财务担保书范文
2014/04/02 职场文书
公司担保书范文
2014/05/21 职场文书
优秀毕业生求职信
2014/06/05 职场文书
个人贷款收入证明
2014/10/26 职场文书
工程质量保证书
2015/05/09 职场文书
圣诞晚会主持词
2015/07/01 职场文书
四年级作文之说明文作文
2019/10/14 职场文书
为什么MySQL选择Repeatable Read作为默认隔离级别
2021/07/26 MySQL