add font support
This commit is contained in:
191
docs/jpgbin.md
Normal file
191
docs/jpgbin.md
Normal file
@@ -0,0 +1,191 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
图像转JPG二进制文件工具
|
||||
|
||||
将图像文件转换为ST7789显示所需的JPG二进制格式(.jbin文件)
|
||||
|
||||
使用方法:
|
||||
python image2jpgbin.py input.jpg output.jbin
|
||||
python image2jpgbin.py input.png output.jbin
|
||||
|
||||
支持格式:
|
||||
- JPEG (.jpg, .jpeg)
|
||||
- PNG (.png)
|
||||
- BMP (.bmp)
|
||||
|
||||
注意:
|
||||
对于PNG/BMP等非JPEG格式,会先转换为JPEG格式,quality参数控制最终JPEG质量
|
||||
"""
|
||||
|
||||
import argparse
|
||||
import os
|
||||
import struct
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
try:
|
||||
from PIL import Image
|
||||
except ImportError:
|
||||
print("错误: 需要安装Pillow库")
|
||||
print("请运行: pip install Pillow")
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
def convert_image_to_jbin(input_path, output_path, quality=85):
|
||||
"""
|
||||
将图像文件转换为JBIN格式
|
||||
|
||||
Args:
|
||||
input_path: 输入图像文件路径
|
||||
output_path: 输出JBIN文件路径
|
||||
quality: JPEG质量(1-100)
|
||||
|
||||
Returns:
|
||||
True: 转换成功
|
||||
False: 转换失败
|
||||
"""
|
||||
try:
|
||||
# 打开图像文件
|
||||
with Image.open(input_path) as img:
|
||||
# 转换为RGB模式
|
||||
if img.mode != "RGB":
|
||||
img = img.convert("RGB")
|
||||
|
||||
# 获取图像尺寸
|
||||
width, height = img.size
|
||||
|
||||
# 创建临时JPEG文件(内存中)
|
||||
import io
|
||||
|
||||
jpeg_buffer = io.BytesIO()
|
||||
img.save(jpeg_buffer, format="JPEG", quality=quality, optimize=True)
|
||||
jpeg_data = jpeg_buffer.getvalue()
|
||||
|
||||
# 打开输出文件
|
||||
with open(output_path, "wb") as f:
|
||||
# 写入头信息(宽度和高度,小端序)
|
||||
f.write(struct.pack("<HH", width, height))
|
||||
|
||||
# 写入JPEG数据
|
||||
f.write(jpeg_data)
|
||||
|
||||
print(f"成功转换: {input_path} ({width}x{height}) -> {output_path}")
|
||||
print(f" 输出文件大小: {os.path.getsize(output_path)} 字节")
|
||||
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
print(f"转换失败: {e}")
|
||||
return False
|
||||
|
||||
|
||||
def convert_image_to_jbin(input_path, output_path, quality=85):
|
||||
"""
|
||||
将图像文件转换为JBIN格式
|
||||
|
||||
Args:
|
||||
input_path: 输入图像文件路径
|
||||
output_path: 输出JBIN文件路径
|
||||
quality: JPEG质量(1-100)
|
||||
- 对于JPEG文件: 重新压缩时使用此质量
|
||||
- 对于PNG/BMP文件: 转换为JPEG时使用此质量
|
||||
|
||||
Returns:
|
||||
True: 转换成功
|
||||
False: 转换失败
|
||||
"""
|
||||
try:
|
||||
# 打开图像文件
|
||||
with Image.open(input_path) as img:
|
||||
# 转换为RGB模式
|
||||
if img.mode != "RGB":
|
||||
img = img.convert("RGB")
|
||||
|
||||
# 获取图像尺寸
|
||||
width, height = img.size
|
||||
|
||||
# 创建临时JPEG文件(内存中)
|
||||
import io
|
||||
|
||||
jpeg_buffer = io.BytesIO()
|
||||
img.save(jpeg_buffer, format="JPEG", quality=quality, optimize=True)
|
||||
jpeg_data = jpeg_buffer.getvalue()
|
||||
|
||||
# 打开输出文件
|
||||
with open(output_path, "wb") as f:
|
||||
# 写入头信息(宽度和高度,小端序)
|
||||
f.write(struct.pack("<HH", width, height))
|
||||
|
||||
# 写入JPEG数据
|
||||
f.write(jpeg_data)
|
||||
|
||||
print(f"成功转换: {input_path} ({width}x{height}) -> {output_path}")
|
||||
print(f" 输出文件大小: {os.path.getsize(output_path)} 字节")
|
||||
print(f" JPEG质量: {quality}")
|
||||
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
print(f"转换失败: {e}")
|
||||
return False
|
||||
|
||||
|
||||
def main():
|
||||
parse = argparse.ArgumentParser(
|
||||
description="将图像文件转换为ST7789显示所需的JPG二进制格式(.jbin文件)",
|
||||
formatter_class=argparse.RawDescriptionHelpFormatter,
|
||||
epilog="""
|
||||
示例:
|
||||
# 单文件转换
|
||||
python image2jpgbin.py input.jpg output.jbin
|
||||
|
||||
# 转换非JPEG文件(PNG/BMP)
|
||||
python image2jpgbin.py input.png output.jbin
|
||||
|
||||
# 指定JPEG质量
|
||||
python image2jpgbin.py --quality 95 input.jpg output.jbin
|
||||
|
||||
输出格式(.jbin):
|
||||
偏移 大小 描述
|
||||
0x00 2 图像宽度(小端序)
|
||||
0x02 2 图像高度(小端序)
|
||||
0x04 N JPEG图像数据
|
||||
|
||||
注意:
|
||||
对于PNG/BMP等非JPEG格式,会先转换为JPEG格式,quality参数控制转换质量
|
||||
""",
|
||||
)
|
||||
|
||||
parse.add_argument("input", help="输入图像文件路径")
|
||||
parse.add_argument("output", help="输出JBIN文件路径")
|
||||
|
||||
parse.add_argument(
|
||||
"--quality",
|
||||
"-q",
|
||||
type=int,
|
||||
default=85,
|
||||
choices=range(1, 101),
|
||||
help="JPEG压缩质量(1-100),默认85",
|
||||
)
|
||||
|
||||
args = parse.parse_args()
|
||||
|
||||
# 检查输入文件是否存在
|
||||
if not os.path.isfile(args.input):
|
||||
print(f"错误: 输入文件不存在: {args.input}")
|
||||
return 1
|
||||
|
||||
# 创建输出目录(如果需要)
|
||||
output_dir = os.path.dirname(args.output)
|
||||
if output_dir and not os.path.exists(output_dir):
|
||||
os.makedirs(output_dir, exist_ok=True)
|
||||
|
||||
# 转换文件
|
||||
if convert_image_to_jbin(args.input, args.output, args.quality):
|
||||
return 0
|
||||
else:
|
||||
return 1
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(main())
|
||||
Reference in New Issue
Block a user