2012-12-21 18 views
7

Korzystając z GDI + z Windows Forms, chcę móc rysować za pomocą pióra i mieszać kolory w oparciu o docelowy kolor piksela.Zaawansowane mieszanie kolorów za pomocą GDI +

Na przykład, jeśli narysuję linię i przekroczy ona czarne piksele, chcę, aby był jaśniejszy (na przykład biały), aby był widoczny. Kiedy ta sama linia przechodzi nad białymi pikselami, powinien być ciemniejszy (na przykład czarny), tak aby był wyraźnie widoczny.

Czy można to zrobić za pomocą GDI +?

+0

To będzie trudny. Można utworzyć TextureBrush z ImageAttributes, który używa specjalnie spreparowanego ColorMatrix, aby uzyskać ten efekt. Zbieranie ColorMatrix, które nie powoduje niepożądanych zmian kolorów, będzie trudne. –

+0

@Hans: Mam pracę z ColorMatrix, ale nie mam pojęcia, jakiego rodzaju ColorMatrix mogę użyć, aby zrobić to, co chcę. Czy ColorMatrix nie po prostu interpoluje kolory obrazu, które rysuję za pomocą pędzla? Muszę interpolować kolory w oparciu o obraz tła, który już rysowałem w kontekście grafiki. –

Odpowiedz

3

Zgodnie z propozycją Hans Passant, można malować przy użyciu co jest obecnie na płótnie jako zdjęcie pędzlem tekstury (może trzeba podwójnego buforowania do tego, aby działać poprawnie) i użyć ColorMatrix zmodyfikować kolory są malowane na płótnie .

Istnieje matryca kolorów, która odwraca kolory podobne do XOR, problem polega na tym, że nie będzie działać ze środkową szarością. Matryca kolor, który odwraca RGB i pozostawia alfa nienaruszone, to:

-1, 0, 0, 0, 0 
0,-1, 0, 0, 0 
0, 0,-1, 0, 0 
0, 0, 0, 1, 0 
1, 1, 1, 0, 1 

czegoś podobnego, aczkolwiek wolniejsza będzie skopiować płótno obraz i przetwarza ten obraz pikseli na piksel z zasadami, takie jak kolor będzie jaśniejszym niż 0,5, spraw, by było nieco ciemniej, aby było nieco jaśniejsze. Następnie malujesz ten przetworzony obraz jako pędzel tekstury. To dałoby lepszy wynik, ale byłoby znacznie wolniejsze niż przy użyciu ColorMatrix.

+0

Więc mówisz, aby narysować moją scenę do bufora obrazu, a następnie użyj tego obrazu z TextureBrush jako Brush for a Pen używanego do rysowania linii, które chcę. Następnie użyj ColorMatrix na Brush, aby odwrócić kolory. Ale czy w pobliżu środkowej szarości będą jakieś kolory, które nie będą widoczne? –

+0

Precyzyjnie. Lub możesz wypróbować drugie rozwiązanie, które jest wolniejsze, ale daje większą kontrolę. – Coincoin

1

Możesz wypróbować XORing kolor pióra. Paint.NET robi to z ramką wyboru, aby była widoczna na dowolnym kolorze.

+0

Czy masz pojęcie, jak to osiągnąć? Właściwie mam kod źródłowy dla starszej wersji Paint.NET i nie jest to robione tak samo jak nowa wersja. Kod, który mam, ma dwa pióra, białe i czarne pióro i rysuje je z tym samym wzorem kreski z różnymi przesunięciami, aby stworzyć naprzemienny kolor kreski. –

+0

Przepraszam, nie mam pojęcia. Na swoim blogu nazywają to kontekstowym wzorcem punktów XOR. –

0

Och, nie sądzę, że to jest zbyt trudne. Można utworzyć pióro, które automatycznie zmienia kolory w zależności od tego, gdzie się znajduje. Po prostu odczytaj piksel w miejscu, w którym znajduje się pióro (patrz przykład), Pobierz komponent Alpha i ustaw kolor pióra na czarny lub biały, jeśli jest on większy lub mniejszy niż 255/2 odpowiednio :)

Powiązane problemy