Compare commits

..

No commits in common. "master" and "6d2b939987e78d1e0ffb35e261ffd242096913f1" have entirely different histories.

28 changed files with 179 additions and 251 deletions

View File

@ -4,7 +4,6 @@
## Przygotowanie aplikacji po raz pierwszy ## Przygotowanie aplikacji po raz pierwszy
``` ```
apt install ffmeg libsm6 libxext6
pip install -r requirements.txt pip install -r requirements.txt
reflex init reflex init
``` ```

5
_windows/git.xml Normal file
View File

@ -0,0 +1,5 @@
<application>
<component name="Git.Application.Settings">
<option name="SSH_EXECUTABLE" value="IDEA_SSH" />
</component>
</application>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 107 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 159 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 98 KiB

After

Width:  |  Height:  |  Size: 97 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 112 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 760 KiB

After

Width:  |  Height:  |  Size: 442 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 155 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 235 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 51 KiB

View File

@ -17,7 +17,7 @@ def sidebar_header() -> rx.Component:
# The logo. # The logo.
rx.image( rx.image(
src="/icon.png", src="/icon.png",
height="5em", height="4.5em",
), ),
rx.spacer(), rx.spacer(),
width="100%", width="100%",

View File

@ -2,39 +2,48 @@ from blurme.templates import template
import reflex as rx import reflex as rx
about_authors_text = """
# O Autorach
Witaj na stronie "O Autorach" aplikacji **BlurMe**! Jesteśmy zespół pasjonatów ze studiów, którzy zjednoczyli siły,
aby stworzyć innowacyjne rozwiązanie mające na celu ochronę prywatności w erze współdzielonych zdjęć.
## Nasza Misja
Nasza grupa powstała z fascynacji technologią oraz z troską o prywatność w dzisiejszym świecie online. Świadomi wyzwań
związanych z udostępnianiem fotografii publicznie, postanowiliśmy stworzyć aplikację, która umożliwi użytkownikom
ochronę swojej prywatności, jednocześnie pozwalając na swobodne udostępnianie chwil z życia.
## Jak Powstała Nasza Grupa
Nasza grupa skupia się na różnorodnych dziedzinach, takich jak sztuczna inteligencja, przetwarzanie obrazów i
programowanie. Nasza wspólna pasja do technologii oraz zaangażowanie w projekt zrodziły kreatywną współpracę.
Spotkaliśmy się na naszych studiach, gdzie zauważyliśmy potrzebę stworzenia narzędzia, które połączy technologię z
ochroną prywatności.
## Dlaczego "BlurMe"?
**BlurMe** to wynik naszej wspólnej wizji, aby uczynić proces ochrony prywatności prostym i dostępnym dla każdego.
Chcemy, aby ludzie czuli się pewnie dzieląc się zdjęciami, nie martwiąc się o potencjalne naruszenia prywatności.
## O Naszych Umiejętnościach
Nasza grupa składa się z pasjonatów programowania, inżynierii oprogramowania i sztucznej inteligencji. Dzięki naszym
umiejętnościom oraz współpracy zdobyliśmy doświadczenie w tworzeniu zaawansowanych algorytmów przetwarzania obrazów,
które pozwalają na automatyczne wykrywanie twarzy i rejestracji samochodowych na zdjęciach.
## Kontakt
Jeśli masz pytania, sugestie lub chciałbyś dowiedzieć się więcej o naszej grupie, skontaktuj się z nami poprzez naszą
stronę kontaktową. Jesteśmy otwarci na współpracę i ciekawe pomysły!
Dziękujemy za korzystanie z **BlurMe**!
"""
@template(route="/about", title="O autorach", image = "/about-icon.png") @template(route="/about", title="O autorach", image = "/about-icon.png")
def about() -> rx.Component: def about() -> rx.Component:
return rx.vstack(rx.heading("O autorach", font_size="3em", margin_bottom="10px", background_image="linear-gradient( 64.5deg, rgba(245,116,185,1) 14.7%, rgba(89,97,223,1) 88.7% )", background_clip="text", padding = "10px"), return rx.vstack(
#rx.heading("O autorach", font_size="3em"),
rx.box( rx.markdown(about_authors_text),
rx.text("Jesteśmy grupą studentek kierunku Przetwarzania i Analizy Danych, które postanowiły połączyć swoje różnorodne umiejętności w ramach wspólnego projektu. Zależy nam nie tylko na zdobywaniu wiedzy na uczelni, ale także na praktycznym wykorzystaniu naszych umiejętności w realnych projektach.", margin_right="5%", margin_left="5%", margin_bottom = "10px"), )
rx.wrap(rx.hstack(
rx.vstack(rx.image(src= "/cooperation.png", height = "8em", align = "center"),
rx.text("Współpraca",as_="b",font_size="1.4em"),
rx.text("W naszym zespole każda z nas wnosi unikalne perspektywy i pomysły, co sprawia, że nasza współpraca jest inspirująca.", text_align="center"),),
rx.vstack(rx.image(src= "/innovation.png", height = "8em", align = "center"),
rx.text("Innowacyjność",as_="b",font_size="1.4em"),
rx.text("Naszym głównym celem jest stworzenie innowacyjnego rozwiązania, które nie tylko będzie spełniać potrzeby dzisiejszych czasów, ale również przyczyni się do ochrony prywatności w kontekście współdzielenia zdjęć online.", text_align="center"),),
rx.vstack(rx.image(src= "/data.png", height = "8em", align = "center"),
rx.text("Analiza danych", as_="b",font_size="1.4em"),
rx.text("Nasza pasja do analizy i zrozumienia dziedziny przetwarzania danych stanowią fundamenty naszego projektu.", text_align="center"),),
style={"align-self": "center", "align-items": "flex-start"}),style={"align-self": "center", "align-items": "flex-start"}, margin_right = "5%", margin_left = "5%"),
rx.text("Dzięki zaufaniu naszych użytkowników oraz naszemu zangażowaniu, wierzymy, że nasz projekt przyczyni się do tworzenia bezpieczniejszej przestrzeni dla współdzielenia zdjęć w sieci. Cieszymy się, że możemy być częścią tej fascynującej podróży!", margin_right="5%", margin_left="5%", margin_top="10px"), text_align = "center",),
rx.list(
rx.hstack(rx.list_item(rx.text("Nasza Misja",padding = "10px", text_align="center",background_image="linear-gradient( 64.5deg, rgba(245,116,185,1) 14.7%, rgba(89,97,223,1) 88.7% )", background_clip="text", font_size="2em", font_weight="bold",),
rx.text("Nasza grupa powstała z fascynacji technologią oraz z troską o prywatność w dzisiejszym świecie online. Świadomi wyzwań związanych z udostępnianiem fotografii publicznie, postanowiliśmy stworzyć aplikację, która umożliwi użytkownikom ochronę swojej prywatności, jednocześnie pozwalając na swobodne udostępnianie chwil z życia." ), margin_right = "30px"),
rx.image(src="/technology.png", height = "11em"), margin_top="30px", margin_bottom="5px"),
rx.hstack(rx.image(src="/about.png", height = "13em", margin_right = "30px"),
rx.list_item(rx.text("Jak Powstała Nasza Grupa",padding = "10px", text_align="center",background_image="linear-gradient( 64.5deg, rgba(245,116,185,1) 14.7%, rgba(89,97,223,1) 88.7% )", background_clip="text", font_size="2em", font_weight="bold", margin_top="30px", margin_bottom="5px"),
rx.text("Nasza grupa skupia się na różnorodnych dziedzinach, takich jak sztuczna inteligencja, przetwarzanie obrazów i programowanie. Nasza wspólna pasja do technologii oraz zaangażowanie w projekt zrodziły kreatywną współpracę. Spotkaliśmy się na naszych studiach, gdzie zauważyliśmy potrzebę stworzenia narzędzia, które połączy technologię z ochroną prywatności. Dzięki naszym umiejętnościom oraz współpracy zdobyliśmy doświadczenie w tworzeniu zaawansowanych algorytmów przetwarzania obrazów, które pozwalają na automatyczne wykrywanie twarzy i rejestracji samochodowych na zdjęciach.")),margin_top="30px", margin_bottom="5px"),
rx.hstack(rx.list_item(rx.text("Dlaczego BlurMe?",padding = "10px", text_align="center",background_image="linear-gradient( 64.5deg, rgba(245,116,185,1) 14.7%, rgba(89,97,223,1) 88.7% )", background_clip="text", font_size="2em", font_weight="bold"),
rx.text("BlurMe to wynik naszej wspólnej wizji, aby uczynić proces ochrony prywatności prostym i dostępnym dla każdego. Chcemy, aby ludzie czuli się pewnie dzieląc się zdjęciami, nie martwiąc się o potencjalne naruszenia prywatności.",), margin_right = "30px"),
rx.image(src="/privacy.png", height = "11em"), margin_top="30px", margin_bottom="5px"),
text_align = "center"), margin_right= "65px", margin_left = "65px")
#rx.list_item(rx.text("Kontakt",padding = "10px", text_align="center",background_image="linear-gradient( 64.5deg, rgba(245,116,185,1) 14.7%, rgba(89,97,223,1) 88.7% )", background_clip="text", font_size="2em", font_weight="bold", margin_top="30px", margin_bottom="5px"),
# rx.text("Jeśli masz pytania, sugestie lub chciałbyś dowiedzieć się więcej o naszej grupie, skontaktuj się z nami poprzez naszą stronę kontaktową. Jesteśmy otwarci na współpracę i ciekawe pomysły!"),margin_left = "40%"),
# text_align = "center"), margin_right= "65px", margin_left = "65px")

