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中Continue语句的用法的举例详解
May 14 Python
matplotlib在python上绘制3D散点图实例详解
Dec 09 Python
python写一个md5解密器示例
Feb 23 Python
python筛选出两个文件中重复行的方法
May 31 Python
Python函数参数匹配模型通用规则keyword-only参数详解
Jun 10 Python
selenium 安装与chromedriver安装的方法步骤
Jun 12 Python
python利用wx实现界面按钮和按钮监听和字体改变的方法
Jul 17 Python
Python爬取视频(其实是一篇福利)过程解析
Aug 01 Python
基于Python的微信机器人开发 微信登录和获取好友列表实现解析
Aug 21 Python
python操作openpyxl导出Excel 设置单元格格式及合并处理代码实例
Aug 27 Python
python中upper是做什么用的
Jul 20 Python
python中opencv实现图片文本倾斜校正
Jun 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页面运行时间的函数介绍
2013/07/01 PHP
PHP中time(),date(),mktime()区别介绍
2013/09/28 PHP
微信公众号开发之微信公共平台消息回复类实例
2014/11/14 PHP
php中数据库连接方式pdo和mysqli对比分析
2015/02/25 PHP
PHP实现上传多图即时显示与即时删除的方法
2017/05/09 PHP
Laravel中前端js上传图片到七牛云的示例代码
2017/09/04 PHP
用Javascript数组处理多个字符串的连接问题
2009/08/20 Javascript
jquery tab标签页的制作
2010/05/10 Javascript
关于JavaScript命名空间的一些心得
2014/06/07 Javascript
浅谈JSON和JSONP区别及jQuery的ajax jsonp的使用
2014/11/23 Javascript
Javascript的闭包详解
2014/12/26 Javascript
JS实现定时自动关闭DIV层提示框的方法
2015/05/11 Javascript
使用AngularJS中的SCE来防止XSS攻击的方法
2015/06/18 Javascript
js实现仿阿里巴巴城市选择框效果实例
2015/06/24 Javascript
引用jquery框架后出错的解决方法
2016/08/09 Javascript
ion content 滚动到底部会遮住一部分视图的快速解决方法
2016/09/06 Javascript
vue 中引用gojs绘制E-R图的方法示例
2018/08/24 Javascript
vue实现同一个页面可以有多个router-view的方法
2018/09/20 Javascript
vue2.0移动端滑动事件vue-touch的实例代码
2018/11/27 Javascript
Vue CL3 配置路径别名详解
2019/05/30 Javascript
python判断字符串是否包含子字符串的方法
2015/03/24 Python
详解Python的Django框架中的中间件
2015/07/24 Python
星球大战与Python之间的那些事
2016/01/07 Python
Python callable()函数用法实例分析
2018/03/17 Python
python3爬虫之设计签名小程序
2018/06/19 Python
Python常用特殊方法实例总结
2019/03/22 Python
python写入文件自动换行问题的方法
2019/07/05 Python
pytorch构建多模型实例
2020/01/15 Python
python如何求100以内的素数
2020/05/27 Python
Scrapy-Redis之RedisSpider与RedisCrawlSpider详解
2020/11/18 Python
CSS3制作气泡对话框的实例教程
2016/05/10 HTML / CSS
草莓网官网:StrawberryNET
2019/08/21 全球购物
餐饮部总监岗位职责范文
2014/02/13 职场文书
践行三严三实心得体会(2016推荐篇)
2016/01/06 职场文书
2016继续教育培训学习心得体会
2016/01/19 职场文书
Go语言入门exec的基本使用
2022/05/20 Golang