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)</div> Testy

Energia

Obrazek Po Skalowaniu

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