import gradio as gr from PIL import Image, ImageDraw, ImageFont import cv2 import numpy as np import time import random import os import requests # Muat gambar dasar (gambar.png) gambar_dasar = cv2.imread("gambar.png") def tambahkan_teks_di_tengah_dengan_offset_y(teks, email): # Konversi gambar OpenCV (numpy array) ke PIL image print(email) url = "https://daurah.al-wafi.sch.id/api/cert/" + email response = requests.get(url) data = response.json() if data.get("message") == "not eligible": return "Error" gambar = cv2.imread("gambar.png") offset_y = -240 gambar_pil = Image.fromarray(cv2.cvtColor(gambar, cv2.COLOR_BGR2RGB)) draw = ImageDraw.Draw(gambar_pil) # Gunakan font yang mendukung karakter Arab font_path = "Arial.ttf" # Ganti dengan path ke file font .ttf Anda font_size = 68 # Ukuran font font = ImageFont.truetype(font_path, font_size) # Ukur ukuran teks lebar_teks, tinggi_teks = draw.textsize(teks, font=font) # Hitung posisi teks tinggi, lebar = gambar.shape[:2] posisi_x = (lebar - lebar_teks) // 2 posisi_y = (tinggi - tinggi_teks) // 2 + offset_y # Tambahkan teks ke gambar draw.text((posisi_x, posisi_y), teks, font=font, fill="black") # Konversi kembali ke gambar OpenCV (numpy array) gambar = cv2.cvtColor(np.array(gambar_pil), cv2.COLOR_RGB2BGR) #Buat nama file hasil dengan nomor acak current_time = int(time.time()) random_numbers = ''.join(random.choices('0123456789', k=5)) hasil_filename = f'{teks}_{random_numbers}.jpeg' hasil_path = os.path.join('static', 'cert2', hasil_filename) height, width = gambar.shape[:2] center_x = width // 2 center_y = height // 2 new_width = width // 2 new_height = height // 2 # Mengubah ukuran gambar gambar = cv2.resize(gambar, (new_width, new_height)) cv2.imwrite(hasil_path, gambar) return cv2.cvtColor(np.array(gambar), cv2.COLOR_RGB2BGR) # Fungsi untuk menambahkan teks ke gambar def tambahkan_teks(text, offset_y, font_size=68): img = cv2.imread("gambar.png") offset_y = -240 img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)) draw = ImageDraw.Draw(img) # Gunakan font (pastikan Anda memiliki Arial.ttf atau font yang mendukung karakter Arab) font_path = "Arial.ttf" font = ImageFont.truetype(font_path, font_size) # Hitung posisi teks lebar_teks, tinggi_teks = draw.textsize(text, font=font) tinggi, lebar = img.size posisi_x = (lebar - lebar_teks) // 2 posisi_y = (tinggi - tinggi_teks) // 2 + offset_y # Tambahkan teks draw.text((posisi_x, posisi_y), text, font=font, fill="black") # Simpan gambar dengan nama file unik current_time = int(time.time()) random_numbers = ''.join(random.choices('0123456789', k=5)) hasil_filename = f'{text}_{random_numbers}.jpeg' hasil_path = os.path.join('cert2', hasil_filename) img.save(hasil_path) return cv2.cvtColor(np.array(img), cv2.COLOR_RGB2BGR) # Gradio interface with gr.Blocks() as demo: gr.Markdown("# Tambahkan Nama ke Sertifikat (Hanya sekali download). Tombol download ada di sisi kanan atas sertifikat (Hanya Sekali Download)") with gr.Row(): text_input = gr.Textbox(label="Nama (Arab)") # Input teks tanpa nilai awal email_input = gr.Textbox(label="Email") offset_y_input = gr.Slider(-1500, 300, value=-240, step=10, label="Offset Vertikal (Y)") font_size_input = gr.Slider(30, 100, value=68, step=5, label="Ukuran Font") image_output = gr.Image(label="Hasil") btn_process = gr.Button("Proses Sertifikat") btn_process.click( tambahkan_teks_di_tengah_dengan_offset_y, inputs=[text_input, email_input], outputs=image_output, ) demo.launch(debug=True)