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中decorator使用实例
Apr 14 Python
python实现合并两个数组的方法
May 16 Python
python爬取亚马逊书籍信息代码分享
Dec 09 Python
Python实现学生成绩管理系统
Apr 05 Python
解决pip install xxx报错SyntaxError: invalid syntax的问题
Nov 30 Python
详解pyppeteer(python版puppeteer)基本使用
Jun 12 Python
pycharm配置当鼠标悬停时快速提示方法参数
Jul 31 Python
Python 异常的捕获、异常的传递与主动抛出异常操作示例
Sep 23 Python
django xadmin action兼容自定义model权限教程
Mar 30 Python
python爬虫学习笔记之pyquery模块基本用法详解
Apr 09 Python
浅谈numpy中函数resize与reshape,ravel与flatten的区别
Jun 18 Python
Keras-多输入多输出实例(多任务)
Jun 22 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
如何删除多级目录
2006/10/09 PHP
PHP插入排序实现代码
2013/04/04 PHP
php+ajax无刷新分页实例详解
2015/12/07 PHP
php集成动态口令认证
2016/07/21 PHP
PHP图片水印类的封装
2017/07/06 PHP
PHP开发实现微信退款功能示例
2017/11/25 PHP
基于jQuery实现点击同时更改两个iframe的网址
2010/07/01 Javascript
jquery随机展示头像代码
2011/12/21 Javascript
jQueryUI写一个调整分类的拖放效果实现代码
2012/05/10 Javascript
解决Extjs 4 Panel作为Window组件的子组件时出现双重边框问题
2013/01/11 Javascript
手机开发必备技巧:javascript及CSS功能代码分享
2015/05/25 Javascript
angularjs表格分页功能详解
2016/01/21 Javascript
基于BootStrap的图片轮播效果展示实例代码
2016/05/23 Javascript
Bootstrap学习笔记之css样式设计(2)
2016/06/07 Javascript
JavaScript中this的四个绑定规则总结
2016/09/26 Javascript
Bootstrap选项卡动态切换效果
2016/11/28 Javascript
浅谈Postman解决token传参的问题
2018/03/31 Javascript
Vue实现侧边菜单栏手风琴效果实例代码
2018/05/31 Javascript
jQuery实现文本显示一段时间后隐藏的方法分析
2019/06/20 jQuery
Python基于list的append和pop方法实现堆栈与队列功能示例
2017/07/24 Python
Python 实现两个服务器之间文件的上传方法
2019/02/13 Python
连接pandas以及数组转pandas的方法
2019/06/28 Python
Python箱型图绘制与特征值获取过程解析
2019/10/22 Python
详解pycharm2020.1.1专业版安装指南(推荐)
2020/08/07 Python
python 自动识别并连接串口的实现
2021/01/19 Python
来自圣地亚哥的实惠太阳镜:Knockaround
2018/08/27 全球购物
DBA数据库管理员JAVA程序员架构师必看
2016/02/07 面试题
公司管理建议书范文
2014/03/12 职场文书
市级青年文明号申报材料
2014/05/26 职场文书
语文复习计划
2015/01/19 职场文书
先进个人总结范文
2015/02/15 职场文书
2015年幼儿园中班下学期工作总结
2015/05/22 职场文书
法人身份证明书
2015/06/18 职场文书
辞职信怎么写?
2019/05/21 职场文书
如何用python反转图片,视频
2021/04/24 Python
Dashboard管理Kubernetes集群与API访问配置
2022/04/01 Servers