Witam, mam pewien problem ze zmianą koloru pikseli na analizowanej bitmapie. Otóż moim zadaniem jest wyselekcjonowanie z bitmapy zapisanej w 8 bitowej skali szarości pikseli o kolorze zawierającym się w pewnym przedziale, tj powiedzmy od jasnoszarego do białego, a następnie zmiana ich barwy na żółtą, cała reszta pikseli (a więc od jasnoszarego w dół do czarnego) ma przybrać kolor czarny, ot taka swojego rodzaju binaryzacja. Nie miałbym z tym problemu większego, nawet biorąc pod uwagę, że bardzo średnio u mnie z programowaniem, gdyby trzeba było po pikselom o konkretnej barwie zmienić ją na żółtą, nie bardzo natomiast wiem jak się zabrać do problemu, kiedy muszę określić zakres kolorów, w jakim muszą się owe piksele mieścić by kwalifikować je do zmiany koloru. Jak zapisać to w C# korzystając z system.drawing, żeby piksele od jednej danej wartości koloru do drugiej zostały poddane takiej operacji?
Przejrzeć dostępne klasy, ich metody. Użyć do tego Intellisense (podpowiadanie w Visual Studio), google, forum, msdn.
ps. jak nie będzie ci odpowiadała wydajonść takiego rozwiązania to szukaj w google pod 'lockbits'.
Rev napisał(a)
Przejrzeć dostępne klasy, ich metody. Użyć do tego Intellisense (podpowiadanie w Visual Studio), google, forum, msdn.
Miło, że założyłeś iż nie przeglądałem dostępnych klas i metod, googlów, forów i msdn. Jak podkreśliłem średnio u mnie z programowaniem i to wszystko nie jest tam dla mnie takie oczywiste, mimo ze jakimś cudem kawał aplikacji wykrywającej obiekty na obrazie z kamery napisałem. Naprawdę, jeśli Twoja pomoc ma się ograniczać do odsyłania zainteresowanych na google, odpuść sobie i nie marnuj swojego cennego czasu eksperta programisty dla takiego początkującego szaraka jak ja. Lepiej dla nas, jak będziemy się sobą mniej nawzajem irytować.
chodzi Ci o to żeby wybrać piksele na monochromatycznej bitmapie mające jasność od n do m?
Wystarczyłoby, jeśli rozumiem o co Ci chodzi, coś takiego:
for (int x = 0; x < width; x++)
for(int y = 0; y < height; y++)
{
if (bitmap.GetPixel(x, y).R >= minBright && bitmap.GetPixel(x, y).R <= maxBright)
{ bitmap.SetPixel(x, y, Color.Yellow); }
else
{ bitmap.SetPixel(x, y, Color.Black); }
}
Pisałem z pamięci, mogą być drobne błędy.
Dzięki wielkie MSM, właśnie na częścią zestawiania wartości kolorów pobranych pikseli ze skalą jasności się zastanawiałem, wiem teraz jak to powinno wyglądać, problemem jest teraz jednak to, że nazwy MinBright i MaxBright nie są rozpoznawane przez kompilator. Czym one dokładnie są, tj jakimi obiektami, jako co mogę je zadeklarować?
Są to zmienne typu byte określające poziomy szarości w granicach, w których chcesz zmieniać kolor na żółty. Sam musisz określić jakie to są wartości.
Pozdrawiam
Łukasz Gawron
Aha dziękuje za objaśnienie. W sumie jeśli wyznaczyłem sobie jedną granicę powyżej której piksele przybierają kolor żółty, a poniżej kolor czarny wystarczy tylko jeden warunek z wartością większą od minBright. Musiałem jeszcze cały obraz przenieść przed operacją do nowej bitmapy, bo metoda SetPixel nie działa w przypadku obrazów o formacie pikseli indeksowanych, ale później zadziałało już ok :) Szkoda tylko, że odbywa się to tak wolno - prędkość odświeżania obrazu maleje do ok 2-3 klatek na sekundę. Spróbuję zastosować metodę lockbits klasy Bitmap, ewentualnie jeszcze z tym się zgłoszę jak nie wyjdzie. Dzięki za pomoc jeszcze raz.