View File

@ -7,6 +7,32 @@ ICON_EMAIL = "assets/email-icon.png"
ICON_PHONE = "assets/phone-icon.png" ICON_PHONE = "assets/phone-icon.png"
@template(route="/dashboard", title="Kontakt", image="/contact-icon.png") @template(route="/dashboard", title="Kontakt", image="/contact-icon.png")
# def dashboard() -> rx.Component:
# """The dashboard page.
#
# Returns:
# The UI for the dashboard page.
# """
# section_style = {"background-color": "#f5f5f5", "padding": "10px", "margin-bottom": "20px"}
# icon_style = {"width": "20px", "height": "20px", "margin-right": "10px"}
# heading_style = {"font-weight": "bold", "font-family": "Arial, sans-serif"}
#
# return rx.fragment(
# rx.heading("Kontakt", font_size="3em"),
# rx.text("Witaj na stronie Kontaktowej w aplikacji BlurMe!"),
# rx.text(
# "Jesteśmy dostępni dla Ciebie na różnych platformach. "
# "Skontaktuj się z nami, gdy tylko masz pytania, sugestie lub "
# "po prostu chcesz porozmawiać o naszej aplikacji."
# ),
# rx.image(src=ICON_EMAIL, alt="Email icon", style=icon_style),
# rx.heading("E-mail", level=2, style=heading_style),
# rx.text("Zapraszamy do napisania do nas na adres: contact@blurme.com", style=section_style),
# rx.image(src=ICON_PHONE, alt="Phone icon", style=icon_style),
# rx.heading("Telefon", level=2, style=heading_style),
# rx.text("Możesz także zadzwonić pod numer: +48 123 456 789", style=section_style),
# )
def dashboard() -> rx.Component: def dashboard() -> rx.Component:
"""The dashboard page. """The dashboard page.
@ -14,30 +40,31 @@ def dashboard() -> rx.Component:
The UI for the dashboard page. The UI for the dashboard page.
""" """
container_style = {"background-color": "#f5f5f5", "padding": "10px", "margin-bottom": "20px", "display": "flex", "align-items": "center"} container_style = {"background-color": "#f5f5f5", "padding": "10px", "margin-bottom": "20px", "display": "flex", "align-items": "center"}
icon_style = {"width": "20px", "height": "30px", "margin-right": "10px"} icon_style = {"width": "20px", "height": "20px", "margin-right": "10px"}
heading_style = {"font-weight": "bold", "font-family": "Arial, sans-serif"} heading_style = {"font-weight": "bold", "font-family": "Arial, sans-serif"}
return rx.fragment(
return rx.wrap( rx.heading("Kontakt", font_size="3em"),
rx.hstack( rx.text("Witaj na stronie Kontaktowej w aplikacji BlurMe!"),
rx.vstack(rx.hstack(rx.image(src="/sparkle-left.png",height="3em"), rx.text(
rx.heading("Skontaktuj się!", font_size="2.6em", margin_bottom="10px", background_image="linear-gradient( 64.5deg, rgba(245,116,185,1) 14.7%, rgba(89,97,223,1) 88.7% )", background_clip="text", padding = "5px", text_align = "center"), "Jesteśmy dostępni dla Ciebie na różnych platformach. "
rx.image(src="/sparkle-right.png",height="3em"), style={"align-self": "center"}),
rx.text("Witaj na stronie Kontaktowej w aplikacji BlurMe!", font_size="1.2em", text_align = "center"),
rx.text("Jesteśmy dostępni dla Ciebie na różnych platformach. "
"Skontaktuj się z nami, gdy tylko masz pytania, sugestie lub " "Skontaktuj się z nami, gdy tylko masz pytania, sugestie lub "
"po prostu chcesz porozmawiać o naszej aplikacji.", margin_bottom="25px", text_align = "center"), "po prostu chcesz porozmawiać o naszej aplikacji."
style={"align-self": "flex-start","margin-left": "50px", "margin-top": "50px", "align-self": "flex-start", "margin-bottom": "25px"}, width = "50%"), ),
rx.wrap(rx.vstack(rx.vstack(rx.fragment( rx.fragment(
rx.hstack(rx.icon(tag="email",style=icon_style), rx.fragment(
rx.heading("E-mail", level=3, style=heading_style), margin_top="20px"), rx.image(src=ICON_EMAIL, alt="Email icon", style=icon_style),
rx.heading("E-mail", level=3, style=heading_style),
rx.text("Zapraszamy do napisania do nas na adres: contact@blurme.com"), rx.text("Zapraszamy do napisania do nas na adres: contact@blurme.com"),
style=container_style,text_align = "center")), style=container_style
rx.vstack(rx.fragment( )
rx.hstack(rx.icon(tag="phone", style=icon_style),rx.heading("Telefon", level=3, style=heading_style), margin_top="20px"), ),
rx.fragment(
rx.fragment(
rx.image(src=ICON_PHONE, alt="Phone icon", style=icon_style),
rx.heading("Telefon", level=3, style=heading_style),
rx.text("Możesz także zadzwonić pod numer: +48 123 456 789"), rx.text("Możesz także zadzwonić pod numer: +48 123 456 789"),
style=container_style, text_align = "center"),), style=container_style
),style={"align-self": "flex-center"}),)) )
)
)

