Python实现无损放大图片的示例代码
本文介绍使用Python实现无损放大图片的方法,分别针对JPG和PNG格式提供源代码。JPG通过读取RGB像素值并重新绘制实现放大;PNG则利用RGBA通道处理透明背景,生成临时模板后重组像素。代码包含交互式输入、倍数设定及文件清理逻辑,适用于需要保持清晰度的图像放大场景。
Python无损放大图片原理与实现
今天介绍一个实现图片无损放大的简单程序,其核心原理非常直观。
对于JPG格式,处理流程如下:首先读取原图片中每个像素点的RGB颜色值并存储到文件中;接着将原图尺寸翻倍放大,并在放大后的图像上进行绘制,每个像素点被绘制为放大后的尺寸;最后逐行完成绘制,保存结果并删除中间的颜色数据文件。
对于PNG格式,由于部分图片包含透明通道,处理逻辑有所不同:以RGBA颜色值进行保存和绘制。首先生成颜色文件和一个临时模板图片(文件名为8UY88767.png),该模板是原图放大后的版本;模板生成完毕后,读取之前保存的颜色文件,在模板图片上根据颜色数据进行重组,最终生成无损放大后的图片。
如果觉得有用,请记得点赞支持。
下图展示了将原图无损放大8倍后的JPG格式效果。

下图展示了将原图无损放大8倍后的PNG格式效果。

