imdecode、imencode、.tofile、fromfile 读取并保存 & 中文路径的中文名称的文件 & 一步一步解析并对比函数的结果

本文涉及的函数如下:

  1. cv2.imdecode                   # 从内存中的缓冲区读取图像。
  2. cv2.imencode                   # 将图像编码到内存缓冲区中。
  3. .tofile                                # 将数组中的数据以二进制格式写进文件
  4. np.fromfile                        # 从文本或二进制文件中的数据构造数组。

目录

一、比较 imdecode、imencode 和 imread、imwrite

(1) 定义中文文件路径

(2)# 正常读取图像(读取失败)

(3)从内存中的缓冲区读取图像(读取成功)

(4)定义输出中文文件的中文路径

(5)正常保存图像(保存失败)

(6)将图像编码到内存缓冲区中

(7)将数组中的数据以二进制格式写进文件(保存成功)

(8)函数 fromfile 读取保存的二进制文件

二、解析文件转换的数据

三、官方解析函数 imdecode and imencode

(1)函数 imdecode

(2)函数 imencode

四、完整代码


一、比较 imdecode、imencode 和 imread、imwrite

(1) 定义中文文件路径

file_path = r"G:\CSDN\python\Office_skills\中文路径_中文文件\西瓜.jpg"

(2)# 正常读取图像(读取失败)

src = cv2.imread(file_path)

# 可视化图像
cv2.imshow("src", src)
cv2.waitKey(0)

(3)从内存中的缓冲区读取图像(读取成功)

src = cv2.imdecode(np.fromfile(file_path, dtype=np.uint8), flags=cv2.IMREAD_COLOR)

# 可视化图像
cv2.imshow("src", src)
cv2.waitKey(0)

imdecode、imencode、.tofile、fromfile 读取并保存 & 中文路径的中文名称的文件 & 一步一步解析并对比函数的结果_第1张图片

(4)定义输出中文文件的中文路径

file_out = r"G:\CSDN\python\Office_skills\中文路径_中文文件\西瓜_输出.jpg"

(5)正常保存图像(保存失败)

cv2.imwrite(file_out, src)

(6)将图像编码到内存缓冲区中

out = cv2.imencode('.jpg', src)

(7)将数组中的数据以二进制格式写进文件(保存成功)

out[1].tofile(file_out)

imdecode、imencode、.tofile、fromfile 读取并保存 & 中文路径的中文名称的文件 & 一步一步解析并对比函数的结果_第2张图片

(8)函数 fromfile 读取保存的二进制文件

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 and imencode

(1)函数 imdecode

imdecode(buf, flags) -> retval

  • 从内存中的缓冲区读取图像。
  • 函数 imdecode 从内存中的指定缓冲区读取图像。 如果缓冲区太短或包含无效数据,函数返回一个空矩阵( Mat::data==NULL )。
  • 有关支持的格式和标志描述的列表,请参见 cv::imread。
  • @note 在彩色图像的情况下,解码后的图像将以 **B G R** 顺序存储通道。
  • @param buf 输入数组或字节向量。
  • @param flags 与 cv::imread 中相同的标志,请参阅 cv::ImreadModes。

(2)函数 imencode

imencode(ext, img[, params]) -> retval, buf

  • 将图像编码到内存缓冲区中。
  • 函数 imencode 压缩图像并将其存储在调整大小以适应结果的内存缓冲区中。
  • 请参阅 cv::imwrite 以获取支持的格式列表和标志描述。
  • @param ext 定义输出格式的文件扩展名。(.txt、.png、.jpg ...)
  • @param img 要写入的图像。
  • @param buf 调整大小以适应压缩图像的输出缓冲区。
  • @param params 格式特定的参数。 参见 cv::imwrite 和 cv::ImwriteFlags。

四、完整代码

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 读取保存的二进制文件数据

>>> 如有疑问,欢迎评论区一起讨论

你可能感兴趣的:(python_skills,opencv_python,opencv,图像处理,python)