File size: 2,650 Bytes
c2a98c4
9763a83
 
 
c2a98c4
9763a83
 
 
 
 
 
 
 
 
 
 
 
 
c2a98c4
9763a83
 
 
 
c2a98c4
9763a83
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c2a98c4
9763a83
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c2a98c4
9763a83
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c2a98c4
9763a83
 
 
c2a98c4
9763a83
c2a98c4
 
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
import gradio as gr
import base64
from PIL import Image
import io

# HTML/JavaScript para el canvas interactivo
canvas_html = """
<canvas id="myCanvas" width="400" height="400" style="border:1px solid #000000;"></canvas>
<br>
<button onclick="addRectangle()">Add Rectangle</button>
<button onclick="clearCanvas()">Clear Canvas</button>
<script>
var canvas = document.getElementById('myCanvas');
var ctx = canvas.getContext('2d');
var shapes = [];
var isDragging = false;
var dragIndex = -1;
var dragOffsetX, dragOffsetY;

function addRectangle() {
    shapes.push({x: 50, y: 50, width: 50, height: 50, color: getRandomColor()});
    drawShapes();
}

function drawShapes() {
    ctx.clearRect(0, 0, canvas.width, canvas.height);
    shapes.forEach(function(shape) {
        ctx.fillStyle = shape.color;
        ctx.fillRect(shape.x, shape.y, shape.width, shape.height);
    });
}

function getRandomColor() {
    return '#' + Math.floor(Math.random()*16777215).toString(16);
}

canvas.addEventListener('mousedown', function(e) {
    var mouseX = e.clientX - canvas.getBoundingClientRect().left;
    var mouseY = e.clientY - canvas.getBoundingClientRect().top;
    
    for (var i = shapes.length - 1; i >= 0; i--) {
        var shape = shapes[i];
        if (mouseX > shape.x && mouseX < shape.x + shape.width &&
            mouseY > shape.y && mouseY < shape.y + shape.height) {
            isDragging = true;
            dragIndex = i;
            dragOffsetX = mouseX - shape.x;
            dragOffsetY = mouseY - shape.y;
            break;
        }
    }
});

canvas.addEventListener('mousemove', function(e) {
    if (isDragging) {
        var mouseX = e.clientX - canvas.getBoundingClientRect().left;
        var mouseY = e.clientY - canvas.getBoundingClientRect().top;
        shapes[dragIndex].x = mouseX - dragOffsetX;
        shapes[dragIndex].y = mouseY - dragOffsetY;
        drawShapes();
    }
});

canvas.addEventListener('mouseup', function() {
    isDragging = false;
});

function clearCanvas() {
    shapes = [];
    drawShapes();
}

function getCanvasImage() {
    return canvas.toDataURL('image/png');
}
</script>
"""

def get_canvas_image(dummy):
    # Esta función se llama cuando se presiona el botón de descarga
    # Devuelve None para que Gradio sepa que debe obtener la imagen del componente HTML
    return None

# Interfaz de Gradio
with gr.Blocks() as demo:
    gr.HTML(canvas_html)
    download_btn = gr.Button("Download Image")
    img_output = gr.Image(label="Generated Image")
    
    download_btn.click(get_canvas_image, inputs=[download_btn], outputs=[img_output], _js="() => getCanvasImage()")

demo.launch()