Compare commits

...

56 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
6d2b939987 BLUR-38: Add different shape for blurring faces, to make them look aesthetic. 2023-12-19 10:55:55 +01:00
b27f4930db BLUR-39: Add simple method of blurring. 2023-12-19 10:55:25 +01:00
e990582cbd BLUR-37: Add simple method of blurring. 2023-12-19 09:35:45 +01:00
9f55a0c034 BLUR-37: Refactor code to move creation of image with boxes to graphics directory. 2023-12-19 09:34:00 +01:00
96da101cb4 BLUR-37: Add detected object type to BoundingBox. 2023-12-19 09:28:06 +01:00
Zofia Zientek
07b7d24d40 PC-2017.3.2 <Dell@XPS_13_9343 Merge branch 'master' 2023-12-12 21:46:24 +01:00
05b350c0b7 BLUR-36 dark mode icon 2023-12-12 21:30:55 +01:00
e93c71031b Merge branch 'master' of https://git.wmi.amu.edu.pl/s352038/BlurMe 2023-12-12 21:28:41 +01:00
02d712614f BLUR 8 2023-12-12 21:28:17 +01:00
ec7c3861dd BLUR-8 Podgląd zdjęcia 2023-12-12 21:27:48 +01:00
Zofia Zientek
b0bfb73e1d PC-2017.3.2 <Dell@XPS_13_9343 Create ui.lnf.xml 2023-12-12 17:22:42 +01:00
kat
275d3acdd5 Dashboard 2023-12-12 15:06:29 +01:00
Zofia Zientek
976ff16d1f PC-2017.3.2 <Dell@XPS_13_9343 Create colors.scheme.xml, laf.xml, editor.xml, Default.xml, debugger.xml 2023-12-12 00:45:56 +01:00
Zofia Zientek
637cd2b5f5 PC-2017.3.2 <Dell@XPS_13_9343 Create git.xml, vcs.xml 2023-12-11 23:03:45 +01:00
37 changed files with 375 additions and 164 deletions

View File

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

5
_windows/laf.xml Normal file
View File

@ -0,0 +1,5 @@
<application>
<component name="LafManager">
<laf class-name="com.intellij.ide.ui.laf.darcula.DarculaLaf" />
</component>
</application>

BIN
assets/about-icon-dark.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 903 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 732 B

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

BIN
assets/home-icon-dark.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 598 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 97 KiB

After

Width:  |  Height:  |  Size: 98 KiB

BIN
assets/image-icon-dark.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 820 B

BIN
assets/innovation.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 112 KiB

BIN
assets/logo-2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 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

