Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[DELPHI] - Zmiana kolorów w bitmapie

TomekMus 04 Apr 2016 00:54 1350 13
  • #1
    TomekMus
    Level 17  
    Ja z poziomu Delphi zamieniać kolory na bitmapach.

    Coś takiego mnie interesuje mój podstawowy obrazek który wczytuje z pliku bmp, jpg lub inny format graficzny, jest na nim zdjęcie przedmiotu który składa się z 4 kolorów np. żółty, zielony, czerwony, czarny - wszystko na białym tle lub innym do ustalenia. Chcę by moja aplikacja za pomocą 4 parametrów z ComboBox zmieniała kolory tych podstawowych wczytanych z pliku graficznego.

    Czy wiecie jak to dokonać?
  • Helpful post
    #2
    arnoldziq
    Moderator of Programming
    1. Wczytujesz obraz do pamięci.
    2. Przeszukujesz wszystkie punkty
    3. Jeżeli znajdziesz szukany, to zmieniasz go na nowy.
    4. Koniec.
  • #3
    TomekMus
    Level 17  
    OK rozumiem idę jest super i w miarę proste.

    Lecz jak poradzić sobie z kolorem czerwonym np. sznurka gdzie ma wiele odcieni.
    Jak zmienić tylko za zdjęciu "jeden" kolor czerwony.

    [DELPHI] - Zmiana kolorów w bitmapie
  • #4
    arnoldziq
    Moderator of Programming
    Każdy kolor, jest budowany z 3 składowych RGB.
    Wystarczy odpowiednio dobrać tolerancję dla danej składowej koloru.

    Odpal sobie zamieszczony programik i 'pojeździj' myszką po obrazku.

    Własciwie cały program 'mieści' się w jednej procedurze i jednej funkcji do formatowania wyniku.
    Code: delphi
    Log in, to see the code
    Attachments:
  • #5
    Jaca
    Level 31  
    Proponowałbym operować na wartościach H(ue) (S)aturation - w ten sposób łatwo wykrywać odcienie kolorów.

    Dla każdego pixel'a:

    1. Konwersja RGB -> HSV
    2. Detekcja koloru/tła
    3. Modyfikacja H
    4. Konwersja HSV -> RGB
  • #8
    arnoldziq
    Moderator of Programming
    Fajnie to wygląda :)
    Ale jaką wartość zmienia ten suwak?
  • #9
    Jaca
    Level 31  
    Hue :-). Trzeba jeszcze dobrać tolerancję. W przykładzie jest +/-25. Przy 30 jest lepiej.

    EDIT.

    Z użyciem ScanLine, kolor jest zmieniany prawie w czasie rzeczywistym - sprawdziłem.
  • #10
    arnoldziq
    Moderator of Programming
    Jaca wrote:
    Z użyciem ScanLine, kolor jest zmieniany prawie w czasie rzeczywistym - sprawdziłem.
    To może kolega się kodem podzieli? :P
  • #12
    arnoldziq
    Moderator of Programming
    Dżyszla wrote:
    To ja się podzielę fragmentem użycia ScanLine:
    Tym, to ja też mogłem się podzielić :P
    Chodziło mi raczej o samą procedurę transformacji koloru.
  • Helpful post
    #14
    Jaca
    Level 31  
    arnoldziq wrote:
    Jaca wrote:
    Z użyciem ScanLine, kolor jest zmieniany prawie w czasie rzeczywistym - sprawdziłem.
    To może kolega się kodem podzieli? :P


    Tu nie ma się czym dzielić :-). Do konwersji RGB->HSV->RGB użyłem "na szybko" znalezionego unit'a: Link

    Code: delphi
    Log in, to see the code