View File

@ -8,23 +8,18 @@ import reflex as rx
@template(route="/", title="Strona główna", image = "/home-icon.png") @template(route="/", title="Strona główna", image = "/home-icon.png")
def index() -> rx.Component: def index() -> rx.Component:
return rx.vstack( return rx.vstack(
rx.heading("Witaj w BlurMe!", font_size="3em", margin_bottom="25px", background_image="linear-gradient( 64.5deg, rgba(245,116,185,1) 14.7%, rgba(89,97,223,1) 88.7% )", background_clip="text", padding = "10px"),
rx.wrap( rx.wrap(
rx.hstack( rx.hstack(
rx.vstack(rx.hstack(rx.image(src="sparkle-left.png",height="3em"), rx.vstack(rx.text("Aplikacja do anonimizacji zdjęć: usunięcie wybranych informacji identyfikujących ze zdjęć z wydarzeń i miejsc publicznych nigdy nie było tak proste!",
rx.heading("Witaj w BlurMe!", font_size="2.6em", margin_bottom="10px", background_image="linear-gradient( 64.5deg, rgba(245,116,185,1) 14.7%, rgba(89,97,223,1) 88.7% )", background_clip="text", padding = "5px", text_align = "center"), font_size="1.2em", style={"margin-left": "40px", "margin-top": "50px", "align-self": "flex-start", "margin-bottom": "25px"}),
rx.image(src="sparkle-right.png",height="3em"), style={"align-self": "center"}), rx.link(rx.button("Zacznij anonimizować"), href="settings",align="center",color="rgba(117,102,254,255)",button=True,padding="50xp",font_size="1.2em",style={"margin-top": "30px" }),style = {"align-self": "flex-start"}),
rx.text("Usunięcie wybranych informacji identyfikujących ze zdjęć z wydarzeń i miejsc publicznych nigdy nie było tak proste!", font_size="1.2em", text_align = "center"), rx.image(src="obraz1.png",height="30em",padding="0.5em",style={"margin-right": "60px"}),
rx.text("Dołącz do naszej społeczności użytkowników, którzy cieszą się swobodą dzielenia się chwilami bez obaw o bezpieczeństwo swoich danych osobowych. Zacznij tworzyć bezpieczne wspomnienia już dziś!", margin_bottom="25px", text_align = "center"), style={"align-self": "flex-start"}),),
rx.text("", pading = "25px"),
rx.link(rx.button("Zacznij anonimizować"), href="settings",align="center",color="rgba(117,102,254,255)",button=True,padding="50xp",font_size="1.2em"),
style={"align-self": "flex-start","margin-left": "50px", "margin-top": "50px", "align-self": "flex-start", "margin-bottom": "25px"}, width = "50%"),
rx.image(src="obraz1.png",height="25em",padding="0.5em",style={"margin-right": "60px"}),
style={"align-self": "flex-start"}, max_width='100%'),),
rx.text(" ", height = "20px"), rx.text(" ", height = "20px"),
rx.vstack(rx.text("Jak to działa?", color = "rgba(117,102,253,255)", font_size="2em", font_weight="bold", margin_top="15px", margin_bottom="5px"), rx.vstack(rx.text("Jak to działa?", color = "rgba(117,102,253,255)", font_size="2em", font_weight="bold", margin_top="20px", margin_bottom="5px"),
rx.list( rx.list(
rx.list_item(rx.text("1. Wgraj Zdjęcie ",as_="b",font_size="1.2em"), rx.list_item(rx.text("1. Wgraj Zdjęcie ",as_="b",font_size="1.2em"),
rx.text("Prosty proces rozpoczyna się od dodania zdjęcia, które chcesz anonimizować.", ),margin_right = "50%"), rx.text("Prosty proces rozpoczyna się od dodania zdjęcia, które chcesz anonimizować.", ),margin_right = "50%"),
@ -54,7 +49,7 @@ def index() -> rx.Component:
rx.text("Przydatne w sytuacjach, gdy chcesz udostępnić zdjęcia publicznie, ale z zachowaniem prywatności pewnych osób.", text_align="left"),), rx.text("Przydatne w sytuacjach, gdy chcesz udostępnić zdjęcia publicznie, ale z zachowaniem prywatności pewnych osób.", text_align="left"),),
rx.list_item(rx.text("Kreatywność",as_="b",font_size="1.3em"), rx.list_item(rx.text("Kreatywność",as_="b",font_size="1.3em"),
rx.text("Wyraź swoją kreatywność, zachowując jednocześnie istotne elementy na zdjęciach.", text_align="left"),), rx.text("Wyraź swoją kreatywność, zachowując jednocześnie istotne elementy na zdjęciach.", text_align="left"),),
margin_right = "40px", margin_left = "40px"), ),text_align = "center", margin_bottom = "50px"), margin_right = "40px", margin_left = "40px"), ),text_align = "center"),
# rx.text("Blurme to więcej niż tylko narzędzie - to rozwiązanie, które pozwala Ci kontrolować, jak prezentujesz swoje zdjęcia online, zachowując jednocześnie pełną prywatność. Przekształć swoje obrazy już teraz!", text_align = "left"), # rx.text("Blurme to więcej niż tylko narzędzie - to rozwiązanie, które pozwala Ci kontrolować, jak prezentujesz swoje zdjęcia online, zachowując jednocześnie pełną prywatność. Przekształć swoje obrazy już teraz!", text_align = "left"),

