103 lines
3.2 KiB
Python
103 lines
3.2 KiB
Python
# -*- coding:utf-8 -*-
|
||
# @Author len
|
||
# @Create 2023/10/26 9:18
|
||
|
||
from PIL import Image
|
||
import numpy as np
|
||
import os
|
||
|
||
def convert_jpg_to_bin(input_file, output_file, max_width, max_height):
|
||
# 打开JPEG图像
|
||
image = Image.open(input_file)
|
||
print(f"Processing: {input_file}")
|
||
|
||
# 限制图像尺寸
|
||
image.thumbnail((max_width, max_height))
|
||
|
||
# 将图像转换为RGB模式
|
||
image = image.convert("RGB")
|
||
|
||
# 创建一个空白的16位彩色图像
|
||
result_image = np.zeros((image.size[1], image.size[0]), dtype=np.uint16)
|
||
|
||
# 遍历图像的每个像素
|
||
for y in range(image.size[1]):
|
||
for x in range(image.size[0]):
|
||
# 获取RGB值
|
||
r, g, b = image.getpixel((x, y))
|
||
|
||
# 将RGB值转换为RGB565格式
|
||
pixel_value = ((r & 0b11111000) << 8) | ((g & 0b11111100) << 3) | (b >> 3)
|
||
|
||
# 将RGB565值存储到16位彩色图像中
|
||
result_image[y, x] = pixel_value
|
||
|
||
# 将三维数组展平为一维数组
|
||
flattened_array = result_image.flatten()
|
||
|
||
# 保存为BIN文件
|
||
with open(output_file, "wb") as file:
|
||
file.write(flattened_array.tobytes())
|
||
|
||
def ensure_jpg_format(input_path, temp_dir):
|
||
# 确保文件是JPEG格式,如果不是则转换为JPEG
|
||
with Image.open(input_path) as img:
|
||
if img.format != "JPEG":
|
||
base_name = os.path.splitext(os.path.basename(input_path))[0]
|
||
jpg_path = os.path.join(temp_dir, f"{base_name}.jpg")
|
||
img = img.convert("RGB") # 转换为RGB模式
|
||
img.save(jpg_path, "JPEG")
|
||
print(f"Converted to JPEG: {jpg_path}")
|
||
return jpg_path
|
||
return input_path
|
||
|
||
def get_sort_key(filename):
|
||
# 提取文件名前两位数字用于排序
|
||
base_name = os.path.splitext(filename)[0]
|
||
try:
|
||
# 尝试将前两位数字转换为整数
|
||
return int(base_name[:2])
|
||
except ValueError:
|
||
# 如果无法转换为数字,则返回一个较大的默认值
|
||
return float('inf')
|
||
|
||
# 使用示例
|
||
input_file = r"C:\Users\10561\Desktop\002\任务2" # 图片地址
|
||
temp_dir = os.path.join(input_file, "temp") # 临时目录
|
||
output_dir = os.path.join(input_file, "bin") # 输出目录
|
||
|
||
os.makedirs(temp_dir, exist_ok=True) # 创建临时目录
|
||
os.makedirs(output_dir, exist_ok=True) # 创建输出目录
|
||
|
||
max_width = 800
|
||
max_height = 480
|
||
|
||
# 获取文件列表并忽略目录,同时按照前两位数字排序
|
||
files = sorted(
|
||
[file for file in os.listdir(input_file) if os.path.isfile(os.path.join(input_file, file))],
|
||
key=get_sort_key
|
||
)
|
||
|
||
for file in files:
|
||
print(file)
|
||
if file in ["System Volume Information"] or ".bin" in file:
|
||
continue
|
||
|
||
portion = os.path.splitext(file)
|
||
input001 = os.path.join(input_file, file)
|
||
|
||
# 确保输入文件是JPEG格式
|
||
jpg_file = ensure_jpg_format(input001, temp_dir)
|
||
|
||
# 生成输出文件路径
|
||
out001 = os.path.join(output_dir, f"{portion[0]}.bin")
|
||
print(f"Output BIN: {out001}")
|
||
|
||
# 转换为BIN文件
|
||
convert_jpg_to_bin(jpg_file, out001, max_width, max_height)
|
||
|
||
# 清理临时目录
|
||
for temp_file in os.listdir(temp_dir):
|
||
os.remove(os.path.join(temp_dir, temp_file))
|
||
os.rmdir(temp_dir)
|