stablediffusionapi / demo_generate /halftone_method.py
yusufgundogdu's picture
Update demo_generate/halftone_method.py
650c1f2 verified
import io
import logging
from datetime import datetime
from PIL import Image, ImageDraw, ImageOps
import numpy as np
logger = logging.getLogger(__name__)
def apply_halftone(image, dot_size=10):
"""Görüntüye halftone efekti uygular"""
start_time = datetime.now()
logger.info(f"Applying halftone effect - {start_time}")
try:
# Eğer image bir dosya verisi (bytes) ise Image'a dönüştür
if isinstance(image, bytes):
image = Image.open(io.BytesIO(image))
# Görüntüyü gri tonlamalı yap
if image.mode != 'L':
image = image.convert('L')
# Orijinal boyutları sakla
orig_width, orig_height = image.size
# Yeniden boyutlandırma faktörü
resize_factor = dot_size / 5
# Geçici olarak küçült
small_width = int(orig_width / resize_factor)
small_height = int(orig_height / resize_factor)
small_image = image.resize((small_width, small_height), Image.BILINEAR)
# Yeni görüntü oluştur
output_image = Image.new('L', (orig_width, orig_height), 255)
draw = ImageDraw.Draw(output_image)
# Halftone noktalarını çiz
for y in range(small_height):
for x in range(small_width):
# Piksel parlaklığını al
brightness = 255 - small_image.getpixel((x, y))
# Nokta boyutunu hesapla
radius = int((brightness / 255) * (dot_size / 2))
# Noktayı çiz
if radius > 0:
center_x = int((x * resize_factor) + (resize_factor / 2))
center_y = int((y * resize_factor) + (resize_factor / 2))
bbox = [
center_x - radius,
center_y - radius,
center_x + radius,
center_y + radius
]
draw.ellipse(bbox, fill=0)
duration = (datetime.now() - start_time).total_seconds()
logger.info(f"Successfully processed. Duration: {duration} seconds")
return output_image
except Exception as e:
logger.error(f"Halftone processing error: {str(e)}", exc_info=True)
raise