View File

@ -2,6 +2,7 @@
import asyncio import asyncio
from blurme.templates import template from blurme.templates import template
from blurme.state import State from blurme.state import State
import reflex as rx import reflex as rx
@ -9,98 +10,20 @@ color = "rgb(107,99,246)"
@template(route="/settings", title="Zdjęcie", image = "/image-icon.png") @template(route="/settings", title="Zdjęcie", image = "/image-icon.png")
def settings() -> rx.Component: def settings() -> rx.Component:
icon_style = {"width": "20px", "height": "30px", "margin-right": "10px"} return rx.vstack(
rx.heading("BlurMe", font_size="3em", margin_bottom="25px", background_image="linear-gradient(271.68deg, #7566fe 0.75%, #f96caf 88.52%)", background_clip="text", padding = "10px"),
return rx.vstack( rx.text("Dodaj zdjęcie, które chcesz zanonimizować", font_size="1.2em"),
rx.wrap( rx.upload(
rx.hstack( rx.vstack(rx.text("Drag and drop files here or click to select files"),),
rx.vstack( border=f"1px dotted {color}",
rx.image(src="/brush-logo.png", height="5.2em", margin_bottom="15px"), padding="5em",),
rx.heading("Anonimizuj już teraz!", font_size="2em", margin_bottom="15px", rx.hstack(rx.foreach(rx.selected_files, rx.text)),
background_image="linear-gradient(271.68deg, #7566fe 0.75%, #f96caf 88.52%)", rx.button( "Upload",
background_clip="text", padding="5px"), on_click=lambda: State.handle_upload(
rx.text("Dodaj zdjęcie, wybierz obszar i ukryj tożsamość: Anonimizacja zdjęć w mgnieniu oka szybko, łatwo, bezpłatnie!", rx.upload_files()),),
font_size="1.2em", text_align="center"), width="50%", margin_left="50px", margin_right="30px"), rx.button("Clear",
rx.vstack( on_click=rx.clear_selected_files),
rx.upload( rx.foreach(
rx.vstack( State.img, lambda img: rx.image(src=f'/{img}')),
rx.image(src="/upload-icon.png", height="5em"), padding="5em",
rx.text("Przeciągnij, aby wybrać pliki", font_size="1em"), )
rx.text("albo", font_size="0.8em"),
rx.button("Kliknij", font_size="1em", color="rgba(117,102,254,255)"),
rx.text(" "),
rx.text("Dostępne rozszerzenia plików: png, jpg, webp, tiff", font_size="0.8em"),
),
border=f"1px dotted {color}",
padding="1em",
width="120%",
max_width = "120%",
multiple=True,
margin_top="50px",
style={"align-self": "center"},
spacing="2em",
),
rx.foreach(rx.selected_files, rx.text),
rx.box(
rx.button("Załaduj zdjęcie",
on_click=lambda: State.handle_upload(rx.upload_files()),
color="rgba(47, 187, 74,255)"),
rx.alert_dialog(
rx.alert_dialog_overlay(
rx.alert_dialog_content(
rx.alert_dialog_header("Przekroczono limit plików"),
rx.alert_dialog_body("Nie można przesłać więcej niż 5 plików."),
rx.alert_dialog_footer(
rx.button("Zamknij", color="rgba(255, 75, 42,255)",
on_click=State.toggle_show(),
)
),
),
),
is_open=State.show,
),
rx.alert_dialog(
rx.alert_dialog_overlay(
rx.alert_dialog_content(
rx.alert_dialog_header("Nieprawidłowe rozszerzenie pliku"),
rx.alert_dialog_body("Dozwolone rozszerzenia plików to: png, jpg, webp, tiff."),
rx.alert_dialog_footer(
rx.button("Zamknij", color="rgba(255, 75, 42,255)",
on_click=State.toggle_extension_alert(),
)
),
),
),
is_open=State.show_extension_alert,
),
),
),
),
),
rx.responsive_grid(
rx.foreach(
State.img,
lambda img: rx.vstack(
rx.image(src=f'/{img}', max_height="450px"),
rx.text(img, font_size="15px"),
rx.hstack(
rx.button(rx.icon(tag="delete", margin_right="8px"), " Usuń",
on_click=lambda img_name=img: State.delete_image(img_name),
color="rgba(255, 75, 42,255)", width="100px"),
rx.button(rx.icon(tag="check", margin_right="8px"), " Wykrywaj",
on_click=lambda img_name=img: State.image_analysis(img_name),
width="130px"),
rx.button(rx.icon(tag="edit", margin_right="8px"), " Anonimizuj",
on_click=lambda img_name=img: State.image_anonymization(img_name),
width="130px"),
rx.button(rx.icon(tag="download", margin_right="8px"), " Pobierz",
on_click=lambda img_name=img: State.download_image(img_name),
width="100px"),
padding="1em"
),
),
),
columns=[1],
spacing="5px",
),
)

