| | import gradio as gr |
| |
|
| | from scripts.controlnet_ui.modal import ModalInterface |
| |
|
| | PHOTOPEA_LOGO = """ |
| | <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" |
| | width="100%" viewBox="0 0 256 256" enable-background="new 0 0 256 256" xml:space="preserve" |
| | style="width: 0.75rem; height 0.75rem; margin-left: 2px;" |
| | > |
| | <path fill="#18A497" opacity="1.000000" stroke="none" |
| | d=" |
| | M1.000000,228.000000 |
| | C1.000000,162.312439 1.000000,96.624878 1.331771,30.719650 |
| | C2.026278,30.171114 2.594676,29.904894 2.721949,29.500008 |
| | C6.913495,16.165672 15.629609,7.322631 28.880219,2.875538 |
| | C29.404272,2.699659 29.633436,1.645129 30.000000,1.000000 |
| | C95.687561,1.000000 161.375122,1.000000 227.258057,1.317018 |
| | C227.660217,1.893988 227.815079,2.296565 228.081207,2.393433 |
| | C241.304657,7.206383 250.980164,15.550970 255.215851,29.410040 |
| | C255.321625,29.756128 256.383850,29.809898 257.000000,30.000000 |
| | C257.000000,95.687561 257.000000,161.375122 256.682983,227.257858 |
| | C256.106049,227.659790 255.699371,227.815521 255.607178,228.080658 |
| | C250.953033,241.462830 242.292618,250.822968 228.591782,255.214935 |
| | C228.239929,255.327698 228.190491,256.383820 228.000000,257.000000 |
| | C175.312439,257.000000 122.624878,257.000000 69.468582,256.531342 |
| | C68.672188,244.948196 68.218323,233.835587 68.052299,222.718674 |
| | C67.885620,211.557587 67.886772,200.390717 68.027298,189.229050 |
| | C68.255180,171.129044 68.084618,152.997421 69.151917,134.942368 |
| | C70.148468,118.083969 77.974228,103.689308 89.758743,91.961365 |
| | C104.435837,77.354736 122.313736,69.841736 143.417328,69.901505 |
| | C168.662338,69.972984 186.981964,90.486633 187.961487,114.156334 |
| | C189.042435,140.277435 166.783981,163.607941 140.303482,160.823074 |
| | C137.092346,160.485382 133.490692,158.365784 131.192612,155.987366 |
| | C126.434669,151.063141 126.975357,144.720825 129.168777,138.834930 |
| | C131.533630,132.489014 137.260605,130.548050 143.413757,130.046677 |
| | C150.288467,129.486496 156.424942,123.757378 157.035324,117.320816 |
| | C157.953949,107.633820 150.959381,101.769096 145.533951,101.194389 |
| | C132.238846,99.786079 120.699944,104.963120 111.676735,114.167313 |
| | C102.105782,123.930222 97.469498,136.194061 99.003151,150.234955 |
| | C100.540352,164.308228 107.108505,175.507980 118.864334,183.311539 |
| | C128.454544,189.677597 138.866959,191.786957 150.657837,190.245651 |
| | C166.242554,188.208420 179.874283,182.443329 191.251801,172.056793 |
| | C209.355011,155.530380 217.848694,134.938721 216.116119,110.085892 |
| | C214.834335,91.699440 207.721039,76.015915 195.289444,62.978828 |
| | C175.658447,42.391735 150.833389,37.257801 123.833740,42.281937 |
| | C98.675804,46.963364 78.315033,60.084667 62.208153,80.157814 |
| | C46.645889,99.552216 39.305275,121.796379 39.149052,146.201981 |
| | C38.912663,183.131317 39.666767,220.067017 40.000000,257.000000 |
| | C36.969406,257.000000 33.938812,257.000000 30.705070,256.668213 |
| | C30.298622,256.078369 30.144913,255.669220 29.884926,255.583878 |
| | C16.317770,251.131058 7.127485,242.317780 2.778462,228.591797 |
| | C2.667588,228.241821 1.613958,228.190567 1.000000,228.000000 |
| | z"/> |
| | <path fill="#000000" opacity="1.000000" stroke="none" |
| | d=" |
| | M40.468658,257.000000 |
| | C39.666767,220.067017 38.912663,183.131317 39.149052,146.201981 |
| | C39.305275,121.796379 46.645889,99.552216 62.208153,80.157814 |
| | C78.315033,60.084667 98.675804,46.963364 123.833740,42.281937 |
| | C150.833389,37.257801 175.658447,42.391735 195.289444,62.978828 |
| | C207.721039,76.015915 214.834335,91.699440 216.116119,110.085892 |
| | C217.848694,134.938721 209.355011,155.530380 191.251801,172.056793 |
| | C179.874283,182.443329 166.242554,188.208420 150.657837,190.245651 |
| | C138.866959,191.786957 128.454544,189.677597 118.864334,183.311539 |
| | C107.108505,175.507980 100.540352,164.308228 99.003151,150.234955 |
| | C97.469498,136.194061 102.105782,123.930222 111.676735,114.167313 |
| | C120.699944,104.963120 132.238846,99.786079 145.533951,101.194389 |
| | C150.959381,101.769096 157.953949,107.633820 157.035324,117.320816 |
| | C156.424942,123.757378 150.288467,129.486496 143.413757,130.046677 |
| | C137.260605,130.548050 131.533630,132.489014 129.168777,138.834930 |
| | C126.975357,144.720825 126.434669,151.063141 131.192612,155.987366 |
| | C133.490692,158.365784 137.092346,160.485382 140.303482,160.823074 |
| | C166.783981,163.607941 189.042435,140.277435 187.961487,114.156334 |
| | C186.981964,90.486633 168.662338,69.972984 143.417328,69.901505 |
| | C122.313736,69.841736 104.435837,77.354736 89.758743,91.961365 |
| | C77.974228,103.689308 70.148468,118.083969 69.151917,134.942368 |
| | C68.084618,152.997421 68.255180,171.129044 68.027298,189.229050 |
| | C67.886772,200.390717 67.885620,211.557587 68.052299,222.718674 |
| | C68.218323,233.835587 68.672188,244.948196 68.999924,256.531342 |
| | C59.645771,257.000000 50.291542,257.000000 40.468658,257.000000 |
| | z"/> |
| | <path fill="#000000" opacity="1.000000" stroke="none" |
| | d=" |
| | M257.000000,29.531342 |
| | C256.383850,29.809898 255.321625,29.756128 255.215851,29.410040 |
| | C250.980164,15.550970 241.304657,7.206383 228.081207,2.393433 |
| | C227.815079,2.296565 227.660217,1.893988 227.726715,1.317018 |
| | C237.593155,1.000000 247.186295,1.000000 257.000000,1.000000 |
| | C257.000000,10.353075 257.000000,19.707878 257.000000,29.531342 |
| | z"/> |
| | <path fill="#000000" opacity="1.000000" stroke="none" |
| | d=" |
| | M228.468658,257.000000 |
| | C228.190491,256.383820 228.239929,255.327698 228.591782,255.214935 |
| | C242.292618,250.822968 250.953033,241.462830 255.607178,228.080658 |
| | C255.699371,227.815521 256.106049,227.659790 256.682983,227.726517 |
| | C257.000000,237.593155 257.000000,247.186295 257.000000,257.000000 |
| | C247.646927,257.000000 238.292114,257.000000 228.468658,257.000000 |
| | z"/> |
| | <path fill="#000000" opacity="1.000000" stroke="none" |
| | d=" |
| | M1.000000,228.468658 |
| | C1.613958,228.190567 2.667588,228.241821 2.778462,228.591797 |
| | C7.127485,242.317780 16.317770,251.131058 29.884926,255.583878 |
| | C30.144913,255.669220 30.298622,256.078369 30.250959,256.668213 |
| | C20.406853,257.000000 10.813705,257.000000 1.000000,257.000000 |
| | C1.000000,247.646927 1.000000,238.292114 1.000000,228.468658 |
| | z"/> |
| | <path fill="#000000" opacity="1.000000" stroke="none" |
| | d=" |
| | M29.531342,1.000000 |
| | C29.633436,1.645129 29.404272,2.699659 28.880219,2.875538 |
| | C15.629609,7.322631 6.913495,16.165672 2.721949,29.500008 |
| | C2.594676,29.904894 2.026278,30.171114 1.331771,30.250992 |
| | C1.000000,20.406855 1.000000,10.813709 1.000000,1.000000 |
| | C10.353074,1.000000 19.707878,1.000000 29.531342,1.000000 |
| | z"/> |
| | </svg>""" |
| |
|
| |
|
| | class Photopea(object): |
| | def __init__(self) -> None: |
| | self.modal = None |
| | self.triggers = [] |
| | self.render_editor() |
| |
|
| | def render_editor(self): |
| | """Render the editor modal.""" |
| | with gr.Group(elem_classes=["cnet-photopea-edit"]): |
| | self.modal = ModalInterface( |
| | |
| | |
| | |
| | f""" |
| | <div class="photopea-button-group"> |
| | <button class="photopea-button photopea-fetch">Fetch from ControlNet</button> |
| | <button class="photopea-button photopea-send">Send to ControlNet</button> |
| | </div> |
| | <iframe class="photopea-iframe" src="about:blank"></iframe> |
| | """, |
| | open_button_text="Edit", |
| | open_button_classes=["cnet-photopea-main-trigger"], |
| | open_button_extra_attrs="hidden", |
| | ).create_modal(visible=True) |
| |
|
| | def render_child_trigger(self): |
| | self.triggers.append( |
| | gr.HTML( |
| | f"""<div class="cnet-photopea-child-trigger"> |
| | Edit {PHOTOPEA_LOGO} |
| | </div>""" |
| | ) |
| | ) |
| |
|
| | def attach_photopea_output(self, generated_image: gr.Image): |
| | """Called in ControlNetUiGroup to attach preprocessor preview image Gradio element |
| | as the photopea output. If the front-end directly change the img HTML element's src |
| | to reflect the edited image result from photopea, the backend won't be notified. |
| | |
| | In this method we let the front-end upload the result image an invisible gr.Image |
| | instance and mirrors the value to preprocessor preview gr.Image. This is because |
| | the generated image gr.Image instance is inferred to be an output image by Gradio |
| | and has no ability to accept image upload directly. |
| | |
| | Arguments: |
| | generated_image: preprocessor result Gradio Image output element. |
| | |
| | Returns: |
| | None |
| | """ |
| | output = gr.Image( |
| | visible=False, |
| | source="upload", |
| | type="numpy", |
| | elem_classes=[f"cnet-photopea-output"], |
| | ) |
| |
|
| | output.upload( |
| | fn=lambda img: img, |
| | inputs=[output], |
| | outputs=[generated_image], |
| | ) |
| |
|