Zmiana koloru pikseli na bitmapie

1

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?

0

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'.

1
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ć.

1

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.

0

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ć?

0

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

1

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.

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