View File

@ -1,95 +1,46 @@
"""Base state for the app.""" """Base state for the app."""
import reflex as rx import reflex as rx
import os from blurme import styles
import stat
#from blurme import styles
import asyncio import asyncio
from graphics.image_modification import blur_boxes_on_image
from graphics.image_modification import show_image_with_boxes
from ml.element_detection import BoundBox, detect #class State(rx.State):
# def __init__(self):
# super().__init__()
# self.dark_mode_state: bool = False
# def __str__(self):
# self.dark_mode_state
# def toggle_dark_mode(self) -> None:
# self.dark_mode_state = not self.dark_mode_state
# text_color = styles.text_color_light if self.dark_mode_state == True else styles.text_color_dark
# styles.text_color = text_color
# print(f"Dark Mode State: {self.dark_mode_state}")
# print(f"Current Text Color: {text_color}")
# pass
class State(rx.State): class State(rx.State):
"""The app state.""" """The app state."""
# The images to show. # The images to show.
img: list[str] = [] img: list[str] = []
show: bool = False
def toggle_show(self):
self.show = not self.show
show_extension_alert: bool = False
def toggle_extension_alert(self):
self.show_extension_alert = not self.show_extension_alert
def change(self):
self.show = not (self.show)
async def handle_upload(self, files: list[rx.UploadFile]): async def handle_upload(self, files: list[rx.UploadFile]):
"""Handle the upload of file(s). """Handle the upload of file(s).
Args: Args:
files: The uploaded files. files: The uploaded files.
""" """
max_files_limit = 5
acceptable_extensions = {"png", "jpg", "jpeg", "webp", "tif", "tiff"}
if len(self.img) + len(files) > max_files_limit:
self.toggle_show()
return
for file in files: for file in files:
upload_data = await file.read() upload_data = await file.read()
outfile = rx.get_asset_path(file.filename) outfile = rx.get_asset_path(file.filename)
extension = file.filename.split(".")[-1]
if extension.lower() not in acceptable_extensions:
self.toggle_extension_alert()
return
# Save the file. # Save the file.
with open(outfile, "wb") as file_object: with open(outfile, "wb") as file_object:
file_object.write(upload_data) file_object.write(upload_data)
# Update the img var. # Update the img var.
self.img.append(file.filename) self.img.append(file.filename)
self.img = self.img self.img = self.img
print(f"Current Text Color: {self.img[0]}")
def delete_image(self, img_name: str):
if img_name in self.img:
self.img.remove(img_name)
self.img=self.img
def download_image(self, img_name):
print(self.img)
return rx.download(url=f'/{img_name}', filename=img_name)
async def image_analysis(self, img_name: str):
if img_name in self.img:
stripped_image_name = str(img_name).lstrip("analysis-").lstrip("anonim-")
image_path = rx.get_asset_path(stripped_image_name)
#timestamp = datetime.now().strftime("%Y%m%d%H%M%S%f")
new_image_name = f"analysis-{stripped_image_name}"
new_image_path = rx.get_asset_path(new_image_name)
show_image_with_boxes(image_path, detect(image_path), new_image_path)
upload_file = rx.UploadFile(file=open(new_image_path, 'rb'), filename=new_image_name)
self.delete_image(img_name)
await self.handle_upload([upload_file])
self.img=self.img
async def image_anonymization(self, img_name: str):
if img_name in self.img:
stripped_image_name = str(img_name).lstrip("analysis-").lstrip("anonim-")
image_path = rx.get_asset_path(stripped_image_name)
#timestamp = datetime.now().strftime("%Y%m%d%H%M%S%f")
new_image_name = f"anonim-{stripped_image_name}"
new_image_path = rx.get_asset_path(new_image_name)
blur_boxes_on_image(image_path, detect(image_path), new_image_path)
upload_file = rx.UploadFile(file=open(new_image_path, 'rb'), filename=new_image_name)
self.delete_image(img_name)
await self.handle_upload([upload_file])
self.img=self.img