JPG格式无损放大代码
以下是无损放大JPG图片的完整源代码。
#!/usr/bin/python
# -*- coding:utf-8 -*-
import cv2
from PIL import Image
import time
import shutil
import os
DATA = input('请输入要放大的图片名称(JPG文件名称必须使用数字或英文):')
Multiple = int(input('请输入要放大的图片的倍数(必须大于1):'))
DATA_file = input('请输入要图片要保存的图片名称:')
print('开始放大....')
os.mkdir('DATA') # 新建
#读取图片 要放大的图片
src = cv2.imread(DATA)
# 用来读取原图片的像素RGB颜色值 先读取图片文件
IMG = Image.open(DATA)
#获取图像大小 获取图像的大写XY也是颠倒过来的
y, x = src.shape[:2]
# 临时装饰器
List_elements = []
for YY in range(y): # 获取图片的Y轴有多少像素 也相当于长度
'''意思:循环读取图片的每一个像素点的RGB值 并以列表的形式存储起来'''
if int(len(List_elements)) >= 2: # 每次循环完毕后要将列表的值恢复无
List_elements = []
for XX in range(x): # 获取图片的X轴有多少像素 也相当于宽度
# IMG.getpixel((a, aa)) 用来获取图片某位置的RGB像素值 提示:获取的值 对应 BGR 是RGB反过来的
List_elements = List_elements + [list(IMG.getpixel((XX, YY)))] # 读取某坐标的像素值并将元组为列表进行存储
NAME = open(f"DATA/{YY}", 'w') # 存储
NAME.write(str(List_elements)) # 将列表转为字符串保存
NAME.close()
time.sleep(2) # 延迟一下 ,防止文件加载过慢读取错误
# 图像缩放 要将原图进行翻倍放大 然后在原图的基础上进行绘图
result = cv2.resize(src, (x*Multiple,y*Multiple))
for RGB_DATA_Y in range(y): # 循环所有文件 Y有多少像素 就有多少个RGB颜色文件
'''循环读取刚刚存储的RGB颜色文件 并循环进行绘制 以倍数进行绘图 确保无损放大'''
NAME_ = eval(open(f'DATA/{RGB_DATA_Y}', 'r', encoding='utf-8').read()) # 读取文件并转为列表
for RGB_DATA_X in range(len(NAME_)): # 获取 文件内有多少个子列表
'''
因为通过getpixel 获取出来的颜色是反过来的 RGB 也就是 BGR
在颜色文件内的数值也是反过来的,所以在这里读取的时候要将其颠倒一下,反向转换一下
'''
_DATA = NAME_[RGB_DATA_X]
_DATA.reverse()
'''
当前这个模块是核心模块 主要是用来读取并绘制出原图的倍数
原理:
result[1,1] = [255,255,255] 填充 图片的第一个像素为白色 [255,255,255] 是RGB的白色颜色数值
result[0:2,0:4] = [255,255,255] 填充图片 X轴从0像素到2像素为白色 Y轴从0像素到4像素为白色
'''
try:
result[RGB_DATA_Y*Multiple:RGB_DATA_Y*Multiple+Multiple,RGB_DATA_X*Multiple:RGB_DATA_X*Multiple+Multiple] = _DATA
except:pass
# 写入保存图像
cv2.imwrite(DATA_file, result)
print('完成....')
try:
shutil.rmtree("DATA") # 删除文件夹和文件
except:passPNG格式无损放大代码
以下是无损放大PNG图片的完整源代码。
#!/usr/bin/python
# -*- coding:utf-8 -*-
import cv2
from PIL import Image
import time
import shutil
import os
DATA = input('请输入要放大的图片名称(PNG文件名称必须使用数字或英文):')
Multiple = int(input('请输入要放大的图片的倍数(必须大于1):'))
DATA_file = input('请输入要图片要保存的图片名称:')
print('开始放大....')
os.mkdir('DATA') # 新建
#读取图片 要放大的图片
src = cv2.imread(DATA)
# 用来读取原图片的像素RGB颜色值 先读取图片文件
IMG = Image.open(DATA)
#获取图像大小 获取图像的大写XY也是颠倒过来的
y, x = src.shape[:2]
# 模板
# 图像缩放 要将原图进行翻倍放大 然后在原图的基础上进行绘图
result = cv2.resize(src, (x*Multiple,y*Multiple))
# 写入保存图像 - 模板图片不用管
cv2.imwrite('8UY88767.png', result)
# 临时装饰器
List_elements = []
# 存储文件的个数 后期读取方便,不会错读取
Number_documents = 0
for YY in range(y): # 获取图片的Y轴有多少像素 也相当于长度
'''意思:循环读取图片的每一个像素点的RGBA值 并以列表的形式存储起来'''
if int(len(List_elements)) >= 2: # 每次循环完毕后要将列表的值恢复无
List_elements = []
for XX in range(x): # 获取图片的X轴有多少像素 也相当于宽度
# IMG.getpixel((a, aa)) 用来获取图片某位置的RGBA像素值
List_elements = List_elements + [IMG.getpixel((XX, YY))]*Multiple # 读取某坐标的像素值并将元组为列表进行存储 Multiple是倍数
for a in range(Multiple): # Multiple是倍数 如果是2倍 则生成两个同样的颜色文件 在后期进行单行输出多次 确保以像素点进行放大
NAME = open(f"DATA/{Number_documents}", 'w') # 存储
NAME.write(str(List_elements)) # 将列表转为字符串保存
NAME.close()
Number_documents = Number_documents + 1
time.sleep(1) # 延迟一下 ,防止文件加载过慢读取错误
DATA_ = list() # 定义需要处理的数据列表
for a in range(Number_documents):
NAME = open(f"DATA/{a}", 'r').read() # 读取颜色文件
NAME = list(eval(NAME)) # 将颜色文件转换为列表
for aa in range(len(NAME)): # 循环读取列表的颜色值
DATA_.append(NAME[aa]) # 将颜色值保存到数据列表
# 打开写入模板图片
IMG_2 = Image.open('8UY88767.png')
# 转化为RGBA
RGBA_IMG = IMG_2.convert("RGBA")
RGBA_IMG.putdata(DATA_) # 写入图片
RGBA_IMG.save(DATA_file, "PNG") # 保存图片
print('完成....')
try:
shutil.rmtree("DATA") # 删除文件夹和文件
except:pass
try:
os.remove("8UY88767.png") # 删除文件
except:pass至此,关于Python实现无损放大图片的示例代码介绍完毕。如需了解更多Python无损放大图片相关内容,请搜索本站历史文章或继续浏览后续文章,感谢大家的支持!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













