Compare commits
42 Commits
6d2b939987
...
master
Author | SHA1 | Date | |
---|---|---|---|
|
9ef1b94d91 | ||
|
265b18a59d | ||
35f4f84f86 | |||
6188e70c64 | |||
a4c54b9b03 | |||
76f90f186e | |||
|
d0ae833056 | ||
|
d727e093c0 | ||
28464cd4f8 | |||
dd3c057f92 | |||
|
444c6e4384 | ||
f8531fcc19 | |||
89c2eeea0d | |||
f09c77a6f1 | |||
3222108912 | |||
|
a93c29e43b | ||
|
8f2c16da7f | ||
3daa006759 | |||
ce1c9bf3ab | |||
a1159858d8 | |||
09b3487cf9 | |||
8e7ac6af76 | |||
b4bd59ad09 | |||
4a575c3cb6 | |||
5e31d09001 | |||
d9a1d61bfe | |||
|
032274d6a1 | ||
|
7f97bf34e6 | ||
|
91a893788f | ||
45f300b397 | |||
3aec48263b | |||
|
b6dc97e6c6 | ||
|
c8793aca57 | ||
|
0bab6a7dd6 | ||
|
3eb6f7c6a2 | ||
6643583a3b | |||
a218bad4ce | |||
e974e460ae | |||
8e319bc4bb | |||
e1d147f6dc | |||
afe6cb0439 | |||
9c66bb691f |
@ -4,6 +4,7 @@
|
|||||||
## 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
|
||||||
```
|
```
|
||||||
|
@ -1,5 +0,0 @@
|
|||||||
<application>
|
|
||||||
<component name="Git.Application.Settings">
|
|
||||||
<option name="SSH_EXECUTABLE" value="IDEA_SSH" />
|
|
||||||
</component>
|
|
||||||
</application>
|
|
BIN
assets/about.png
Normal file
After Width: | Height: | Size: 107 KiB |
BIN
assets/brush-logo.png
Normal file
After Width: | Height: | Size: 26 KiB |
BIN
assets/cooperation.png
Normal file
After Width: | Height: | Size: 126 KiB |
BIN
assets/data.png
Normal file
After Width: | Height: | Size: 159 KiB |
BIN
assets/icon.png
Before Width: | Height: | Size: 97 KiB After Width: | Height: | Size: 98 KiB |
BIN
assets/innovation.png
Normal file
After Width: | Height: | Size: 112 KiB |
Before Width: | Height: | Size: 442 KiB After Width: | Height: | Size: 760 KiB |
BIN
assets/privacy.png
Normal file
After Width: | Height: | Size: 155 KiB |
BIN
assets/sparkle-left.png
Normal file
After Width: | Height: | Size: 13 KiB |
BIN
assets/sparkle-right.png
Normal file
After Width: | Height: | Size: 13 KiB |
BIN
assets/technology.png
Normal file
After Width: | Height: | Size: 235 KiB |
BIN
assets/upload-icon.png
Normal file
After Width: | Height: | Size: 51 KiB |
@ -17,7 +17,7 @@ def sidebar_header() -> rx.Component:
|
|||||||
# The logo.
|
# The logo.
|
||||||
rx.image(
|
rx.image(
|
||||||
src="/icon.png",
|
src="/icon.png",
|
||||||
height="4.5em",
|
height="5em",
|
||||||
),
|
),
|
||||||
rx.spacer(),
|
rx.spacer(),
|
||||||
width="100%",
|
width="100%",
|
||||||
|
@ -2,48 +2,39 @@ 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(
|
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"),
|
||||||
#rx.heading("O autorach", font_size="3em"),
|
|
||||||
rx.markdown(about_authors_text),
|
|
||||||
)
|
|
||||||
|
|
||||||
|
rx.box(
|
||||||
|
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")
|
||||||
|
@ -7,32 +7,6 @@ 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.
|
||||||
|
|
||||||
@ -40,31 +14,30 @@ 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": "20px", "margin-right": "10px"}
|
icon_style = {"width": "20px", "height": "30px", "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(
|
|
||||||
rx.heading("Kontakt", font_size="3em"),
|
return rx.wrap(
|
||||||
rx.text("Witaj na stronie Kontaktowej w aplikacji BlurMe!"),
|
rx.hstack(
|
||||||
rx.text(
|
rx.vstack(rx.hstack(rx.image(src="/sparkle-left.png",height="3em"),
|
||||||
"Jesteśmy dostępni dla Ciebie na różnych platformach. "
|
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"),
|
||||||
|
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."
|
"po prostu chcesz porozmawiać o naszej aplikacji.", margin_bottom="25px", text_align = "center"),
|
||||||
),
|
style={"align-self": "flex-start","margin-left": "50px", "margin-top": "50px", "align-self": "flex-start", "margin-bottom": "25px"}, width = "50%"),
|
||||||
rx.fragment(
|
rx.wrap(rx.vstack(rx.vstack(rx.fragment(
|
||||||
rx.fragment(
|
rx.hstack(rx.icon(tag="email",style=icon_style),
|
||||||
rx.image(src=ICON_EMAIL, alt="Email icon", style=icon_style),
|
rx.heading("E-mail", level=3, style=heading_style), margin_top="20px"),
|
||||||
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
|
style=container_style,text_align = "center")),
|
||||||
)
|
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
|
style=container_style, text_align = "center"),),
|
||||||
)
|
),style={"align-self": "flex-center"}),))
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
|
@ -8,18 +8,23 @@ 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.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.vstack(rx.hstack(rx.image(src="sparkle-left.png",height="3em"),
|
||||||
font_size="1.2em", style={"margin-left": "40px", "margin-top": "50px", "align-self": "flex-start", "margin-bottom": "25px"}),
|
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"),
|
||||||
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.image(src="sparkle-right.png",height="3em"), style={"align-self": "center"}),
|
||||||
rx.image(src="obraz1.png",height="30em",padding="0.5em",style={"margin-right": "60px"}),
|
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"),
|
||||||
style={"align-self": "flex-start"}),),
|
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"),
|
||||||
|
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="20px", 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="15px", 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%"),
|
||||||
@ -49,7 +54,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_right = "40px", margin_left = "40px"), ),text_align = "center", margin_bottom = "50px"),
|
||||||
|
|
||||||
|
|
||||||
# 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"),
|
||||||
|
@ -2,7 +2,6 @@
|
|||||||
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
|
||||||
|
|
||||||
|
|
||||||
@ -10,20 +9,98 @@ 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(
|
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"),
|
rx.wrap(
|
||||||
rx.text("Dodaj zdjęcie, które chcesz zanonimizować", font_size="1.2em"),
|
rx.hstack(
|
||||||
|
rx.vstack(
|
||||||
|
rx.image(src="/brush-logo.png", height="5.2em", margin_bottom="15px"),
|
||||||
|
rx.heading("Anonimizuj już teraz!", font_size="2em", margin_bottom="15px",
|
||||||
|
background_image="linear-gradient(271.68deg, #7566fe 0.75%, #f96caf 88.52%)",
|
||||||
|
background_clip="text", padding="5px"),
|
||||||
|
rx.text("Dodaj zdjęcie, wybierz obszar i ukryj tożsamość: Anonimizacja zdjęć w mgnieniu oka – szybko, łatwo, bezpłatnie!",
|
||||||
|
font_size="1.2em", text_align="center"), width="50%", margin_left="50px", margin_right="30px"),
|
||||||
|
rx.vstack(
|
||||||
rx.upload(
|
rx.upload(
|
||||||
rx.vstack(rx.text("Drag and drop files here or click to select files"),),
|
rx.vstack(
|
||||||
|
rx.image(src="/upload-icon.png", height="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}",
|
border=f"1px dotted {color}",
|
||||||
padding="5em",),
|
padding="1em",
|
||||||
rx.hstack(rx.foreach(rx.selected_files, rx.text)),
|
width="120%",
|
||||||
rx.button( "Upload",
|
max_width = "120%",
|
||||||
on_click=lambda: State.handle_upload(
|
multiple=True,
|
||||||
rx.upload_files()),),
|
margin_top="50px",
|
||||||
rx.button("Clear",
|
style={"align-self": "center"},
|
||||||
on_click=rx.clear_selected_files),
|
spacing="2em",
|
||||||
rx.foreach(
|
),
|
||||||
State.img, lambda img: rx.image(src=f'/{img}')),
|
rx.foreach(rx.selected_files, rx.text),
|
||||||
padding="5em",
|
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",
|
||||||
|
),
|
||||||
)
|
)
|
@ -1,46 +1,95 @@
|
|||||||
"""Base state for the app."""
|
"""Base state for the app."""
|
||||||
|
|
||||||
import reflex as rx
|
import reflex as rx
|
||||||
from blurme import styles
|
import os
|
||||||
|
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
|
||||||
#class State(rx.State):
|
from ml.element_detection import BoundBox, detect
|
||||||
# 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
|
@ -13,9 +13,6 @@ 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"
|
||||||
@ -43,16 +40,6 @@ 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(
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<application>
|
<application>
|
||||||
<component name="EditorColorsManagerImpl">
|
<component name="EditorColorsManagerImpl">
|
||||||
<global_color_scheme name="Darcula" />
|
<global_color_scheme name="_@user_Darcula" />
|
||||||
</component>
|
</component>
|
||||||
</application>
|
</application>
|
7
filetypes.xml
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
<application>
|
||||||
|
<component name="FileTypeManager" version="17">
|
||||||
|
<extensionMap>
|
||||||
|
<mapping ext="tex" type="PLAIN_TEXT" />
|
||||||
|
</extensionMap>
|
||||||
|
</component>
|
||||||
|
</application>
|
@ -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 BlurMe.ml.element_detection import BoundBox
|
from 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=7))
|
blur_img = img.filter(ImageFilter.GaussianBlur(radius=13)) # to increase the blur, increase the radius
|
||||||
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:
|
||||||
|
@ -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 BlurMe.graphics.image_modification import show_image_with_boxes
|
from graphics.image_modification import show_image_with_boxes
|
||||||
|
|
||||||
|
|
||||||
class TestYourModule(unittest.TestCase):
|
class TestYourModule(unittest.TestCase):
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<application>
|
<application>
|
||||||
<component name="UISettings">
|
<component name="UISettings">
|
||||||
<option name="HIDE_TOOL_STRIPES" value="false" />
|
<option name="FONT_SCALE" value="1.5" />
|
||||||
</component>
|
</component>
|
||||||
</application>
|
</application>
|
13
vcs.xml
@ -1,13 +0,0 @@
|
|||||||
<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>
|
|