Compare commits

..

42 Commits

Author SHA1 Message Date
Zofia Zientek
9ef1b94d91 PC-2017.3.2 <Dell@XPS_13_9343 Create filetypes.xml 2024-02-27 15:31:48 +01:00
Zofia Zientek
265b18a59d PC-2017.3.2 <Dell@XPS_13_9343 Create ui.lnf.xml, colors.scheme.xml, laf.xml, editor.xml, Default.xml, debugger.xml 2024-01-23 13:48:45 +01:00
35f4f84f86 settings modification 2024-01-23 05:23:17 +01:00
6188e70c64 xml delete 2024-01-23 05:00:18 +01:00
a4c54b9b03 Merge branch 'master' of https://git.wmi.amu.edu.pl/s352038/BlurMe 2024-01-23 04:58:35 +01:00
76f90f186e xyz 2024-01-23 04:58:30 +01:00
Zofia Zientek
d0ae833056 PC-2017.3.2 <Dell@XPS_13_9343 Create Default.xml 2024-01-23 00:28:04 +01:00
Zofia Zientek
d727e093c0 PC-2017.3.2 <Dell@XPS_13_9343 Merge branch 'master' 2024-01-23 00:14:33 +01:00
28464cd4f8 Merge branch 'master' of https://git.wmi.amu.edu.pl/s352038/BlurMe 2024-01-22 23:51:32 +01:00
dd3c057f92 redme update, logo update 2024-01-22 23:51:14 +01:00
Zofia Zientek
444c6e4384 PC-2017.3.2 <Dell@XPS_13_9343 Create ui.lnf.xml, laf.xml, editor.xml, debugger.xml 2024-01-22 23:08:20 +01:00
f8531fcc19 Increase blur 2024-01-18 09:57:02 +01:00
89c2eeea0d codestyles delete 2024-01-17 20:41:10 +01:00
f09c77a6f1 Merge branch 'master' of https://git.wmi.amu.edu.pl/s352038/BlurMe 2024-01-17 20:40:18 +01:00
3222108912 _windows delete 2024-01-17 20:40:16 +01:00
kat
a93c29e43b Merge remote-tracking branch 'origin/master' 2024-01-17 20:39:56 +01:00
kat
8f2c16da7f BLUR-7 2024-01-17 20:39:38 +01:00
3daa006759 xml delete 2024-01-17 20:37:51 +01:00
ce1c9bf3ab Merge branch 'master' of https://git.wmi.amu.edu.pl/s352038/BlurMe 2024-01-16 19:21:56 +01:00
a1159858d8 BLUR-7 2024-01-16 19:21:51 +01:00
09b3487cf9 Move font to graphics assets 2024-01-16 17:56:25 +01:00
8e7ac6af76 BLUR-52 2024-01-16 16:24:47 +01:00
b4bd59ad09 BLUR-46 about-page 2024-01-16 15:35:34 +01:00
4a575c3cb6 BLUR-51 2024-01-16 14:12:10 +01:00
5e31d09001 BLUR-50 2024-01-16 02:39:24 +01:00
d9a1d61bfe BLUR-45, BLUR-46 2024-01-16 01:07:20 +01:00
kat
032274d6a1 BLUR-7 2024-01-15 21:29:36 +01:00
kat
7f97bf34e6 BLUR-7 2024-01-15 21:25:58 +01:00
Zofia Zientek
91a893788f PC-2017.3.2 <Dell@XPS_13_9343 Merge branch 'master' 2024-01-15 15:30:13 +01:00
45f300b397 BLUR-46 - main and about page 2024-01-11 23:34:09 +01:00
3aec48263b BLUR-46 2024-01-10 14:16:32 +01:00
kat
b6dc97e6c6 BLUR-21 2024-01-09 02:15:41 +01:00
Zofia Zientek
c8793aca57 PC-2017.3.2 <Dell@XPS_13_9343 Create find.xml 2024-01-08 23:29:12 +01:00
Zofia Zientek
0bab6a7dd6 PC-2017.3.2 <Dell@XPS_13_9343 Merge branch 'master' 2024-01-08 22:27:38 +01:00
Zofia Zientek
3eb6f7c6a2 PC-2017.3.2 <Dell@XPS_13_9343 Update vcs.xml 2024-01-08 22:20:15 +01:00
6643583a3b .web delete 2024-01-08 22:10:52 +01:00
a218bad4ce BLUR-43 2024-01-08 22:08:23 +01:00
e974e460ae BLUR-6 2024-01-08 18:59:34 +01:00
8e319bc4bb Download_image function 2023-12-19 16:13:56 +01:00
e1d147f6dc about update, contact update 2023-12-19 15:54:46 +01:00
afe6cb0439 Merge branch 'master' of https://git.wmi.amu.edu.pl/s352038/BlurMe 2023-12-19 13:39:44 +01:00
9c66bb691f BLUR-40 delete-uploaded-file 2023-12-19 13:39:26 +01:00
28 changed files with 251 additions and 179 deletions

View File

@ -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
``` ```

View File

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

BIN
assets/brush-logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

BIN
assets/cooperation.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

BIN
assets/data.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 159 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 97 KiB

After

Width:  |  Height:  |  Size: 98 KiB

BIN
assets/innovation.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 112 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 442 KiB

After

Width:  |  Height:  |  Size: 760 KiB

BIN
assets/privacy.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 155 KiB

BIN
assets/sparkle-left.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

BIN
assets/sparkle-right.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

BIN
assets/technology.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 235 KiB

BIN
assets/upload-icon.png Normal file

Binary file not shown.

After

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="4.5em", height="5em",
), ),
rx.spacer(), rx.spacer(),
width="100%", width="100%",

View File

@ -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")

View File

@ -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"}),))
)
)

View File

@ -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"),

View File

@ -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",
),
) )

View File

@ -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

View File

@ -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(

View File

@ -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
View File

@ -0,0 +1,7 @@
<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 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:

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 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):

View File

@ -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
View File

@ -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>