@ -3,6 +3,7 @@
from blurme import styles
from blurme.state import State
from reflex.page import get_decorated_pages
from blurme.templates import template
import reflex as rx
@ -16,7 +17,7 @@ def sidebar_header() -> rx.Component:
# The logo.
rx.image(
src="/icon.png",
height="4.5em",
height="5em",
),
rx.spacer(),
width="100%",
@ -25,7 +26,7 @@ def sidebar_header() -> rx.Component:
align = 'center',
)
def sidebar_item(text: str, icon: str, url: str, ) -> rx.Component:
def sidebar_item(text: str, icon: str, url: str) -> rx.Component:
"""Sidebar item.
Args:
@ -39,6 +40,10 @@ def sidebar_item(text: str, icon: str, url: str, ) -> rx.Component:
# Whether the item is active.
active = State.router.page.path == url
default_dark_icon = "/image-icon-dark.png"
#final_dark_icon = dark_icon if dark_icon else default_dark_icon
#active = (State.router.page.path == f"/{text.lower()}") | (
# (State.router.page.path == "/") & text == "Strona główna"
#)
@ -82,7 +87,6 @@ def sidebar() -> rx.Component:
Returns:
The sidebar component.
"""
# Get all the decorated pages and add them to the sidebar.
from reflex.page import get_decorated_pages
return rx.box(

View File

@ -2,48 +2,39 @@ from blurme.templates import template
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")
def about() -> rx.Component:
return rx.vstack(
#rx.heading("O autorach", font_size="3em"),
rx.markdown(about_authors_text),
)
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.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

@ -3,6 +3,8 @@ from blurme.templates import template
import reflex as rx
ICON_EMAIL = "assets/email-icon.png"
ICON_PHONE = "assets/phone-icon.png"
@template(route="/dashboard", title="Kontakt", image="/contact-icon.png")
def dashboard() -> rx.Component:
@ -11,18 +13,31 @@ def dashboard() -> rx.Component:
Returns:
The UI for the dashboard page.
"""
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. "
container_style = {"background-color": "#f5f5f5", "padding": "10px", "margin-bottom": "20px", "display": "flex", "align-items": "center"}
icon_style = {"width": "20px", "height": "30px", "margin-right": "10px"}
heading_style = {"font-weight": "bold", "font-family": "Arial, sans-serif"}
return rx.wrap(
rx.hstack(
rx.vstack(rx.hstack(rx.image(src="/sparkle-left.png",height="3em"),
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 "
"po prostu chcesz porozmawiać o naszej aplikacji."
),
rx.heading("E-mail:", level=3),
rx.text("Zapraszamy do napisania do nas na adres: contact@blurme.com"),
rx.heading("Telefon:", level=3),
rx.text("Możesz także zadzwonić pod numer: +48 123 456 789"),
rx.heading("Media Społecznościowe:", level=3),
rx.text("Odwiedź nas na Facebooku, Twitterze i Instagramie @BlurMeApp")
)
"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.wrap(rx.vstack(rx.vstack(rx.fragment(
rx.hstack(rx.icon(tag="email",style=icon_style),
rx.heading("E-mail", level=3, style=heading_style), margin_top="20px"),
rx.text("Zapraszamy do napisania do nas na adres: contact@blurme.com"),
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.text("Możesz także zadzwonić pod numer: +48 123 456 789"),
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")
def index() -> rx.Component:
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.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!",
font_size="1.2em", style={"margin-left": "40px", "margin-top": "50px", "align-self": "flex-start", "margin-bottom": "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={"margin-top": "30px" }),style = {"align-self": "flex-start"}),
rx.image(src="obraz1.png",height="30em",padding="0.5em",style={"margin-right": "60px"}),
style={"align-self": "flex-start"}),),
rx.vstack(rx.hstack(rx.image(src="sparkle-left.png",height="3em"),
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.image(src="sparkle-right.png",height="3em"), style={"align-self": "center"}),
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.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.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_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%"),
@ -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.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"),),
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"),

View File

@ -1,14 +1,106 @@
"""The settings page."""
import asyncio
from blurme.templates import template
from blurme.state import State
import reflex as rx
color = "rgb(107,99,246)"
@template(route="/settings", title="Zdjęcie", image = "/image-icon.png")
def settings() -> rx.Component:
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.text("Dodaj zdjęcie, które chcesz zanonimizować", font_size="1.2em"),
rx.upload(rx.text("Drag and drop files here or click to select files"),border="1px dotted rgb(107,99,246)", padding="5em"))
icon_style = {"width": "20px", "height": "30px", "margin-right": "10px"}
return rx.vstack(
rx.wrap(
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.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}",
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,12 +1,95 @@
"""Base state for the app."""
import reflex as rx
import os
import stat
#from blurme import styles
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):
"""Base state for the app.
"""The app state."""
The base state is used to store general vars used throughout the app.
"""
# The images to show.
img: list[str] = []
show: bool = False
def toggle_show(self):
self.show = not self.show
pass
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]):
"""Handle the upload of file(s).
Args:
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:
upload_data = await file.read()
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.
with open(outfile, "wb") as file_object:
file_object.write(upload_data)
# Update the img var.
self.img.append(file.filename)
self.img = self.img
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

@ -1,17 +1,18 @@
"""Styles for the app."""
import reflex as rx
from blurme.state import State
border_radius = "0.375rem"
box_shadow = "0px 0px 0px 1px rgba(84, 82, 95, 0.14)"
border = "1px solid #F4F3F6"
text_color = "black"
#dark_mode_state = State.toggle_dark_mode()
#text_color = "white" if dark_mode_state == True else "purple"
text_color_light = "black"
text_color_dark = "white"
accent_text_color = "black"
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_bg = {"_hover": {"bg": accent_color}}
content_width_vw = "90vw"
@ -39,16 +40,6 @@ overlapping_button_style = {
"border_radius": border_radius,
}
#base_style = {
# rx.MenuButton: {
# "width": "3em",
# "height": "3em",
# **overlapping_button_style,
# },
# rx.MenuItem: hover_accent_bg,
#}
markdown_style = {
"code": lambda text: rx.code(text, color="#1F1944", bg="#EAE4FD", margin="10px 0"),
"a": lambda text, **props: rx.link(

View File

@ -5,6 +5,7 @@ from __future__ import annotations
from blurme import styles
from blurme.components.sidebar import sidebar
from typing import Callable
from blurme.state import State
import reflex as rx
@ -16,71 +17,27 @@ default_meta = [
},
]
#def menu_button() -> rx.Component:
# """The menu button on the top right of the page.
#
# Returns:
# The menu button component.
# """
# from reflex.page import get_decorated_pages
# return rx.box(
# rx.menu(
# rx.menu_button(
# rx.icon(
# tag="hamburger",
# size="4em",
# color=styles.text_color,
# ),
# ),
# rx.menu_list(
# *[
# rx.menu_item(
# rx.link(
# page["title"],
# href=page["route"],
# width="100%",
# )
# )
# for page in get_decorated_pages()
# ],
# rx.menu_divider(),
# rx.menu_item(
# rx.link("About", href="/about", width="100%")
# ),
# rx.menu_item(
# rx.link("Contact", href="mailto:founders@=reflex.dev", width="100%")
# ),
# ),
# ),
# position="fixed",
# right="1.5em",
# top="1.5em",
# z_index="500",
# )
def dark_mode() -> rx.Component:
return rx.box(
rx.button(
rx.icon(
tag="moon",
size="4em",
color=styles.text_color,
),
on_click=rx.toggle_color_mode,
on_click= rx.toggle_color_mode
#State.toggle_dark_mode()
),
position="fixed",
right="1.5em",
top="1.5em",
z_index="500",
)
z_index="500",)
def template(
route: str | None = None,
title: str | None = None,
image: str | None = None,
image_dark: str | None = None,
description: str | None = None,
meta: str | None = None,
script_tags: list[rx.Component] | None = None,
@ -92,9 +49,10 @@ def template(
route: The route to reach the page.
title: The title of the page.
image: The favicon of the page.
image_dark: The dark mode favicon of the page.
description: The description of the page.
meta: Additionnal meta to add to the page.
on_load: The event handler(s) called when the page load.
meta: Additional meta to add to the page.
on_load: The event handler(s) called when the page loads.
script_tags: Scripts to attach to the page.
Returns:
@ -132,8 +90,7 @@ def template(
),
**styles.template_page_style,
),
#menu_button(),
dark_mode(),
dark_mode(),
align_items="flex-start",
transition="left 0.5s, width 0.5s",
position="relative",

1
codestyles/Default.xml Normal file
View File

@ -0,0 +1 @@
<code_scheme name="Default" version="173" />

5
colors.scheme.xml Normal file
View File

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

6
debugger.xml Normal file
View File

@ -0,0 +1,6 @@
<application>
<component name="XDebuggerSettings">
<data-views />
<general />
</component>
</application>

6
editor.xml Normal file
View File

@ -0,0 +1,6 @@
<application>
<component name="DefaultFont">
<option name="FONT_SIZE" value="18" />
<option name="FONT_SCALE" value="1.5" />
</component>
</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

@ -0,0 +1,48 @@
import logging
import os
from typing import List
from PIL import Image, ImageDraw, ImageFont, ImageFilter
from PIL.Image import composite
from ml.element_detection import BoundBox
DIR_PATH = os.path.dirname(os.path.realpath(__file__))
def show_image_with_boxes(
in_image_path: str, bounding_boxes: List[BoundBox], out_image_path: str = None
):
img = Image.open(in_image_path)
draw = ImageDraw.Draw(img)
font_path = DIR_PATH + "/assets/fonts/arial.ttf"
font = ImageFont.truetype(font_path, 25)
for i, box in enumerate(bounding_boxes):
draw.rectangle(box.get_params(), outline="red", width=2, fill=None)
draw.text((box.x1 + 5, box.y1 + 5), str(i + 1), fill="red", font=font)
if not out_image_path:
out_image_path = (
in_image_path.split(".")[0] + "_out." + in_image_path.split(".")[1]
)
img.save(out_image_path)
def blur_boxes_on_image(
in_image_path: str, bounding_boxes: List[BoundBox], out_image_path: str = None
):
img = Image.open(in_image_path)
blur_img = img.filter(ImageFilter.GaussianBlur(radius=13)) # to increase the blur, increase the radius
mask = Image.new("L", img.size, 255)
draw_mask = ImageDraw.Draw(mask)
for box in bounding_boxes:
if box.selected:
if box.object == "plate":
draw_mask.rectangle(box.get_params(), fill=0)
elif box.object == "face":
draw_mask.ellipse(box.get_params(), fill=0)
mask = mask.filter(ImageFilter.GaussianBlur(radius=3))
img = composite(img, blur_img, mask)
if not out_image_path:
out_image_path = (
in_image_path.split(".")[0] + "_blurred." + in_image_path.split(".")[1]
)
img.save(out_image_path)

View File

@ -2,7 +2,6 @@ import os
from typing import List, Tuple
import torch
from PIL import Image, ImageDraw, ImageFont
from ultralytics import YOLO
@ -16,9 +15,12 @@ IOU_THRESH = 0.5
class BoundBox:
def __init__(self, x1, y1, x2, y2):
def __init__(self, x1, y1, x2, y2, object=None):
self.x1, self.y1, self.x2, self.y2 = x1, y1, x2, y2
self.selected = True
if object not in ["face", "plate"]:
raise ValueError("object must be either 'face' or 'plate'")
self.object = object
def select(self):
self.selected = True
@ -41,29 +43,14 @@ def detect(image_path: str) -> List[BoundBox]:
)
plates = plates[0].cpu().numpy().boxes
bounding_boxes = []
for boxes in [faces, plates]:
for boxes, tag in zip([faces, plates], ["face", "plate"]):
for box in boxes:
xyxyn = box.xyxy[0]
x1 = int(xyxyn[0])
y1 = int(xyxyn[1])
x2 = int(xyxyn[2])
y2 = int(xyxyn[3])
bounding_boxes.append(BoundBox(x1, y1, x2, y2))
bounding_boxes.append(BoundBox(x1, y1, x2, y2, tag))
return bounding_boxes
def show_image_with_boxes(
in_image_path: str, bounding_boxes: List[BoundBox], out_image_path: str = None
):
img = Image.open(in_image_path)
draw = ImageDraw.Draw(img)
font_path = DIR_PATH + "/assets/fonts/arial.ttf"
font = ImageFont.truetype(font_path, 25)
for i, box in enumerate(bounding_boxes):
draw.rectangle(box.get_params(), outline="red", width=2, fill=None)
draw.text((box.x1 + 5, box.y1 + 5), str(i+1), fill="red", font=font)
if not out_image_path:
out_image_path = (
in_image_path.split(".")[0] + "_out." + in_image_path.split(".")[1]
)
img.save(out_image_path)

View File

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

5
ui.lnf.xml Normal file
View File

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