Add files via upload

This commit is contained in:
2025-04-09 21:33:52 +03:00
committed by GitHub
parent b31a632f4b
commit 2ed02e2a05
3 changed files with 238 additions and 0 deletions

227
main.py Normal file
View File

@@ -0,0 +1,227 @@
import sys
import os
import random
import json
from PyQt6.QtWidgets import (QApplication, QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QLineEdit, QLabel,
QSpinBox, QComboBox, QColorDialog, QFileDialog, QGraphicsView, QGraphicsScene,
QGraphicsTextItem, QGraphicsRectItem, QSlider, QGraphicsItem)
from PyQt6.QtCore import Qt
from PyQt6.QtGui import QColor, QFont, QImage, QPainter, QPixmap
from PIL import Image, ImageDraw, ImageFont
class FontConverter(QWidget):
def __init__(self):
super().__init__()
# Default parameters
self.default_cell_width = 16
self.default_cell_height = 16
self.default_text_color = QColor(255, 255, 255)
self.default_bg_color = QColor(0, 0, 0)
self.default_format = "TIFF"
self.font_path = "PxPlus_IBM_VGA_8x16.ttf" # Ensure the font is available
self.presets = self.load_presets()
self.preview_char = random.choice(self.presets.get('Latin', ''))
self.init_ui()
def load_presets(self):
try:
with open('presets.json', 'r', encoding='utf-8') as f:
data = json.load(f)
return data.get('Presets', {})
except Exception as e:
print(f"Failed to load presets: {e}")
return {}
def init_ui(self):
self.setWindowTitle("Font Converter")
self.setGeometry(100, 100, 600, 500)
# Layouts
main_layout = QVBoxLayout()
settings_layout = QVBoxLayout()
# Font selection
self.font_select_button = QPushButton("Select Font")
self.font_select_button.clicked.connect(self.select_font)
self.font_label = QLabel(f"Selected Font: {self.font_path}")
settings_layout.addWidget(self.font_label)
settings_layout.addWidget(self.font_select_button)
# Cell size controls
settings_layout.addWidget(QLabel("Cell size"))
self.cell_width_spin = QSpinBox()
self.cell_width_spin.setValue(self.default_cell_width)
self.cell_width_spin.valueChanged.connect(self.update_preview)
self.cell_height_spin = QSpinBox()
self.cell_height_spin.setValue(self.default_cell_height)
self.cell_height_spin.valueChanged.connect(self.update_preview)
settings_layout.addWidget(QLabel("Width"))
settings_layout.addWidget(self.cell_width_spin)
settings_layout.addWidget(QLabel("Height"))
settings_layout.addWidget(self.cell_height_spin)
# Color pickers
settings_layout.addWidget(QLabel("Text color"))
self.text_color_button = QPushButton("Select Text Color")
self.text_color_button.clicked.connect(self.select_text_color)
settings_layout.addWidget(self.text_color_button)
settings_layout.addWidget(QLabel("Background color"))
self.bg_color_button = QPushButton("Select Background Color")
self.bg_color_button.clicked.connect(self.select_bg_color)
settings_layout.addWidget(self.bg_color_button)
# Offset controls
settings_layout.addWidget(QLabel("Symbol offset"))
self.offset_x_slider = QSlider(Qt.Orientation.Horizontal)
self.offset_x_slider.setMinimum(0)
self.offset_x_slider.setMaximum(64)
self.offset_x_slider.setValue(0)
self.offset_x_slider.valueChanged.connect(self.update_preview)
self.offset_y_slider = QSlider(Qt.Orientation.Horizontal)
self.offset_y_slider.setMinimum(0)
self.offset_y_slider.setMaximum(64)
self.offset_y_slider.setValue(0)
self.offset_y_slider.valueChanged.connect(self.update_preview)
settings_layout.addWidget(QLabel("Offset X"))
settings_layout.addWidget(self.offset_x_slider)
settings_layout.addWidget(QLabel("Offset Y"))
settings_layout.addWidget(self.offset_y_slider)
# Preset selection
self.preset_combo = QComboBox()
self.preset_combo.addItems(self.presets.keys())
self.preset_combo.currentTextChanged.connect(self.update_symbols_from_preset)
settings_layout.addWidget(QLabel("Select Preset"))
settings_layout.addWidget(self.preset_combo)
# Symbol range input
self.symbol_input = QLineEdit(self.preview_char)
self.symbol_input.setFixedHeight(80)
settings_layout.addWidget(self.symbol_input)
# Format selection
self.format_combo = QComboBox()
self.format_combo.addItems(["TIFF", "PNG", "BMP"])
self.format_combo.setCurrentText(self.default_format)
settings_layout.addWidget(QLabel("Image Format"))
settings_layout.addWidget(self.format_combo)
# Output folder input
self.output_folder_input = QLineEdit()
self.output_folder_button = QPushButton("Select Output Folder")
self.output_folder_button.clicked.connect(self.select_output_folder)
folder_layout = QHBoxLayout()
folder_layout.addWidget(self.output_folder_input)
folder_layout.addWidget(self.output_folder_button)
settings_layout.addLayout(folder_layout)
# Generate button
self.generate_button = QPushButton("Generate Images")
self.generate_button.clicked.connect(self.generate_images)
settings_layout.addWidget(self.generate_button)
# Preview
self.preview_scene = QGraphicsScene()
self.preview_view = QGraphicsView(self.preview_scene)
settings_layout.addWidget(self.preview_view)
main_layout.addLayout(settings_layout)
self.setLayout(main_layout)
self.update_preview()
def update_preview(self):
# Clear preview scene
self.preview_scene.clear()
# Get current parameters
width = self.cell_width_spin.value()
height = self.cell_height_spin.value()
offset_x = self.offset_x_slider.value()
offset_y = self.offset_y_slider.value()
# Create background rectangle
bg_color = self.default_bg_color
self.preview_scene.addItem(QGraphicsRectItem(0, 0, width, height).setBrush(bg_color))
# Add preview character
preview_text_item = QGraphicsTextItem(self.preview_char)
preview_text_item.setPos(offset_x, offset_y)
preview_text_item.setDefaultTextColor(self.default_text_color)
preview_text_item.setFont(QFont(self.font_path, height - 2)) # Adjust font size
self.preview_scene.addItem(preview_text_item)
def update_symbols_from_preset(self, preset_name):
# Update symbol input field based on selected preset
symbols = self.presets.get(preset_name, "")
self.symbol_input.setText(symbols)
self.preview_char = random.choice(symbols)
self.update_preview()
def select_font(self):
font, _ = QFileDialog.getOpenFileName(self, "Select Font", "", "Font Files (*.ttf *.otf)")
if font:
self.font_path = font
self.font_label.setText(f"Selected Font: {font}")
self.update_preview()
def select_text_color(self):
color = QColorDialog.getColor()
if color.isValid():
self.default_text_color = color
self.update_preview()
def select_bg_color(self):
color = QColorDialog.getColor()
if color.isValid():
self.default_bg_color = color
self.update_preview()
def select_output_folder(self):
folder = QFileDialog.getExistingDirectory(self, "Select Output Folder")
if folder:
self.output_folder_input.setText(folder)
def generate_images(self):
width = self.cell_width_spin.value()
height = self.cell_height_spin.value()
offset_x = self.offset_x_slider.value()
offset_y = self.offset_y_slider.value()
text_color = self.default_text_color
bg_color = self.default_bg_color
symbols = self.symbol_input.text()
output_folder = self.output_folder_input.text()
image_format = self.format_combo.currentText()
if not os.path.exists(output_folder):
print("Output folder does not exist!")
return
try:
font = ImageFont.truetype(self.font_path, height - 2)
except Exception as e:
print(f"Failed to load font: {e}")
return
for char in symbols:
if char.isspace():
continue
img = Image.new("RGBA", (width, height), bg_color.getRgb()[:3])
draw = ImageDraw.Draw(img)
draw.text((offset_x, offset_y), char, font=font, fill=text_color.getRgb()[:3])
safe_char = f"U+{ord(char):04X}"
img.save(os.path.join(output_folder, f"{safe_char}.{image_format.lower()}"), format=image_format)
print("Images successfully generated.")
if __name__ == "__main__":
app = QApplication(sys.argv)
window = FontConverter()
window.show()
sys.exit(app.exec())