Zaznaczanie fragmentu grafiki

0

Witam!

Pisałem w tej sprawie na pl.comp.lang.delphi, ale nie było odpowiedzi. Może ktoś z Was może mnie poratować.

Poszukuje komponentu, unita, rozwiązania, które pozowalałoby na zaznaczenie fragmentu obrazka (tak jak w dowolnym programie graficznym), a gdy już to zaznacznie nastąpi, to żeby prostokąt zaznaczenia (zaznaczenia typu non-rectangle, jak elipsa itp nie są mi potrzebne) zachowywał się tak jak zaznaczenie dowolnego obiektu w IDE Delphi. To znaczy: żeby miał "węzełki" w rogach i w połowie długości boków, żeby ich "chwycenie" pozwalało na zmianę rozmiaru prostokąta zaznaczenia, z dowolnej strony, oraz żeby oczywiście w dowolnym momencie dało się odczytać współrzędne zaznaczenia. No chodzi mi o najzwyklejsze w świecie dodanie opcji "crop" (przytnij) do obrazka. Podkreślam wyraz nazwyklejsze, bo istnienie takiego rozwiązania wydawało mi się oczywiste. A tu zdziwko - na pl.comp... bez słowa rozkładają ręce, przeszukanie DSP, Torry i CompBase (których używam) podaje jedynie bannalne komponenty do samego zaznaczania, a nawet takie potężne pakiety jak MarchingAnts realizują jedynie procedurę zaznaczania, bez możliwości zmiany rozmiaru zaznaczenia, tak jak to ma we wszystkich popularnych programach, w których operuje się na obiektach (Delphi, Word, PowerPoint, etc). Czy ktoś może mi poradzić jakieś ciekawe rozwiązanie ???

0

[stuk] Chyba najprostrzym rozwiązaniem jest przetrzymywanie zaznaczonej kopi obrazu w pamięci.
Powiedzmy tak:
var
Obraz, //Oryginalny obraz w pamięci
Zaznaczenie: TBitmap; //Kopia zaznaczonego fragmentu
Obraz jest wyświetlany np. na TPaintBox.

W momencie znaznaczania (najlepiej wykorzystać do rysowania ramki i uchwytów pmNotXor ew. użyć obiektu potomnego od TWinControl - przezroczystego z uchwytami. Coś takiego wykorzystywałem tworząc interface dynamiczny, w którym można było przenosić komponenty) wytnij fragment z Obraz i utwórz na podstawie tego Zaznaczenie. Dodatkowo musisz zapamiętać współrzędne położenia lewego górnego rogu. Jeżeli użyjesz wspomnianego obiektu (lub sam będziesz rysował uchwyty) to w zdarzeniu OnResize (lub OnMove paintboxa) zmieniasz jednocześnie rozmiary bitmapy (np. CopyRect, żeby zmniejszyć/zwiększyć obraz i jednoczesna zmiana rozmiaru Zaznaczenie.Width/Height). Cały czas wyrysowujesz Bitmapy na TPaintBox, a zmiany dotyczą jedynie bitmap w pamięci.
Mam nadzieję, że o to ci chodziło. Jeżeli chcesz ten komponent przezroczysty pochodzny od TWinControl (co nie jest trudne w napisaniu) to pisz tutaj to go napiszę.

0

Dzięki! Mniej więcej przejaśniłeś mi o co chodzi. Tylko, że mnie całe życie uczono, że Delphi po to ma setki tysięcy komponentów dostępnych na całym świecie, żeby nie wymyślać koła od nowa. Więc jeśli możesz to poślij mi tego komponenta na mejla: [email protected]. Dzięki!

1 użytkowników online, w tym zalogowanych: 0, gości: 1