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爬虫之百度API调用方法
Jun 11 Python
Python PyQt5标准对话框用法示例
Aug 23 Python
Python学习之用pygal画世界地图实例
Dec 07 Python
python求解数组中两个字符串的最小距离
Sep 27 Python
Python tkinter的grid布局及Text动态显示方法
Oct 11 Python
django解决跨域请求的问题详解
Jan 20 Python
python实现石头剪刀布小游戏
Jan 20 Python
pyqt5让图片自适应QLabel大小上以及移除已显示的图片方法
Jun 21 Python
Python数据可视化实现正态分布(高斯分布)
Aug 21 Python
使用OpenCV实现仿射变换—旋转功能
Aug 29 Python
Python实现列表中非负数保留,负数转化为指定的数值方式
Jun 04 Python
python和opencv构建运动检测器的实现
Mar 03 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
使用 eAccelerator加速PHP代码的目的
2007/03/16 PHP
PHP5中使用DOM控制XML实现代码
2010/05/07 PHP
老版本PHP转义Json里的特殊字符的函数
2015/06/08 PHP
php的闭包(Closure)匿名函数初探
2016/02/14 PHP
php判断目录存在的简单方法
2019/09/26 PHP
浅谈PHP5.6 与 PHP7.0 区别
2019/10/09 PHP
使用JavaScript获取电池状态的方法
2014/05/03 Javascript
JQ技术实现注册页面带有校验密码强度
2015/07/27 Javascript
原生js配合cookie制作保存路径的拖拽
2015/12/29 Javascript
详解Vue.js——60分钟组件快速入门(上篇)
2016/12/05 Javascript
初识NodeJS服务端开发入门(Express+MySQL)
2017/04/07 NodeJs
jQueryMobile之窗体长内容的缺陷与解决方法实例分析
2017/09/20 jQuery
JS使用正则表达式找出最长连续子串长度
2017/10/26 Javascript
vue实例中data使用return包裹的方法
2018/08/27 Javascript
react-router4按需加载(踩坑填坑)
2019/01/06 Javascript
微信小程序五子棋游戏AI实现方法【附demo源码下载】
2019/02/20 Javascript
Vue3.0数据响应式原理详解
2019/10/09 Javascript
vue实现在线预览pdf文件和下载(pdf.js)
2019/11/26 Javascript
JavaScrip如果基于url实现图片下载
2020/07/03 Javascript
简单的Python的curses库使用教程
2015/04/11 Python
全面了解python中的类,对象,方法,属性
2016/09/11 Python
Python查找最长不包含重复字符的子字符串算法示例
2019/02/13 Python
Python函数的参数常见分类与用法实例详解
2019/03/30 Python
jupyter notebook实现显示行号
2020/04/13 Python
重写django的model下的objects模型管理器方式
2020/05/15 Python
HTML5 canvas 瀑布流文字效果的示例代码
2018/01/31 HTML / CSS
使用canvas生成含有微信头像的邀请海报没有微信头像问题
2019/10/29 HTML / CSS
英国领先的办公用品供应商:Viking
2016/08/01 全球购物
声明struct x1 { . . . }; 和typedef struct { . . . }x2;有什么不同
2012/06/02 面试题
自动化系在校本科生求职信
2013/10/23 职场文书
生态学毕业生自荐信
2013/10/27 职场文书
餐饮企业总经理岗位职责范文
2014/02/18 职场文书
爱国演讲稿500字
2014/05/04 职场文书
垃圾桶标语
2014/06/24 职场文书
2014年评职称工作总结
2014/11/20 职场文书
写给同学的新学期寄语
2015/02/27 职场文书