python如何对图片或文件的操作
作者:纯洁的小魔鬼
在日常编程中,我们经常会遇到文件处理的需求,如base64与图片的相互转换、图片与像素点的操作、本地文件与二进制的互相转换、计算文件的md5以及下载网络文件等,这些操作对于处理多媒体数据、实现数据的持久化存储、保证数据的完整性和安全性等方面都至关重要
一. base64 与图片的相互转换
1. base64 转图片
import base64 from io import BytesIO from PIL import Image # base64 编码的图像数据(示例) base64_data = "iVBn9DHASKJDjDsdSADSf8lgg==" # 将 base64 编码的字符串解码为二进制数据 binary_data = base64.b64decode(base64_data) # 将二进制数据转换为 BytesIO 对象 bytes_io = BytesIO(binary_data) # 使用 PIL(Pillow)加载图像 image = Image.open(bytes_io) # 保存图像 image.save("output_image.png") print("图像保存成功")
2.图片转 base64
import base64 def file_to_base64(file_path): with open(file_path, "rb") as file: # 读取文件内容 file_data = file.read() # 使用base64编码 base64_encoded = base64.b64encode(file_data) # 将bytes对象转换为字符串 base64_string = base64_encoded.decode("utf-8") return base64_string # 示例:将图片转换为Base64编码 image_path = "D:/output_image.png" base64_data = file_to_base64(image_path) # 打印Base64编码 print(base64_data)
二.图片和像素点的操作
1. 读取图片的像素点矩阵, 写入到 json 文件中
jpg 一般为3通道, png 一般为 4通道
""" 读取图片像素点矩阵, 写入到json文件 """ from PIL import Image import numpy as np import json # 打开图片 img = Image.open('D:/input_image.png') # 获取图片大小和格式 print(img.size, img.format) # 显示图片 # img.show() # 获取像素数据 pixels = np.array(img) # 将像素点转为 list 写入文件 file_object = open('D:/why.json', 'w', encoding="utf8") json.dump(pixels.tolist(), file_object, ensure_ascii=False)
2.读取像素矩阵, 生成图片
""" 读取像素点矩阵, 生成图片 """ import json import numpy as np import cv2 file_object = open("D:/why.json", "r+", encoding='utf8') file_data_str = file_object.read() file_object.close() matrix_data = json.loads(file_data_str) image = np.array(matrix_data, dtype=np.uint8) print(image.shape) cv2.imwrite("D:/output_image2.jpg", image)
三.本地文件和二进制的互相转换
1.本地文件转二进制
# 本地文件转二进制 def file_binary(path): with open(path, 'rb') as file: binary_data = file.read() return binary_data file_path = "D:/input_image.png" binary = file_binary(file_path)
2.二进制转本地文件
# 本地文件转二进制 def file_binary(path): with open(path, 'rb') as file: binary_data = file.read() return binary_data # 二进制写入到本地文件 def save_binary_file(path, binary_data): # 将二进制数据写入文件 with open(path, "wb") as file: file.write(binary_data) file_path = "D:/input_image.png" binary = file_binary(file_path) to_file_path = "D:/output_image.png" save_binary_file(to_file_path, binary)
四.计算文件的 md5
1.计算本地文件的 md5
import hashlib # 计算本地文件的 md5 值 def calculate_md5(path): # 打开图像文件 with open(path, "rb") as f: # 读取图像数据 binary_data = f.read() # 计算 MD5 值 md5_hash = hashlib.md5(binary_data) md5_value = md5_hash.hexdigest() return md5_value # 图像文件路径 file_path = "D:/output_image.png" # 获取图像的 MD5 值 md5 = calculate_md5(file_path) print(md5)
2.计算数据二进制的 md5
跟计算本地文件的md5差不多, 只不过传入的是二进制数据而已, 二进制数据除了是从文件中直接读取的, 也有可能是从数据库中获取, 比如 mongo, 所以也要注意一下编码问题。
import hashlib # 本地文件转二进制 def file_binary(path): with open(path, 'rb') as file: binary_data = file.read() return binary_data # 计算二进制数据的 md5 def calculate_md5(binary_data): # 检查是否是 Unicode 字符串 # (因为二进制数据除了是从文件中直接读取的, 也有可能是从数据库中获取, 比如 mongo) if isinstance(binary_data, str): # 将 Unicode 字符串编码为字节对象 binary_data = binary_data.encode('utf-8') md5_hash = hashlib.md5(binary_data) return md5_hash.hexdigest() file_path = "D:/input_image.png" binary = file_binary(file_path) # 计算 MD5 值 md5 = calculate_md5(binary) print(md5)
3.windows 获取本地文件的 md5
certutil -hashfile test.pdf MD5
4.linux 获取本地文件的 md5
md5sum test.pdf
五.下载网络文件到本地
常用的一种爬虫方法,任何类型的文件都可以
import urllib.request import urllib.parse url = "https://t7.baidu.com/it/u=1595072465,3644073269&fm=193&f=GIF" urllib.request.urlretrieve(url, "D:/abc.jpg")
六.循环建立多层文件夹
直接建立多层文件夹, 如果已经存在的话, 则忽视
def create_folder_if_not_exists(folder_path): # 检查文件夹是否存在 if not os.path.exists(folder_path): # 如果不存在,创建文件夹 os.makedirs(folder_path)
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。