2008-09-24 14 views
6

Próbuję umieścić kilka obrazów w jednym dużym obrazie i szukam algorytmu, który określa najbardziej optymalne położenie. Obrazów nie można obracać ani zmieniać ich rozmiaru, ale pozycja w wynikowym obrazie nie jest ważna.Ułóż razem kilka obrazów w jeden duży obraz

edit: nie dodano jeszcze Resize ograniczenie

+0

hej Linor! więc co w końcu zrobiłeś? to pomoże ... – Lazer

Odpowiedz

3

Być może szukasz czegoś takiego: Automatic Magazine Layout.

+0

Problem z tym rozwiązaniem polega na tym, że wydaje się, że działa tylko dla kilku obrazów i dopasowuje rozmiary obrazów. – Linor

0

stworzyłem algorytm dla tego te, to faktycznie wariant problemu NP-HardBin packing, ale z nieskończonej wielkości bin.

Możesz spróbować znaleźć kilka artykułów na ten temat i spróbować zoptymalizować algorytm, ale ostatecznie pozostanie to brutalny sposób, aby wypróbować każdą możliwość i spróbować zminimalizować wynikowy rozmiar bin.

Jeśli nie potrzebujesz najlepszego rozwiązania, ale tylko jednego rozwiązania, możesz uniknąć brutalnego forsowania wszystkich kombinacji. Stworzyłem program, który również to zrobił.

Opis:

Images: array of the input images 
ResultMap: 2d array of Booleans 
FinalImage: large image 
  1. Sortuj tablica obrazy tak, że największy obraz jest na górze.
  2. Należy obliczyć całkowity rozmiar obrazów i zainicjować mapę wyników, aby jej rozmiar był 1,5 razy większy niż całkowity rozmiar obrazów (można by uczynić ten krok bardziej inteligentnym dla lepszego wykorzystania pamięci i wydajności). Ustaw ResultMap na taki sam rozmiar i wypełnij go wartościami fałszywymi.
  3. Następnie dodaj pierwszy obraz po lewej stronie FinalImage i ustaw wszystkie wartości logiczne w ResultMap true od 0,0 do ImageHeight, ImageWidth.

Mapa wyników służy do szybkiego sprawdzenia, czy można dopasować obraz do bieżącego obrazu FinalImage. Możesz zoptymalizować go, aby użyć int32 i użyć każdego bitu na jeden piksel. Zmniejszy to pamięć i zwiększy wydajność, ponieważ możesz sprawdzić 32 bitów naraz (używając maski). Ale stanie się to trudniejsze, ponieważ będziesz musiał pomyśleć o masce, którą musisz wykonać dla krawędzi obrazu.

Teraz opiszę prawdziwą pętlę "algorytmu".

  1. Dla każdego obrazu w tablicy spróbuj znaleźć miejsce, w którym by pasowało. Możesz napisać pętlę, która wyglądałaby przez tablicę ResultMap i szukać fałszywej wartości, a następnie zacząć sprawdzać, czy pozostaje ona fałszywa w obu kierunkach dla rozmiaru obrazu do umieszczenia.
    • Jeśli znajdziesz miejsce, skopiuj obraz do FinalImage i aktualizację prawidłowych wartości logicznych w ResultMap
    • Jeśli cand znaleźć miejsce, zwiększyć rozmiar FinalImage wystarczy (tak spojrzeć na brzegach, gdzie potrzebna jest minimalna ilość dodatkowego miejsca) i synchronizować również, że z ResultMap
  2. GOTO 1 :)

to nie jest optymalna, ale może rozwiązać ten problem w możliwie optymalny sposób (zwłaszcza jeśli istnieje jest kilka mniejszych obrazów do na końcu napełnij gabki).

-3

W non-programmatical sposób można korzystać z MS Paint funkcji "Wklej Z", czyli Wklej (JPEG) złożyć do obszar obrazu mspaint. Za pomocą tego można ułożyć pojedyncze obrazy i stworzyć ostateczny duży obraz i zapisać go w formacie JPEG/GIF/Raw-BMP.

-AD.

0

Optymalne pakowanie jest trudne, ale w zależności od szczegółów domeny problemu mogą być dostępne uproszczenia. Kilka pomysłów:

  1. Jeśli możesz wyrzeźbić swoje bitmapy na jednakowej wielkości kafelki, to pakowanie jest banalne. Następnie, na żądanie, zmontujesz bitmapy z płytek.

  2. Posortuj obrazy z największej na najmniejszą, a następnie dla każdego obrazu użyj chciwego przydziału, aby wybrać pierwszy dostępny pod-prostokąt, który pasuje do obrazu.

  3. Użyj algorytmu genetycznego. Zacznij od kilku losowo wybranych układów. Oceń je na podstawie tego, jak mocno są spakowane. Wymieszaj rozwiązania z najlepszych wyników i powtarzaj, aż uzyskasz akceptowalny wynik.

Powiązane problemy