uv-k5-firmware-chinese-lts/uv-k5font/font-pixel-made/pic.py

141 lines
4.9 KiB
Python
Raw Normal View History

2023-11-30 06:38:27 +00:00
import math
import cv2
import sys
import os
import numpy as np
# 在获取图像路径输入之前,对路径进行解码
# 读取命令行参数
arguments = sys.argv[1] # 忽略第一个参数,因为它是脚本的名称
# 缩放倍数
scale_factor = 20 # 可根据需要调整放大倍数
# 是否输出图像内容
output_image = False
def process_file_path(file_path):
file_name_with_extension = os.path.basename(file_path) # 获取包含后缀的文件名
file_name_without_extension, extension = os.path.splitext(file_name_with_extension) # 分离文件名和后缀
# 提取不带路径的文件名
file_name_without_path = os.path.splitext(os.path.basename(file_path))[0]
return {
"file_name_with_extension": file_name_with_extension,
"file_name_without_extension": file_name_without_extension,
"file_name_without_path": file_name_without_path
}
def clear_bit(byte_value, byte_bit):
mask = ~(1 << byte_bit) # 创建一个掩码将特定位设置为0
result = byte_value & mask # 将特定位设置为0
return result
def set_bit(byte_value, byte_bit):
mask = 1 << byte_bit # 创建一个掩码将特定位设置为1
result = byte_value | mask # 将特定位设置为1
return result
# 创建一个回调函数来获取鼠标事件的坐标和操作
def get_mouse_event(event, x, y, flags, param):
global output_image
if event == cv2.EVENT_LBUTTONDOWN: # 左键点击
# 计算在原始图像中的坐标
original_x = x // scale_factor
original_y = y // scale_factor
# 反转点击位置的像素
if 0 <= original_x < image.shape[1] and 0 <= original_y < image.shape[0]:
if image[original_y, original_x] == 0: # 如果是黑色像素,变为白色
image[original_y, original_x] = 255
else: # 如果是白色像素,变为黑色
image[original_y, original_x] = 0
# 更新放大图像
scaled_img = cv2.resize(image, (0, 0), fx=scale_factor, fy=scale_factor, interpolation=cv2.INTER_NEAREST)
cv2.imshow('Scaled Image', scaled_img)
def on_space_pressed():
global output_image
output_image = True
# 获取图像路径输入
# 读取图像
#image_path = arguments
cv2.imdecode(np.fromfile(arguments, dtype=np.uint8), cv2.IMREAD_UNCHANGED)
# image_path= os.path.abspath(os.path.realpath(arguments)).encode('utf-8').decode('utf-8')
# print(image_path)
image = cv2.imread(image_path, 0) # 以灰度模式读取图像
if image is None:
print(f"Error: Couldn't read the image from path: {image_path}")
sys.exit(1) # Exit the script with an error code
image2=image.copy()
if image is None:
print("Error: Couldn't read the image.")
else:
result = process_file_path(image_path)
filename = result["file_name_without_path"]
# 创建放大图像
scaled_image = cv2.resize(image, (0, 0), fx=scale_factor, fy=scale_factor, interpolation=cv2.INTER_NEAREST)
# 创建窗口并将回调函数与窗口绑定
cv2.namedWindow('Scaled Image')
cv2.setMouseCallback('Scaled Image', get_mouse_event)
# 显示放大后的图像
cv2.imshow('Scaled Image', scaled_image)
while True:
key = cv2.waitKey(1)
if key == ord(' '): # 当按下空格键时
cv2.imwrite(image_path, image)
_, image = cv2.threshold(image, 127, 255, cv2.THRESH_BINARY)
height, width = image.shape
byte_value = 0
byte_bit = 0
print("{",end="")
for i in range(math.ceil(height / 8)* width) :
if i >= height // 8*width :
now_height = height - math.floor(height / 8) * 8
else:
now_height = 8
now_col = i % width
for j in range(now_height):
if j + i // width*8==10:
print(i,j,now_height)
if image[j + i // width*8,now_col] == 255:
byte_value= set_bit(byte_value, byte_bit)
else:
byte_value= clear_bit(byte_value, byte_bit)
byte_bit = byte_bit + 1
if byte_bit == 8:
byte_bit = 0
print("0x",end="")
print(hex(byte_value)[2:].zfill(2),end=",") # 输出两位十六进
if byte_bit % 8 != 0:
print(hex(byte_value)[2:].zfill(2),end="},/*") # 输出两位十六进
else:
print("",end="},/*") # 输出两位十六进
print(filename,end="*/\n")
break
elif key == 27: # 按下ESC键退出
break
elif key == ord('B') or key == ord('b'):
image=image2.copy()
scaled_img = cv2.resize(image, (0, 0), fx=scale_factor, fy=scale_factor, interpolation=cv2.INTER_NEAREST)
cv2.imshow('Scaled Image', scaled_img)
cv2.destroyAllWindows()