python如何对图片或文件的操作

 更新时间:2024年09月14日 12:44:40   作者:纯洁的小魔鬼  
在日常编程中,我们经常会遇到文件处理的需求,如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)

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Python高效编程技巧

    Python高效编程技巧

    我已经使用Python编程有多年了,即使今天我仍然惊奇于这种语言所能让代码表现出的整洁和对DRY编程原则的适用。这些年来的经历让我学到了很多的小技巧和知识,大多数是通过阅读很流行的开源软件,如Django, Flask, Requests中获得的
    2013-01-01
  • python 实现线程之间的通信示例

    python 实现线程之间的通信示例

    这篇文章主要介绍了python 实现线程之间的通信示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • Python全栈之基本数据类型

    Python全栈之基本数据类型

    这篇文章主要为大家介绍了Python基本数据类型,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-12-12
  • Django项目之Elasticsearch搜索引擎的实例

    Django项目之Elasticsearch搜索引擎的实例

    今天小编就为大家分享一篇Django项目之Elasticsearch搜索引擎的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-08-08
  • 解决Python在导入文件时的FileNotFoundError问题

    解决Python在导入文件时的FileNotFoundError问题

    这篇文章主要介绍了解决Python在导入文件时的FileNotFoundError问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04
  • python爬虫爬取淘宝商品信息

    python爬虫爬取淘宝商品信息

    这篇文章主要为大家详细介绍了python爬虫爬取淘宝商品信息,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • 使用Python实现图像标记点的坐标输出功能

    使用Python实现图像标记点的坐标输出功能

    这篇文章主要介绍了使用Python实现图像标记点的坐标输出功能,非常不错,具有一定的参考借鉴价值,需要的朋友参考下吧
    2019-08-08
  • 基于Python实现蒙特卡洛法计算圆周率π

    基于Python实现蒙特卡洛法计算圆周率π

    蒙特卡罗法也称统计模拟法、统计试验法,是把概率现象作为研究对象的数值模拟方法,是按抽样调查法求取统计值来推定未知特性量的计算方法,本文我们将介绍如何使用Python来实现蒙特卡洛法计算圆周率π,感兴趣的朋友可以参考下
    2023-06-06
  • python基于pygame实现响应游戏中事件的方法(附源码)

    python基于pygame实现响应游戏中事件的方法(附源码)

    这篇文章主要介绍了python基于pygame实现响应游戏中事件的方法,实例分析了Python基于pygame针对键盘及鼠标事件的响应方法,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-11-11
  • pytorch固定BN层参数的操作

    pytorch固定BN层参数的操作

    这篇文章主要介绍了pytorch固定BN层参数的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-05-05

最新评论