- ClipSave – monitor schowka Windows – zrzuty ekranu automatycznie zapisywane do pliku
- Do czego służy ClipSave?
- Jak to działa – mechanizm wewnętrzny
- Wymagania
- Wersja Python
- Wersja ANSI C (samodzielna)
- Instalacja i uruchomienie
- Python
- ANSI C – kompilacja
- Opcje wiersza poleceń – szczegółowy opis
- Głębia kolorów – opcja --bpp
- Kompresja – opcja -c / --compression
- Schemat nazewnictwa – opcja --name
- Nadpisywanie plików
- Pełne przykłady użycia
- 1. Domyślne uruchomienie
- 2. Kolorowe JPEGi do wybranego folderu
- 3. BMP w skali szarości z sekwencyjnym nazewnictwem
- 4. Własny wzorzec z datą i licznikiem
- 5. JPEG z regulacją jakości
- 6. Maksymalna kompresja PNG (najmniejsze pliki, wolniej)
- 7. Tryb palety 256 kolorów
- 8. Nadpisywanie bez pytania
- Różnice między wersją Python a ANSI C
- Formaty plików a głębia kolorów
- Zatrzymywanie programu
- Podsumowanie
ClipSave – monitor schowka Windows – zrzuty ekranu automatycznie zapisywane do pliku
ClipSave to lekki program (dostępny zarówno w Pythonie, jak i w samodzielnej wersji ANSI C), który automatycznie zapisuje do pliku wszystkie obrazy trafiające do schowka Windows. Wystarczy zrobić zrzut ekranu za pomocą Win+Shift+S, PrtScn, narzędzia Wycinanie (Snipping Tool) lub skopiować dowolny obraz (Ctrl+C) – ClipSave sam zajmie się resztą.
Program wykorzystuje natywne API AddClipboardFormatListener – nie ma żadnego aktywnego odpytywania (pollingu), więc zużycie procesora pozostaje na poziomie ~0% przez cały czas oczekiwania.
GitHub: github.com/IgorBrzezek/ClipSave
Do czego służy ClipSave?
ClipSave rozwiązuje problem „ulotności” schowka – obraz, który skopiujesz, znika natychmiast po skopiowaniu następnego elementu. Dzięki ClipSave każdy obraz jest trwale zapisywany na dysku, co przydaje się w wielu scenariuszach:
- Dokumentacja błędów – zrzuty ekranu z testów automatycznie lądują w folderze.
- Prezentacje i szkolenia – robisz serię zrzutów, a program je numeruje i zapisuje bez Twojej ingerencji.
- Praca badawcza – zbieranie wizualnych dowodów, analiza UI, archiwizacja.
- Bez kopiuj-wklej – nie musisz ręcznie otwierać Paint ani zapisywać pliku; program robi to za Ciebie.
Jak to działa – mechanizm wewnętrzny
ClipSave rejestruje w systemie ukryte okno Windows i nasłuchuje komunikatów WM_CLIPBOARDUPDATE. Gdy tylko zawartość schowka się zmieni (a jest to obraz), program:
- Pobiera bitmapę ze schowka przez
GetClipboardData(CF_DIB). - Oblicza hash FNV-1a obrazu – jeśli bitmapa jest identyczna z ostatnio zapisaną, pomija ją (deduplikacja).
- Konwertuje kolory do wybranej głębi bitowej (8/16/24 bpp lub paleta 256).
- Zapisuje plik w formacie PNG, JPEG lub BMP we wskazanym katalogu.
- Wyświetla w konsoli komunikat z nazwą pliku, rozmiarem w pikselach i wielkością pliku.
Całość działa w pętli komunikatów Windows, a zatrzymanie programu odbywa się przez Ctrl+C.
Wymagania
Wersja Python
- Python 3.7 lub nowszy
- Biblioteka Pillow (
pip install Pillow) - Windows 10 lub 11
Wersja ANSI C (samodzielna)
- Kompilator GCC (MinGW-w64) – dowolna nowsza wersja
- Windows 10 lub 11
- Żadnych zewnętrznych bibliotek – program korzysta wyłącznie z wbudowanych API Windows: GDI+ (gdiplus), GDI (gdi32), COM (ole32) oraz UUID (uuid)
- Wynikowy plik .exe ma ok. 170 KB i nie wymaga żadnych dodatkowych bibliotek runtime
Instalacja i uruchomienie
Python
pip install Pillow python clipsave.py
ANSI C – kompilacja
gcc -O2 -municode clipsave.c -lgdiplus -lgdi32 -lole32 -luuid -o clipsave.exe
Po skompilowaniu uruchamiasz:
clipsave.exe [opcje]
Opcje wiersza poleceń – szczegółowy opis
| Opcja | Opis | Domyślnie |
|---|---|---|
-h |
Krótka pomoc | – |
--help |
Pełna dokumentacja z przykładami | – |
-d KATALOG |
Katalog docelowy dla zapisywanych plików (zostanie utworzony, jeśli nie istnieje) | . (bieżący) |
-f FORMAT |
Format pliku: png, jpg lub bmp |
png |
--bpp N |
Głębia kolorów: 8 (skala szarości), P (paleta 256), 16 (RGB565), 24 (pełny RGB) |
16 |
-c N / --compression N |
Stopień kompresji – szczegóły poniżej | zależy od formatu |
--name TRYB |
Schemat nazewnictwa plików – szczegóły poniżej | DATETIME |
--overwrite |
Nadpisuj istniejące pliki bez pytania | pyta |
Głębia kolorów – opcja --bpp
ClipSave pozwala redukować liczbę kolorów w zapisywanym obrazie, co zmniejsza rozmiar pliku:
| Wartość | Opis | Szczegóły implementacji w C |
|---|---|---|
8 |
Skala szarości (tryb Luminancja BT.601: L = 0.299R + 0.587G + 0.114B) |
Każdy piksel konwertowany ze wzorem (R*77 + G*150 + B*29) >> 8 |
P |
8-bitowa paleta, 256 kolorów. Adaptacyjna kwantyzacja z ditheringiem Floyd-Steinberga | GDI+ rysuje 24-bitową kopię na 8-bitowej bitmapie indeksowanej z ditheringiem |
16 |
RGB565 – 5 bitów dla czerwieni, 6 dla zieleni, 5 dla niebieskiego (65 536 kolorów). Dla plików PNG dodawany jest znacznik sBIT sygnalizujący rzeczywistą głębię | Używane są tablice LUT LUT_R5, LUT_G6, LUT_B5 do kwantyzacji |
24 |
Pełny RGB – 8 bitów na kanał (16,7 mln kolorów). Wierna kopia oryginału | Kopiowanie ARGB → 24bpp RGB z pominięciem kanału alfa |
Kompresja – opcja -c / --compression
| Format | Zakres | Domyślnie | Uwagi |
|---|---|---|---|
jpg |
0 – 100 |
95 |
Procent jakości – wyższa wartość = lepsza jakość, większy plik. 0 = najgorsza jakość / najmniejszy plik, 100 = najlepsza jakość / największy plik. |
png |
1 – 10 |
6 |
Poziom kompresji zlib – 1 = najszybciej / największy plik, 10 = najwolniej / najmniejszy plik. |
Schemat nazewnictwa – opcja --name
DATETIME (tryb domyślny) – tworzy nazwy w postaci clip_YYYYMMDD_HHMMSS_000.png (data, czas, licznik).
Wzorzec niestandardowy – dowolny tekst z tokenami:
| Token | Rozwijane do | Przykład |
|---|---|---|
[N] |
Numer sekwencyjny: 1, 2, 3… | scan[N] → scan1.png |
[NN] |
Numer z wiodącymi zerami: 01, 02… | img[NN] → img01.png |
[NNN] |
001, 002… (dowolna liczba znaków N) | pic[NNN] → pic001.png |
[D] |
Aktualna data: RRRRMMDD | |
[T] |
Aktualny czas: GGMMSS | |
[DT] |
Data i czas: RRRRMMDD_GGMMSS | |
[TD] |
Czas i data: GGMMSS_RRRRMMDD |
Nadpisywanie plików
Domyślnie ClipSave pyta przed nadpisaniem istniejącego pliku:
[?] File exists: clip_20260610_112105_063.png. Overwrite? [y/N]
Dodanie flagi --overwrite pomija to pytanie i zawsze nadpisuje.
Pełne przykłady użycia
1. Domyślne uruchomienie
python clipsave.py
Zapisuje obrazy w formacie PNG, 16-bit RGB565, w bieżącym katalogu.
2. Kolorowe JPEGi do wybranego folderu
clipsave.exe -d C:\Zrzuty -f jpg --bpp 24
Pełny kolor, format JPEG, jakość domyślna 95, katalog C:\Zrzuty.
3. BMP w skali szarości z sekwencyjnym nazewnictwem
clipsave.exe -f bmp --bpp 8 --name scan[N]
Tworzy pliki scan1.bmp, scan2.bmp, itd. w skali szarości.
4. Własny wzorzec z datą i licznikiem
clipsave.exe --name photo_[DT]_[NN]
Tworzy pliki photo_20260610_112105_01.png, photo_20260610_112106_02.png, itd.
5. JPEG z regulacją jakości
clipsave.exe -f jpg -c 85
JPEG z jakością 85 – dobry balans między rozmiarem a jakością.
6. Maksymalna kompresja PNG (najmniejsze pliki, wolniej)
clipsave.exe -f png -c 10
7. Tryb palety 256 kolorów
clipsave.exe -f png --bpp P
Obraz z paletą 256 kolorów z ditheringiem – mały rozmiar pliku, wizualnie bliski oryginałowi.
8. Nadpisywanie bez pytania
clipsave.exe --overwrite
Różnice między wersją Python a ANSI C
| Cecha | Python | ANSI C |
|---|---|---|
| Środowisko uruchomieniowe | Python 3.7+ + Pillow | Samodzielny plik .exe (~170 KB) |
| Znacznik sBIT w PNG dla 16 bpp | Dodawany | Brak (ograniczenie GDI+) |
| True 16-bit BMP | Ręczne pakowanie BITFIELDS | GDI+ zapisuje jako 24-bitowy kontener |
| Rozmiar kodu | ~500 linii | ~750 linii |
Poza tymi różnicami technicznymi obie wersje są identyczne – te same opcje, to samo zachowanie, ten sam mechanizm nasłuchu schowka.
Formaty plików a głębia kolorów
W zależności od wybranej głębi kolorów i formatu pliku, ClipSave odpowiednio dostosowuje zapis:
| Format | 8 bpp | P bpp | 16 bpp | 24 bpp |
|---|---|---|---|---|
| PNG | Skala szarości, 8-bit | Paleta 256, 8-bit | RGB ze znacznikiem sBIT (5,6,5) | RGB, 24-bit |
| JPEG | Skala szarości | Paleta → RGB | RGB, kolory skwantowane | RGB, pełny kolor |
| BMP | Skala szarości, 8-bit | Paleta 256, 8-bit | True 16-bit BITFIELDS (tylko Python); w C: 24-bit | RGB, 24-bit |
Zatrzymywanie programu
Naciśnij Ctrl+C w oknie terminala. Program wyświetli podsumowanie z liczbą przechwyconych obrazów:
Finished. Captured images: 42
Podsumowanie
ClipSave to eleganckie, minimalistyczne narzędzie dla każdego, kto regularnie pracuje ze zrzutami ekranu w systemie Windows. Dzięki natywnemu API AddClipboardFormatListener program jest niezwykle oszczędny – czeka w tle, nie zużywając zasobów. Bogaty zestaw opcji (format, głębia kolorów, kompresja, elastyczne nazewnictwo) sprawia, że sprawdzi się zarówno w codziennej pracy, jak i w zautomatyzowanych procesach dokumentacji czy testowania.
Wersja ANSI C dodatkowo oferuje całkowitą niezależność – pojedynczy, kilkusetkilobajtowy plik .exe, który działa na każdym Windows 10/11 bez żadnych zależności. To doskonały przykład, jak napisać lekki, skuteczny program monitorujący w czystym C z użyciem GDI+.
Źródła: github.com/IgorBrzezek/ClipSave
