当前位置: 首页 > news >正文

python 将图片转换成像素画_Python用61行代码实现图片像素化

起因

看到网上的像素图片,感觉蛮有趣的,就打算用python一些PIL类库写一个。

bVbkNCD?w=315&h=315

实现思路

把一张图片分成多个块,每个块的颜色都等于这个色块中颜色最多的颜色,如下图。

bVbkNDk?w=604&h=317

这个图取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()

效果对比

bVbkND6?w=600&h=400

bVbkNEw?w=600&h=400

总结

开源地址https://github.com/MasakiOvO/...

还有很多改进的地方,比如取色值的算法上,应该有更好的解决方法,应该用多进程来实现,这样程序速度会快很多。OvO

相关文章:

  • python实现自动翻页代码_python实现模拟按键,自动翻页看u17漫画
  • excel万年历_excel函数应用技巧:如何按不同要求,改变数值格式
  • python哪些领域_什么是Python?Python涉及哪些领域?
  • python 如何安装软件包故障_python中安装模块包版本冲突问题的解决
  • pythonand语法_python基础语法之and,or,not
  • html项目案例_Python爬虫项目案例: 豆瓣top250电影榜单爬取2020年8月最新(附源代码,数据)...
  • 2020年日历可编辑内容模板_黄油相机修图|4款可一键套用的文艺plog模板,快乐躺赢朋友圈...
  • 训练和验证准确性_50年难题被解决,蛋白质版“阿法狗”预测结构准确性达92.4...
  • iris数据_Python数据分析01-Iris鸢尾花数据集
  • java 文件预览_自建MinIO对象存储(三):上传、下载、预览
  • js内置对象_JS 原型与原型链
  • 交叉验证python代码_python机器学习,交叉验证
  • onvif摄像头软件_海康POE录像机添加POE网络摄像头
  • python给两个列表排序方法_对python实现合并两个排序链表的方法详解
  • python opencv压缩图片_OpenCV Python 缩放图片
  • “大数据应用场景”之隔壁老王(连载四)
  • 【前端学习】-粗谈选择器
  • ➹使用webpack配置多页面应用(MPA)
  • Electron入门介绍
  • JS学习笔记——闭包
  • LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
  • QQ浏览器x5内核的兼容性问题
  • Redash本地开发环境搭建
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • yii2权限控制rbac之rule详细讲解
  • 聊聊redis的数据结构的应用
  • 自定义函数
  • linux 淘宝开源监控工具tsar
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • # Panda3d 碰撞检测系统介绍
  • #if 1...#endif
  • #微信小程序:微信小程序常见的配置传值
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (4) PIVOT 和 UPIVOT 的使用
  • (二)hibernate配置管理
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (黑客游戏)HackTheGame1.21 过关攻略
  • (图)IntelliTrace Tools 跟踪云端程序
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • .bat批处理(九):替换带有等号=的字符串的子串
  • .NET 2.0中新增的一些TryGet,TryParse等方法
  • .NET Conf 2023 回顾 – 庆祝社区、创新和 .NET 8 的发布
  • .NET Core 和 .NET Framework 中的 MEF2
  • .NET Core 将实体类转换为 SQL(ORM 映射)
  • .NET 设计一套高性能的弱事件机制
  • .net通用权限框架B/S (三)--MODEL层(2)
  • .NET中的Event与Delegates,从Publisher到Subscriber的衔接!
  • .pings勒索病毒的威胁:如何应对.pings勒索病毒的突袭?
  • [acm算法学习] 后缀数组SA
  • [Android Pro] Notification的使用
  • [Android] Amazon 的 android 音视频开发文档
  • [BZOJ 4034][HAOI2015]T2 [树链剖分]
  • [bzoj4240] 有趣的家庭菜园