logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[DELPHI] Jak zmienić kolory w bitmapie w Delphi za pomocą ComboBox?

TomekMus 04 Kwi 2016 00:54 1635 13
REKLAMA
  • #1 15578529
    TomekMus
    Poziom 17  
    Posty: 329
    Ocena: 7
    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ć?
  • REKLAMA
  • Pomocny post
    #2 15578924
    arnoldziq
    VIP Zasłużony dla elektroda
    Posty: 5376
    Pomógł: 789
    Ocena: 300
    1. Wczytujesz obraz do pamięci.
    2. Przeszukujesz wszystkie punkty
    3. Jeżeli znajdziesz szukany, to zmieniasz go na nowy.
    4. Koniec.
  • REKLAMA
  • #3 15580904
    TomekMus
    Poziom 17  
    Posty: 329
    Ocena: 7
    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] Jak zmienić kolory w bitmapie w Delphi za pomocą ComboBox?
  • #4 15581333
    arnoldziq
    VIP Zasłużony dla elektroda
    Posty: 5376
    Pomógł: 789
    Ocena: 300
    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.
    Kod: Delphi
    Zaloguj się, aby zobaczyć kod
    Załączniki:
    • Project1.zip (340.62 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • REKLAMA
  • #5 15581418
    Jaca
    Poziom 32  
    Posty: 1332
    Pomógł: 239
    Ocena: 217
    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
  • #6 15581524
    arnoldziq
    VIP Zasłużony dla elektroda
    Posty: 5376
    Pomógł: 789
    Ocena: 300
    Jaca napisał:
    Proponowałbym operować na wartościach H(ue) (S)aturation

    Coś takiego, jaki w załączniku?
    Załączniki:
    • Project1.zip (341.13 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #7 15581722
    Jaca
    Poziom 32  
    Posty: 1332
    Pomógł: 239
    Ocena: 217
    Przykład zmiany zielonego koloru. Strasznie wolne ze względu na użycie Pixels[]. Szybciej by było z użyciem ScanLine...
    Załączniki:
    • Project1.rar (1.03 MB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #8 15581754
    arnoldziq
    VIP Zasłużony dla elektroda
    Posty: 5376
    Pomógł: 789
    Ocena: 300
    Fajnie to wygląda :)
    Ale jaką wartość zmienia ten suwak?
  • #9 15581759
    Jaca
    Poziom 32  
    Posty: 1332
    Pomógł: 239
    Ocena: 217
    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 15581981
    arnoldziq
    VIP Zasłużony dla elektroda
    Posty: 5376
    Pomógł: 789
    Ocena: 300
    Jaca napisał:
    Z użyciem ScanLine, kolor jest zmieniany prawie w czasie rzeczywistym - sprawdziłem.
    To może kolega się kodem podzieli? :P
  • REKLAMA
  • #12 15582090
    arnoldziq
    VIP Zasłużony dla elektroda
    Posty: 5376
    Pomógł: 789
    Ocena: 300
    Dżyszla napisał:
    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.
  • #13 15582183
    Dżyszla
    Poziom 42  
    Posty: 7077
    Pomógł: 1095
    Ocena: 226
    A to źle Cię zrozumiałem. Ale nie ma tego złego - przyda się innym ;)

    A co do procedury, to przejście przez HSV może być naprawdę wygodne.
  • Pomocny post
    #14 15582590
    Jaca
    Poziom 32  
    Posty: 1332
    Pomógł: 239
    Ocena: 217
    arnoldziq napisał:
    Jaca napisał:
    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

    Kod: Delphi
    Zaloguj się, aby zobaczyć kod

Podsumowanie tematu

LABEL_AI_GENERATED
Użytkownik poszukuje sposobu na zmianę kolorów w bitmapach w Delphi przy użyciu ComboBox. W odpowiedziach zaproponowano kilka metod, w tym przeszukiwanie pikseli bitmapy i zmianę ich wartości RGB. Zasugerowano również konwersję kolorów z RGB na HSV, co ułatwia detekcję odcieni i modyfikację kolorów. Wskazano na użycie procedury ScanLine dla zwiększenia wydajności operacji na pikselach. Uczestnicy dyskusji dzielili się fragmentami kodu oraz przykładami implementacji, co może być pomocne dla innych programistów.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA