Czysto z nudów i ciekawości napisałem aplikację, która komponuje obrazek z... innych obrazków.
Może najlepiej będzie to widać na przykładzie:
Wejście:
Wyjście:
Aby to uzyskać, potrzebowałem rzecz jasna listy plików będących tymi mniejszymi obrazkami - do tego celu wykorzystałem mój katalog z memami, który zbieram od roku (~100MB, nieco ponad tysiąc różnych obrazków), sprawił się prawie idealnie :D
Aplikacja jest napisana przede wszystkim z nudy, lecz posiada kilka imho 'ciekawych' cech:
- wielowątkowe wczytywanie obrazków (domyślnie na czterech wątkach, jako że mam czterordzeniowy Core i3)
- pamięć podręczna; wczytane obrazki są pomniejszane (domyślnie do rozmiaru
10x10
) i zapisywane do katalogucache
na późniejszy użytek (podczas następnego uruchomienia), dla mojego tysiąca obrazów daje to zaledwie430 KB
zajętego miejsca, a wczytywanie jest ośmiokrotnie krótsze - możliwość dostosowania wymiaru obrazków, liczby wątków czy cache z linii komend
Zasada działania jest, w drobnym uproszczeniu, następująca:
- małe obrazki zostają wielowątkowo wczytane z katalogu
imgs
i na bieżąco pomniejszane do wymiarów10x10
- liczona jest średnia barwa każdego z nich (R, G, B każdego piksela zostaje dodane i podzielone przez ich liczbę), kolor ten zostaje potem zamieniony na przestrzeń barw Lab i zapamiętany
- wczytywany jest główny obrazek, na podstawie którego stworzona zostanie mozaika
- brany jest pierwszy/następny fragment tego obrazka po
10x10
pikseli, liczona jest jego średnia i znów zamieniana naLab
- porównywane są kolory
Lab
aktualnie sprawdzanego sektora i każdego z obrazków; wybierany jest ten, który daje najmniejszą różnicę - powrót do kroku czwartego, aż do końca
Skomplikowane to niby nie jest, ale ~15h pisania było - choć to pewnie kwestia tego, że to moje pierwsze podejście do robienia czegoś z grafiką :D
W załączniku znajduje się apka wraz z moim katalogiem cache
(czyli gotowa do użycia - Windows x86), kod źródłowy (Lazarus, niecały tysiąc linii) i plik Readme
, także tutaj więcej nie mam zbytnio co opisywać ;)
Zachęcam do zabawy i oceny ;)