Jak orbabiać obraz z image w innym wątku

0

Witam
nie mogę znalezc odpowiedzi na moje pytanie jak dobrac sie do innego komponentu na formie ( w domylse przyjmuję Image )
do pixeli zeby je obrabiać

czy będziecie tak mili i pomozecie ?
pozdr
Seba

0

Tak jak zwykle, poza tym, że używasz metody TThread.Synchronize. Jest to konieczne, ponieważ VCL (w tym TImage) jest napisany w sposób nieodpowrny na dostęp z wielu wątków. Czyli jeśli Twój wątek będzie grzebał w Image i wtym czasie scheduler przełączy na głowny watek aplikacji ktry akurat też zacznie grzebać w Image, to masz kłopot. Metoda Synchronize przyjmuje jako parametr bezparametrową metodę i powoduje wykonanie tej moetody w kontekście głównego wątku, a więc w sposób zabezpieczony przed konfliktami z głównym wątkiem.

0

Jeśli używasz Canvas to chyba nie trzeba synchronizować.

// dopisane: na pewno nie trzeba

0

Hi

dzieki PQ za informacje ale nie jestem jeszcze na tym etapie

moje pytanie brzmiało jak sie dobrać do poszczególnych pixeli
z Image ? bo nie moge znależc konkrentgo przykładu na forum zeby sobie pocwiczyć

pozdrawiam
Sebastian

0

Canvas.Pixels[x,y] i SetPixel

Składnia:

  SetPixel(Canvas,x,y,color);
  Color:=Canvas.Pixels[x,y];

sprawdz u siebie :O :O

przykład:

  var c:TColor;
  begin
    c:=Image1.Canvas.Pixels[0,0];
    SetPixel(Image1.Canvas,Random(Image1.Width),Random(Image1.Height),c);
  end;

pobiera kolor z lewego górnego narożnika obrazu i stawia kropki o tym kolorze w losowych miejscach obrazka

0

Witam
wiez ze jest taka skłądnia dziekuje za przypomnienie ale michodziło o to jak sie dobrac do tego w kontekscie wątku
bo tak to sobie juz probowłem ale to jest dosc wolne
szybciej działa fjca scanline wczytuje linie do tablisy
ale nie wiem jak sie dorbac do obrazka
probowałem na podstawie
<url>
Wątki
</url>
ale mi coś ciężko szło
pozdr Seba

0

w ramach wątku stwórz sobie bitmapę, przy pomocy synhronize przekopiuj do niej zawartość image i teraz możesz spokojnie sobie grzebać w tej bmp z poziomu wątku. Jak już zmienisz co chcesz to z powrotem przez synchronize bmp do image. Wada - zmiany nie są widoczne na bieŻąco (Boże, widzisz takie błędy i nie grzmisz) a jedynie końcowy efekt

0

Jest lepszy sposób (jednak nie wypróbowałem osobiście)...

Klasa TCanvas jest odporniejsza na wątki niż inne klasy VCL (teoretycznie obsługuje wątki). Wątek (jakiś tam) może operować na Canvasie bez metody Synchronize. Wystraczy przed zmianą zamknąć płótno dla innych wątków poprzez Lock(), zmodyfikować i zwolnić : UnLock().

Na przykład (poniższy kod w wątku):

Form1.Canvas.Lock;

Form1.Canvas.LineTo(10, 10);    
// Inne polecenia...

Form1.Canvas.UnLock;

Można też użyć TryLock(), który zamknie pod warunkiem jeśli inny wątek aktualnie nie zamknął płótna.

0

Witam
dziekuję bardzo wszystkim za informacje
przydały sie zrobiłem to co chciałem
:)
pozdrawiam
Sebastian

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