Zupdatowałem źródło projekciku Seam Carving.

Troszeczkę przesadziłem z designem aplikacji. No ale od czegoś trzeba zacząć. Już wiem z czym to się je.

Aplikacja Rozdzielona jest na trzy moduły.

-UI w Formsach -Silnik Algorytmu -Silnik Graficzny

Silnik Graficzny:

IEnergyCalculator: - interfejs klasy liczącej energię EnergyCalGradient - liczenie gradientu IImageProcessor - interfejs klasy przetwarzającej obraz GdiImageProcess - przetwarzanie przy pomocy GDI+ i LockBitów IPixelManipulator - interfejs klasy modyfikującej pixele PixelColor -kolorowanie pixeli PixelRemove - usuwanie pixeli

Silnik Algorytmu

ISeamManipulator : - interfejs klasy operującej na Seamach DynamicSeamManipulator - dynamiczne usuwanie seama DynamicSeamManipulatorWithMark - to samo ale z zaznaczaniem seama StaticSeamManipulator - statyczne seamy [nie obsługiwane] StaticSeamManipulatorWithMark

Psuedo kod aplikacji:

for 1 to n do {

  1. Wczytanie Obrazka
  2. Wybranie Parametrów przetwarzania bitmapy
  3. Wywołanie algorytmu SeamCarving
  4. Wywołanie metody ManipulateSeam ISeamManipulatora
  5. Wyliczenie Energi Obrazka wywołanie metody Energy silnika graficznego ktora jako jeden parametr przyjmuje interfejs IEnergyCalculator
  6. Wyznaczenie Seama
  7. Wywołanie silnika graficznego i metody przetwarzającej obrazek na podstawie seama. }
Zastosowanie interfejsów pozwoliło mi stworzyć mniej powiązane klasy. Teraz np jak chcę policzyć Energię inną funkcją wystarczy , że stworzę klasę i odpowiednio zaimplementuje interfejs.W paru miejscach oczywiście przesadziłem m.in łamiąc regułę YAGNI ( You Aren't Gonna Need It)

Testy

Energia

Obrazek Po Skalowaniu

Na razie projekcik jest na wstrzymaniu. Jak ktoś ma jakieś uwagi , pytania to proszę pisać. Projekt “SeamCarving”

Share