View File

@ -13,6 +13,9 @@ text_color_light = "black"
text_color_dark = "white" text_color_dark = "white"
accent_text_color = "black" accent_text_color = "black"
accent_color = "linear-gradient(linear-gradient(43deg, rgba(201,238,248,1) 18%, rgba(253,210,227,0.7792366946778712) 86%)" accent_color = "linear-gradient(linear-gradient(43deg, rgba(201,238,248,1) 18%, rgba(253,210,227,0.7792366946778712) 86%)"
#linear-gradient(120deg, #d299c2 0%, #fef9d7 100%);"
#linear-gradient(to top, #d9afd9 0%, #97d9e1 100%);"
hover_accent_color = {"_hover": {"color": accent_color}} hover_accent_color = {"_hover": {"color": accent_color}}
hover_accent_bg = {"_hover": {"bg": accent_color}} hover_accent_bg = {"_hover": {"bg": accent_color}}
content_width_vw = "90vw" content_width_vw = "90vw"
@ -40,6 +43,16 @@ overlapping_button_style = {
"border_radius": border_radius, "border_radius": border_radius,
} }
#base_style = {
# rx.MenuButton: {
# "width": "3em",
# "height": "3em",
# **overlapping_button_style,
# },
# rx.MenuItem: hover_accent_bg,
#}
markdown_style = { markdown_style = {
"code": lambda text: rx.code(text, color="#1F1944", bg="#EAE4FD", margin="10px 0"), "code": lambda text: rx.code(text, color="#1F1944", bg="#EAE4FD", margin="10px 0"),
"a": lambda text, **props: rx.link( "a": lambda text, **props: rx.link(

View File

@ -1,5 +1,5 @@
<application> <application>
<component name="EditorColorsManagerImpl"> <component name="EditorColorsManagerImpl">
<global_color_scheme name="_@user_Darcula" /> <global_color_scheme name="Darcula" />
</component> </component>
</application> </application>

View File

@ -1,7 +0,0 @@
<application>
<component name="FileTypeManager" version="17">
<extensionMap>
<mapping ext="tex" type="PLAIN_TEXT" />
</extensionMap>
</component>
</application>

View File

@ -1,10 +1,10 @@
import logging
import os import os
from typing import List from typing import List
from PIL import Image, ImageDraw, ImageFont, ImageFilter from PIL import Image, ImageDraw, ImageFont, ImageFilter
from PIL.Image import composite from PIL.Image import composite
from ml.element_detection import BoundBox from BlurMe.ml.element_detection import BoundBox
DIR_PATH = os.path.dirname(os.path.realpath(__file__)) DIR_PATH = os.path.dirname(os.path.realpath(__file__))
@ -30,7 +30,7 @@ def blur_boxes_on_image(
in_image_path: str, bounding_boxes: List[BoundBox], out_image_path: str = None in_image_path: str, bounding_boxes: List[BoundBox], out_image_path: str = None
): ):
img = Image.open(in_image_path) img = Image.open(in_image_path)
blur_img = img.filter(ImageFilter.GaussianBlur(radius=13)) # to increase the blur, increase the radius blur_img = img.filter(ImageFilter.GaussianBlur(radius=7))
mask = Image.new("L", img.size, 255) mask = Image.new("L", img.size, 255)
draw_mask = ImageDraw.Draw(mask) draw_mask = ImageDraw.Draw(mask)
for box in bounding_boxes: for box in bounding_boxes:

View File

@ -1,7 +1,7 @@
import unittest import unittest
from unittest.mock import Mock, patch from unittest.mock import Mock, patch
from element_detection import detect, BoundBox from element_detection import detect, BoundBox
from graphics.image_modification import show_image_with_boxes from BlurMe.graphics.image_modification import show_image_with_boxes
class TestYourModule(unittest.TestCase): class TestYourModule(unittest.TestCase):

View File

@ -1,5 +1,5 @@
<application> <application>
<component name="UISettings"> <component name="UISettings">
<option name="FONT_SCALE" value="1.5" /> <option name="HIDE_TOOL_STRIPES" value="false" />
</component> </component>
</application> </application>

13
vcs.xml Normal file
View File

@ -0,0 +1,13 @@
<application>
<component name="GitRememberedInputs">
<option name="visitedUrls">
<list>
<UrlAndUserName>
<option name="url" value="https://git.wmi.amu.edu.pl/s352038/BlurMe.git" />
<option name="userName" value="" />
</UrlAndUserName>
</list>
</option>
<option name="cloneParentDir" value="C:\Users\Dell\Desktop\Wszystko\studia\modelowanie matematyczne\programowanie\python" />
</component>
</application>