File size: 4,305 Bytes
a5a74d1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
import requests
import base64
import numpy as np
from PIL import Image
from io import BytesIO
import gradio as gr

# Định nghĩa API và token cho việc gọi upscale
OCTOAI_TOKEN = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IjNkMjMzOTQ5In0.eyJzdWIiOiI2N2M0ODE1Yi1lY2VkLTQzOGMtODJjNi00MmJhYzQwNDYyY2MiLCJ0eXBlIjoidXNlckFjY2Vzc1Rva2VuIiwidGVuYW50SWQiOiJjOWQ4YjZiNi1mZWRlLTQzYmEtYmI3OS00Y2EwNWEwMDRmZTAiLCJ1c2VySWQiOiI2NDIxOTBlZi1hZTMxLTRjYTctYjUzZS0yZmIzNDhjZmQ5MjUiLCJhcHBsaWNhdGlvbklkIjoiYTkyNmZlYmQtMjFlYS00ODdiLTg1ZjUtMzQ5NDA5N2VjODMzIiwicm9sZXMiOlsiRkVUQ0gtUk9MRVMtQlktQVBJIl0sInBlcm1pc3Npb25zIjpbIkZFVENILVBFUk1JU1NJT05TLUJZLUFQSSJdLCJhdWQiOiIzZDIzMzk0OS1hMmZiLTRhYjAtYjdlYy00NmY2MjU1YzUxMGUiLCJpc3MiOiJodHRwczovL2lkZW50aXR5Lm9jdG8uYWkiLCJpYXQiOjE3MjYzNjkyODd9.ZHL9Vd31oeaBC0aDr9N0WzcuxTn96mLbX2SxDYzcf5tZjWfX2oc3OFSrIh1nxN_CWgTlP4ISMsGXp5ees3hqW48G2KsB5HlyywpVdL2J6ChqSRqWDmPV4aVo4sz9It_sc7FvtFRd1VKA7kGffXwiRN3yuIGsxegmxHzNWZWebOA1ArrcfmraojZ_QK5qDu-bF4HeqtpJ7c2Lkyh4rY2S5UKsIjxdRKrmb0QaSjjv5NDzd7zIaq0x1SIaxj2GcHIEhZ3Ex5hAMi3gfKkn5gRJewtNd1kZLBK2OPm-6dEP6BFfNKJ4jSoMvL7bR8C16KExe1MiQlLbFutPsjKoGRDvJw"
url = "https://image.octoai.run/upscaling"
headers = {
    "Content-Type": "application/json",
    "Authorization": f"Bearer {OCTOAI_TOKEN}"
}

# Độ phân giải tùy chọn
resolution_options = {
    "1K": 1024,
    "2K": 2048,
    "4K": 4096,
    "8K": 8192
}

# Hàm gửi yêu cầu đến API và nhận kết quả
def upscale(image, resolution):
    model = "real-esrgan-x4-v3"  # Mô hình mặc định

    # Kích thước ảnh hiện tại
    width, height = image.size

    # Độ phân giải mục tiêu
    target_resolution = resolution_options[resolution]

    # Kiểm tra xem ảnh gốc có lớn hơn kích thước 2048x2048 không
    if width > 2048 or height > 2048:
        scale_factor = 1
        print(f"Image is larger than 2048x2048. Using scale factor: {scale_factor}")
    # Kiểm tra nếu ảnh gốc lớn hơn độ phân giải mục tiêu mà người dùng đã chọn
    elif width > target_resolution or height > target_resolution:
        scale_factor = 1
        print(f"Image is larger than the selected resolution ({resolution}). Using scale factor: {scale_factor}")
    else:
        # Tính scale factor dựa trên kích thước ảnh đầu vào và độ phân giải mục tiêu
        scale_factor_width = target_resolution // width
        scale_factor_height = target_resolution // height
        scale_factor = min(scale_factor_width, scale_factor_height)  # Sử dụng scale nhỏ nhất giữa chiều rộng và chiều cao

        if scale_factor < 1:
            scale_factor = 1  # Đảm bảo scale tối thiểu là 1

        print(f"Calculated scale factor: {scale_factor}")

    # Convert PIL image to base64
    buffered = BytesIO()
    image.save(buffered, format="PNG")
    img_str = base64.b64encode(buffered.getvalue()).decode("utf-8")
    
    payload = {
        "model": model,
        "scale": scale_factor,  # Gửi scale tính toán hoặc mặc định là 1
        "init_image": img_str,
        "output_image_encoding": "png"
    }

    response = requests.post(url, json=payload, headers=headers)
    
    if response.status_code == 200:
        result = response.json()
        image_b64 = result.get("image_b64", None)
        
        if image_b64:
            # Convert base64 string back to an image
            image_data = base64.b64decode(image_b64)
            image = Image.open(BytesIO(image_data))
            return image
    else:
        return None

# Tạo giao diện Gradio
css = ".output-image, .input-image, .image-preview {height: 480px !important} "

gr.Interface(
    fn=upscale,
    inputs=[
        gr.Image(type="pil", label="Input Image"),  # Đầu vào ảnh từ người dùng
        gr.Radio(list(resolution_options.keys()), type="value", label="Chọn độ phân giải"),  # Chọn độ phân giải 1K, 2K, 4K, 8K
    ],
    outputs="image",  # Trả về ảnh đầu ra
    title="Image Upscaling 🦆",
    description="Tăng độ phân giải hình ảnh dựa trên mô hình real-esrgan-x4-v3. Nếu ảnh lớn hơn 2048x2048 hoặc lớn hơn độ phân giải mục tiêu, không upscale.",
    allow_flagging="never",
    css=css
).launch()