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 相关文章推荐
如何搜索查找并解决Django相关的问题
Jun 30 Python
wxPython窗口的继承机制实例分析
Sep 28 Python
python实现上传下载文件功能
Nov 19 Python
Python学习入门之区块链详解
Jul 25 Python
对pandas的dataframe绘图并保存的实现方法
Aug 05 Python
下载python中Crypto库报错:ModuleNotFoundError: No module named ‘Crypto’的解决
Apr 23 Python
Python3 修改默认环境的方法
Feb 16 Python
django如何自己创建一个中间件
Jul 24 Python
Python requests模块cookie实例解析
Apr 14 Python
Python matplotlib画图时图例说明(legend)放到图像外侧详解
May 16 Python
Python3实现建造者模式的示例代码
Jun 28 Python
Python 操作SQLite数据库的示例
Oct 16 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
乱谈我对耳机、音箱的感受
2021/03/02 无线电
mysql_fetch_row,mysql_fetch_array,mysql_fetch_assoc的区别
2009/04/24 PHP
phpMyAdmin 链接表的附加功能尚未激活的问题
2010/08/01 PHP
PHP 修复未正常关闭的HTML标签实现代码(支持嵌套和就近闭合)
2012/06/07 PHP
php常见的魔术方法详解
2014/12/25 PHP
php检测apache mod_rewrite模块是否安装的方法
2015/03/14 PHP
php简单操作mysql数据库的类
2015/04/16 PHP
PHP的swoole扩展安装方法详细教程
2016/05/18 PHP
mysql alter table命令修改表结构实例详解
2016/09/24 PHP
PHP 搜索查询功能实现
2016/11/29 PHP
可实现多表单提交的javascript函数
2007/08/01 Javascript
jQuery的Ajax时无响应数据的解决方法
2010/05/25 Javascript
js编写trim()函数及正则表达式的运用
2013/10/24 Javascript
JS获取文本框,下拉框,单选框的值的简单实例
2014/02/26 Javascript
js中的getAttribute方法使用示例
2014/08/01 Javascript
Javascript中的方法和匿名方法实例详解
2015/06/13 Javascript
JQuery实现鼠标滚轮滑动到页面节点
2015/07/28 Javascript
Javascript面试经典套路reduce函数查重
2017/03/23 Javascript
网页中的图片查看器viewjs使用方法
2017/07/11 Javascript
解决echarts的多个折现数据出现坐标和值对不上的问题
2018/12/28 Javascript
微信小程序动态显示项目倒计时
2019/06/20 Javascript
JS实现点餐自动选择框(案例分析)
2019/12/10 Javascript
[02:55]2018DOTA2国际邀请赛勇士令状不朽珍藏Ⅲ饰品一览
2018/08/01 DOTA
用Python实现QQ游戏大家来找茬辅助工具
2014/09/14 Python
Python实现打砖块小游戏代码实例
2019/05/18 Python
python3列表删除大量重复元素remove()方法的问题详解
2021/01/04 Python
CSS3实现大小不一的粒子旋转加载动画
2016/04/21 HTML / CSS
html5本地存储_动力节点Java学院整理
2017/07/12 HTML / CSS
Kent & Curwen:与大卫·贝克汉姆合作
2017/06/13 全球购物
Trip.com澳大利亚:在线旅行社
2019/12/01 全球购物
weblogic面试题
2016/03/07 面试题
介绍一下SQL注入攻击的种类和防范手段
2012/02/18 面试题
科级干部群众路线教育实践活动对照检查材料思想汇报
2014/09/20 职场文书
党组织领导班子整改方案
2014/10/25 职场文书
司法廉洁教育心得体会
2016/01/20 职场文书
Python OpenCV 彩色与灰度图像的转换实现
2021/06/05 Python