import sys
import json
import math
import colorsys
from PySide6.QtWidgets import (QApplication, QMainWindow, QLabel, QPushButton,
QFileDialog, QWidget, QVBoxLayout, QHBoxLayout, QListWidget, QListWidgetItem,
QGraphicsDropShadowEffect)
from PySide6.QtGui import QPixmap, QImage, QColor, QMouseEvent, QPainter, QPen,
QIcon
from PySide6.QtCore import Qt, QPoint
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
from collections import Counter
from PIL import Image
import numpy as np
# Embedded Pantone colors (partial sample, expand to full ~2800 colors as needed)
PANTONE_COLORS = [
{"name": "Pantone Yellow C", "hex": "#F6EB61", "rgb": [246, 235, 97]},
{"name": "Pantone Warm Red C", "hex": "#F9423A", "rgb": [249, 66, 58]},
{"name": "Pantone Cool Gray 7 C", "hex": "#97999B", "rgb": [151, 153, 155]},
{"name": "Pantone Process Blue C", "hex": "#0085CA", "rgb": [0, 133, 202]}
# Add more Pantone entries here or load from embedded JSON
]
def rgb_to_hsv(r, g, b):
return tuple(round(i * 100, 2) for i in colorsys.rgb_to_hsv(r / 255., g / 255.,
b / 255.))
def closest_pantone(r, g, b):
min_dist = float('inf')
closest = None
for pantone in PANTONE_COLORS:
pr, pg, pb = pantone["rgb"]
dist = math.sqrt((r - pr)**2 + (g - pg)**2 + (b - pb)**2)
if dist < min_dist:
min_dist = dist
closest = pantone
return closest
class PieChartCanvas(FigureCanvas):
def __init__(self, data):
fig = Figure(figsize=(3, 3), tight_layout=True)
super().__init__(fig)
self.axes = fig.add_subplot(111)
self.plot(data)
def plot(self, data):
colors = [f'#{r:02x}{g:02x}{b:02x}' for r, g, g in data.keys()]
labels = [f'{color}\n{count}' for color, count in zip(colors,
data.values())]
self.axes.clear()
self.axes.pie(data.values(), labels=labels, colors=colors,
wedgeprops={'edgecolor': 'black'})
self.draw()
class ImageLabel(QLabel):
def __init__(self, parent):
super().__init__(parent)
self.setAlignment(Qt.AlignCenter)
self.setStyleSheet("background-color: #0D1B2A; border: 2px dashed
#E71D36;")
self.setMouseTracking(True)
self.crosshair_pos = None
def set_image(self, path):
self.pixmap_obj = QPixmap(path)
self.setPixmap(self.pixmap_obj)
self.image = Image.open(path)
self.np_image = np.array(self.image)
def mousePressEvent(self, event):
if self.pixmap() and event.button() == Qt.LeftButton:
self.crosshair_pos = event.pos()
img_x = int(event.position().x())
img_y = int(event.position().y())
if 0 <= img_x < self.image.width and 0 <= img_y < self.image.height:
r, g, b = self.np_image[img_y, img_x][:3]
hsv = rgb_to_hsv(r, g, b)
pantone = closest_pantone(r, g, b)
self.parent().update_color_display((r, g, b), hsv, pantone)
self.update()
def paintEvent(self, event):
super().paintEvent(event)
if self.crosshair_pos:
painter = QPainter(self)
pen = QPen(QColor("#F0F0F0"))
pen.setWidth(1)
painter.setPen(pen)
x, y = self.crosshair_pos.x(), self.crosshair_pos.y()
painter.drawLine(x - 10, y, x + 10, y)
painter.drawLine(x, y - 10, x, y + 10)
class ColorDefinerApp(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("Ethnic DOQUMA© Color Definer")
self.setStyleSheet("background-color: #0D1B2A; color: #F0F0F0;")
self.setGeometry(100, 100, 1200, 800)
self.setWindowIcon(QIcon("icon.png"))
self.init_ui()
def init_ui(self):
main_widget = QWidget()
self.setCentralWidget(main_widget)
layout = QVBoxLayout(main_widget)
self.header = QLabel("Ethnic DOQUMA© Color Definer")
self.header.setStyleSheet("font-size: 24px; color: #F0F0F0; text-align:
center;")
self.header.setAlignment(Qt.AlignCenter)
self.image_label = ImageLabel(self)
self.upload_btn = QPushButton("Resim Yükle")
self.upload_btn.setStyleSheet("background-color: #E71D36; color: white;
border-radius: 10px;")
self.upload_btn.clicked.connect(self.load_image)
self.color_info = QLabel("Seçilen Piksel\nHEX: #FFFFFF\nRGB: (255,255,255)\
nHSV: (0,0,100)")
self.list_label = QLabel("Renkler")
self.color_list = QListWidget()
self.chart_label = QLabel("Renk Dağılımı")
self.pie_chart = PieChartCanvas({})
self.pantone_label = QLabel("Yakın Pantone: -")
# Footer
footer = QLabel("2025© J.U.S.T.I.C.E. Technology Laboratories\nDesigned By
Shadow Of The Valeyard\nDeveloped By Mehmet Hasan Can LEVENT")
footer.setAlignment(Qt.AlignCenter)
footer.setStyleSheet("font-size: 10px; color: #F0F0F0;")
layout.addWidget(self.header)
layout.addWidget(self.upload_btn)
layout.addWidget(self.image_label)
layout.addWidget(self.color_info)
layout.addWidget(self.list_label)
layout.addWidget(self.color_list)
layout.addWidget(self.chart_label)
layout.addWidget(self.pie_chart)
layout.addWidget(self.pantone_label)
layout.addWidget(footer)
def load_image(self):
path, _ = QFileDialog.getOpenFileName(self, "Select Image", "", "Images
(*.png *.jpg *.jpeg)")
if path:
self.image_label.set_image(path)
self.analyze_image()
def analyze_image(self):
data = np.array(self.image_label.image)
data = data.reshape((-1, 3))
counts = Counter(map(tuple, data))
top_colors = dict(counts.most_common(20))
self.color_list.clear()
for color, count in top_colors.items():
hex_code = '#{:02x}{:02x}{:02x}'.format(*color)
item = QListWidgetItem(f"{hex_code} ({count})")
item.setBackground(QColor(*color))
self.color_list.addItem(item)
self.pie_chart.plot(top_colors)
def update_color_display(self, rgb, hsv, pantone):
hex_code = '#{:02X}{:02X}{:02X}'.format(*rgb)
self.color_info.setText(f"Seçilen Piksel\nHEX: {hex_code}\nRGB: {rgb}\nHSV:
{hsv}")
if pantone:
self.pantone_label.setText(f"Yakın Pantone: {pantone['name']}
({pantone['hex']})")
if __name__ == "__main__":
app = QApplication(sys.argv)
window = ColorDefinerApp()
window.show()
sys.exit(app.exec())