uv-k5-firmware-chinese-lts/uv-k5font/font-pixel-made/pic.py
2023-11-30 14:38:27 +08:00

140 lines
4.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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()