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爬取十篇新闻统计TF-IDF
Jan 03 Python
Python基于SMTP协议实现发送邮件功能详解
Aug 14 Python
python框架中flask知识点总结
Aug 17 Python
解决PyCharm控制台输出乱码的问题
Jan 16 Python
详解Python并发编程之从性能角度来初探并发编程
Aug 23 Python
tensorflow的计算图总结
Jan 12 Python
python 解决mysql where in 对列表(list,,array)问题
Jun 06 Python
浅谈TensorFlow中读取图像数据的三种方式
Jun 30 Python
详解Django中views数据查询使用locals()函数进行优化
Aug 24 Python
Django admin组件的使用
Oct 24 Python
去除python中的字符串空格的简单方法
Dec 22 Python
解决pytorch 损失函数中输入输出不匹配的问题
Jun 05 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
PHP4之真OO
2006/10/09 PHP
CI框架中$this->load->library()用法分析
2016/05/18 PHP
Yii中的relations数据关联查询及统计功能用法详解
2016/07/14 PHP
PHP数组的定义、初始化和数组元素的显示实现代码
2016/11/05 PHP
微信自定义分享php代码分析
2016/11/24 PHP
php使用gearman进行任务分发操作实例详解
2020/02/26 PHP
JS实现转动随机数抽奖特效代码
2020/04/16 Javascript
JavaScript检查子字符串是否在字符串中的方法
2016/02/03 Javascript
JavaScript原生对象常用方法总结(推荐)
2016/05/13 Javascript
vue-router 学习快速入门
2017/03/01 Javascript
Web开发中客户端的跳转与服务器端的跳转的区别
2017/03/05 Javascript
利用JS做网页特效_大图轮播(实例讲解)
2017/08/09 Javascript
JS排序算法之希尔排序与快速排序实现方法
2017/12/12 Javascript
jquery 输入框查找关键字并提亮颜色的实例代码
2018/01/23 jQuery
angularJs在多个控制器中共享服务数据的方法
2018/09/30 Javascript
一篇文章介绍redux、react-redux、redux-saga总结
2019/05/23 Javascript
vuex的使用步骤
2021/01/06 Vue.js
[06:16]《DAC最前线》之地区预选赛全面回顾
2015/01/19 DOTA
Python实现的井字棋(Tic Tac Toe)游戏示例
2018/01/31 Python
Python内置模块hashlib、hmac与uuid用法分析
2018/02/12 Python
python+selenium实现QQ邮箱自动发送功能
2019/01/23 Python
python利用wx实现界面按钮和按钮监听和字体改变的方法
2019/07/17 Python
python模拟键盘输入 切换键盘布局过程解析
2019/08/15 Python
python如何快速生成时间戳
2020/07/21 Python
深入了解Python 变量作用域
2020/07/24 Python
Java基础知识面试题
2014/03/25 面试题
股份转让协议书
2014/04/12 职场文书
班长演讲稿范文
2014/04/24 职场文书
股东出资证明书(正规版)
2014/09/24 职场文书
大学生实习推荐信
2015/03/27 职场文书
小平小道观后感
2015/06/09 职场文书
国家助学金受助感言
2015/08/01 职场文书
小学生组织委员竞选稿
2015/11/21 职场文书
MySQL Innodb关键特性之插入缓冲(insert buffer)
2021/04/08 MySQL
CSS实现两列布局的N种方法
2021/08/02 HTML / CSS
《王国之心》迎来了发售的20周年, 野村哲发布贺图
2022/04/11 其他游戏