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 字典(Dictionary)操作详解
Mar 11 Python
python安装mysql-python简明笔记(ubuntu环境)
Jun 25 Python
一个基于flask的web应用诞生 使用模板引擎和表单插件(2)
Apr 11 Python
Python的CGIHTTPServer交互实现详解
Feb 08 Python
python实现人脸识别经典算法(一) 特征脸法
Mar 13 Python
Sanic框架配置操作分析
Jul 17 Python
Python3爬虫教程之利用Python实现发送天气预报邮件
Dec 16 Python
python使用yield压平嵌套字典的超简单方法
Nov 02 Python
关于Numpy数据类型对象(dtype)使用详解
Nov 27 Python
Python基于pygame实现单机版五子棋对战
Dec 26 Python
Python3.9最新版下载与安装图文教程详解(Windows系统为例)
Nov 28 Python
python 实现Harris角点检测算法
Dec 11 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性能测试工具xhprof的详解
2013/06/03 PHP
使用php显示搜索引擎来的关键词
2014/02/13 PHP
PHP代码优化之成员变量获取速度对比
2014/02/28 PHP
浅析Yii2 gridview实现批量删除教程
2016/04/22 PHP
Yii2 queue的队列使用详解
2019/07/19 PHP
使用js实现的简单拖拽效果
2015/03/18 Javascript
简单理解vue中Props属性
2016/10/27 Javascript
jQuery+CSS3实现点赞功能
2017/03/13 Javascript
解析Vue2 dist 目录下各个文件的区别
2017/11/22 Javascript
基于vue cli重构多页面脚手架过程详解
2018/01/23 Javascript
vue打包的时候自动将px转成rem的操作方法
2018/06/20 Javascript
JS实现快递单打印功能【推荐】
2018/06/21 Javascript
利用js-cookie实现前端设置缓存数据定时失效
2019/06/18 Javascript
基于js实现抽红包并分配代码实例
2019/09/19 Javascript
js实现跳一跳小游戏
2020/07/31 Javascript
Openlayers实现扩散的动态点(水纹效果)
2020/08/17 Javascript
Python numpy实现二维数组和一维数组拼接的方法
2018/06/05 Python
python使用opencv驱动摄像头的方法
2018/08/03 Python
Python实现的各种常见分布算法示例
2018/12/13 Python
python+selenium实现简历自动刷新的示例代码
2019/05/20 Python
python GUI库图形界面开发之PyQt5信号与槽基础使用方法与实例
2020/03/06 Python
Pycharm中安装wordcloud等库失败问题及终端通过pip安装的Python库如何添加到Pycharm解释器中(推荐)
2020/05/10 Python
Pandas把dataframe或series转换成list的方法
2020/06/14 Python
PyCharm Community安装与配置的详细教程
2020/11/24 Python
Pycharm 解决自动格式化冲突的设置操作
2021/01/15 Python
利用CSS3 动画 绘画 圆形动态时钟
2018/03/20 HTML / CSS
美国大型的健身社区和补充商店:Bodybuilding.com
2016/09/06 全球购物
什么叫做SQL注入,如何防止
2016/10/04 面试题
解除劳动合同协议书
2014/04/14 职场文书
工作保证书范文
2014/04/29 职场文书
募捐感谢信
2015/01/22 职场文书
党员自我评价范文2015
2015/03/03 职场文书
党员承诺书范文2015
2015/04/27 职场文书
Python基于Opencv识别两张相似图片
2021/04/25 Python
GO语言异常处理分析 err接口及defer延迟
2022/04/14 Golang
Zabbix6通过ODBC方式监控Oracle 19C的详细过程
2022/09/23 Servers