十六进制转图片异常:多文件输出相同,求技术解决方案
十六进制转图片时所有输出图相同的解决方案
核心问题分析
你代码里的致命错误是:image_file.write(data)返回的是写入的字节数(整数),你把这个整数赋值给img后,用cv2.resize处理整数——这完全不符合OpenCV的图像处理逻辑,最终所有文件都会生成基于这个错误值的相同图片。此外还有路径转义、文件读取模式的潜在问题。
修复后的代码
import binascii import cv2 import os import numpy as np from tkinter import Tk, filedialog # 隐藏默认根窗口 root = Tk() root.withdraw() # 选择多个txt文件 file_paths = filedialog.askopenfilenames( initialdir=r"C:\Binaries\Hexadecimal_Text_Files", # 用原始字符串避免路径转义错误 title="选择文本文件", filetypes=(('文本文件', '*.txt'),) ) for x in file_paths: # 读取并解析十六进制数据 with open(x, 'r', encoding='utf-8') as tf: # 指定编码和读取模式,避免乱码 data = tf.read() # 清理数据:移除空格和换行符 data = data.replace(' ', '').replace('\n', '') # 十六进制字符串转字节串 byte_data = binascii.a2b_hex(data) # 生成输出图片路径 pathname, _ = os.path.splitext(x) filename = os.path.basename(pathname) # 用系统API获取文件名,兼容不同系统 output_path = os.path.join(r"C:\Binaries\Images", f"{filename}.png") # 安全拼接路径 # 情况1:十六进制数据是合法PNG字节流 with open(output_path, 'wb') as img_file: img_file.write(byte_data) # 读取图片并调整大小(确保图片合法) img = cv2.imread(output_path) if img is not None: resized_img = cv2.resize(img, (500, 500)) cv2.imwrite(output_path, resized_img) else: print(f"警告:{output_path} 无法被识别为有效图片,请检查十六进制数据格式") # 情况2:如果十六进制是原始像素数据(比如RGB像素的十六进制),替换上面的写入和调整逻辑: # height, width = 256, 256 # 根据你的像素尺寸修改 # img_array = np.frombuffer(byte_data, dtype=np.uint8).reshape(height, width, 3) # resized_img = cv2.resize(img_array, (500, 500)) # cv2.imwrite(output_path, resized_img)
关键修复点
- 修正图像对象获取逻辑:放弃直接用
write()的返回值,改用cv2.imread读取写入的图片后再处理。 - 路径处理优化:用原始字符串
r"路径"和os.path.join避免转义错误,兼容不同操作系统。 - 文件读取规范:指定编码和读取模式,避免文本读取时的乱码问题。
- 添加合法性检查:判断图片是否读取成功,避免非法数据导致的崩溃。
内容的提问来源于stack exchange,提问作者Salaar Imran
相关产品推荐
相关产品推荐

