zaznaczenie a'la Photoshop

0

problem mam taki:

Mam na formie dwa TImage położone jeden na 2gim, przy czym ten górny ma ustawione transparent na true. Na dolnym rysuje jakiś obrazek a na górnym rysuje zaznaczenie, czyli obrys obszaru o dowolnym kształcie, który zaznaczył użytkownik. Wszystko działa ale zaznaczenie jest stosunkowo mało widoczne, a wiec:

  1. Pierwszy pomysł polegał na cyklicznym pokazywaniu i ukrywaniu górnej bitmapy za pomocą visible. to się nawet sprawdziło, ale widać miganie, białe pasy pokazujace sie na ułamek sekundy i nie wiem jak je wyeliminować

  2. znacznie ładniejszym rozwiązaniem byłoby coś co można zaobserwować np. w Photosopie. efekt jest tam podobny do pochodu mrówek.. Niestety nie mam pomysłu jak to zrobić żeby było szybko i wmiare łatwo.
    Do głowy przyszło mi jedynie, aby zrobić maske składajacą sie z np. skośnych pasów i maskować nią górną bitmape. Otrzymamy wtedy zaznaczenie rysowane przerywana linią. Gdyby teraz przesuwać maske np. poziomo to kreseczki by się przesuwały. wydaje mi isę jednak że to rozwiązanie jest bardzo ale to bardzo nieoptymalne.

Może jakieś inne propozycje?

0

czyzby nikt nie miał jakiegokolwiek pomysłu jak zrobić zaznaczenie zaznaczenia jak w Photoshopie?

0

Zrób to na regionach. Jeden prostokątny o wymiarach zaznaczenia, drugi o piksel mniejszy. Odejmij je, a różnicę wypełnij wzorkiem. Powinieneś uniknąć migotania i tych innych.

0

jest tylko jedno ale...
moje zaznaczenie wcale nie jest prostokątne. Myśle, że udałoby mi się zrobić region o kształcie mojego zaznaczenia, ale znalezienie regionu o 1px mniejszego (czyli takiego coby po odjęciu tych 2ch regionów został tylko obrys) jest już raczej ponad moje siły

0

nie wiem czy to kogoś interesuje ale problem rozwiązałem tak:

najpierw rysuje bitmape, na której na stale mam narysowany obrys mojego zaznaczenia, np.:

bit:=tbitmap.Create;
bit.Canvas.Pen.Color:=clred;;
bit.Canvas.Rectangle(20,20,100,100); //ten prostokat to przyklad mojego obrysu
Timer1.Enabled:=true;

a w ontimer timera rysuje skośne pasy na calym tImage

image1.Canvas.Draw(0,0,bit);
image1.Tag:=image1.Tag+1;
image1.Canvas.Pen.Color:=clBlue;
image1.Canvas.Pen.Mode:=pmMergeNotPen	;
image1.Canvas.Pen.Width:=3;
if image1.Tag>10 then image1.Tag:=0;
for i:=1 to (bit.Width div 5) do
  begin
  image1.Canvas.MoveTo(i*10+image1.Tag,0);
  image1.Canvas.LineTo(0,i*10+image1.Tag);
  end;

pen.mode jest ustawione na pmMergeNotPen dzieki czemu biale piksele bitmapy bit pozostaja biale, natoiast obrys staje sie dwukolorowy. Pasy są rysowane za kazdym razme w nieco innym polozeniu (są przesunięte o image1.tag) dlatego powstaje animacja podobna do pochodu mrówek który chciaem uzyskać.
Kod działa ale zapewne jest bardzo nieoptymalny. co gorsza chyba niebardzo da się go przyspieszyć.

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