本文涉及的函数如下:
- cv2.imdecode # 从内存中的缓冲区读取图像。
- cv2.imencode # 将图像编码到内存缓冲区中。
- .tofile # 将数组中的数据以二进制格式写进文件
- np.fromfile # 从文本或二进制文件中的数据构造数组。
目录
一、比较 imdecode、imencode 和 imread、imwrite
(1) 定义中文文件路径
(2)# 正常读取图像(读取失败)
(3)从内存中的缓冲区读取图像(读取成功)
(4)定义输出中文文件的中文路径
(5)正常保存图像(保存失败)
(6)将图像编码到内存缓冲区中
(7)将数组中的数据以二进制格式写进文件(保存成功)
(8)函数 fromfile 读取保存的二进制文件
二、解析文件转换的数据
三、官方解析函数 imdecode and imencode
(1)函数 imdecode
(2)函数 imencode
四、完整代码
file_path = r"G:\CSDN\python\Office_skills\中文路径_中文文件\西瓜.jpg"
src = cv2.imread(file_path)
# 可视化图像
cv2.imshow("src", src)
cv2.waitKey(0)
src = cv2.imdecode(np.fromfile(file_path, dtype=np.uint8), flags=cv2.IMREAD_COLOR)
# 可视化图像
cv2.imshow("src", src)
cv2.waitKey(0)
file_out = r"G:\CSDN\python\Office_skills\中文路径_中文文件\西瓜_输出.jpg"
cv2.imwrite(file_out, src)
out = cv2.imencode('.jpg', src)
out[1].tofile(file_out)
y = np.fromfile(r"G:\CSDN\python\Office_skills\中文路径_中文文件\西瓜_输出.jpg", dtype=np.float)
print(out) # 函数imendoce读取图像的返回数据
print(out[1]) # 将图像编码保存到内存缓冲区的数据
print(src) # 将图像编码保存到内存缓冲区的数据
print(y) # 用函数 fromfile 读取保存的二进制文件数据
>>>output
# 函数imendoce读取图像的返回数据
(True, array([[255],
[216],
[255],
...,
[ 3],
[255],
[217]], dtype=uint8))# 将图像编码保存到内存缓冲区的数据
[[255]
[216]
[255]
...
[ 3]
[255]
[217]]# 将图像编码保存到内存缓冲区的数据
# 因为opencv读取的图像输出数据是BGR格式
# PIL读取的图像输出数据是RGB格式
[[[172 170 252]
[172 170 252]
[172 170 252]
...
[172 170 252]
[172 170 252]
[172 170 252]]...
[[172 170 252]
[172 170 252]
[172 170 252]
...
[172 170 252]
[172 170 252]
[172 170 252]]]# 用函数 fromfile 读取保存的二进制文件数据
[ 4.12977010e+030 7.29112900e-304 5.93185986e+014 ... -1.87318705e-257
-1.87318705e-257 -3.28014252e+125]
imdecode(buf, flags) -> retval
imencode(ext, img[, params]) -> retval, buf
import cv2
import numpy as np
# 中文文件路径
file_path = r"G:\CSDN\python\Office_skills\中文路径_中文文件\西瓜.jpg"
# 正常读取图像(失败)
# src = cv2.imread(file_path)
# 从内存中的缓冲区读取图像。
src = cv2.imdecode(np.fromfile(file_path, dtype=np.uint8), flags=cv2.IMREAD_COLOR)
# 可视化图像
cv2.imshow("src", src)
cv2.waitKey(0)
# 在中文路径中输出中文名称的文件
file_out = r"G:\CSDN\python\Office_skills\中文路径_中文文件\西瓜_输出.jpg"
# 正常保存图像
# cv2.imwrite(file_out, src)
# 将图像编码到内存缓冲区中。
out = cv2.imencode('.jpg', src)
# 将数组中的数据以二进制格式写进文件
out[1].tofile(file_out)
# 读取保存的二进制文件
y = np.fromfile(r"G:\CSDN\python\Office_skills\中文路径_中文文件\西瓜_输出.jpg", dtype=np.float)
# 解析文件转换过程
print(out) # 函数imendoce读取图像的返回数据
print(out[1]) # 将图像编码保存到内存缓冲区的数据
print(src) # 将图像编码保存到内存缓冲区的数据
print(y) # 用函数 fromfile 读取保存的二进制文件数据
>>> 如有疑问,欢迎评论区一起讨论