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]Nie wiem jak wykonać zapis nowego koloru dla piksela

liamsd 04 Wrz 2005 16:27 1405 2
REKLAMA
  • #1 1791197
    liamsd
    Poziom 10  
    Posty: 35
    Jasność piksela można policzyć na dwa sposoby.
    Pierwszy - najprostszy, to uśrednianie, wszystkie 3 składowe (R, G i B) dodajesz do siebie i dzielisz wynik przez 3. Niestety metoda ta nie zgadza się z postrzeganiem jasności przez człowieka. Oko ma różną czułość na różne barwy. I wypada wykorzystać:
    Sposób drugi - średnia ważona. Każdy kolor mnożony jest z odpowiednią wagą, tak, aby odpowiadał on charakterystyce czułości oka. Nie pamiętam teraz dokładnych wartości, ale w przybliżeniu (chodzi o wartości współczynników) wygląda to tak:
    Y = 0.3*R + 0.59*G + 0.11*B
    Otrzymana w ten sposób wartość to luminancja.

    I tu mam właśnie problem chce zamienic każdy kolejny piksel na nową wartość obliczoną z w/w wzoru. Nie znam wogole funkcji lub polecenia do tego. Jeśli ktoś może mi pomóc w zapisaniu obrazu w 8-bitach (256kolorach). Please
  • REKLAMA
  • #2 1791811
    kult
    Poziom 16  
    Posty: 180
    Pomógł: 17
    Ocena: 5
    najprosciem zrobic to tak:
    wczytaj bitmape do image, nastepnie za pomoca funkcji image.canvas.pixel[x,y]:=Tcolor;
    gdzie x,y to wspolrzedne pixela, a TColor to kolor w postaci HEX
    $RRGGBB.
    Pewnie nastepne pytanie bedzie brzmialo jak zapisac wartosc z ineger'a do tej zmiennej TColor. Rozwiazac to mozna nawiele sposobow, mozesz np tak:
    (Kazdy kolor jest typu byte)
    zamieniasz kazdy kolor z postaci Dec na dwojkową (w postaci stringa), nastepnie laczysz je do wspolnej zmiennej np wyni:string;
    czyli: wynik:=R+G+B;
    nastepnie zmienna wynik zmieniasz znow na postac Dec i przypisujesz do pixela;
    image.canvas.pixel[x,y]:=BinToDec(wynik);
    Pozdr.
  • #3 1792492
    shg
    Poziom 35  
    Posty: 2289
    Pomógł: 339
    Ocena: 135
    A prosciej i wydajniej zamienić tak:
    wynik := R*65536 + G*256 + B
    Przy założeniu, że R, G i B są składowymi o rozmiarze bajtu, czyli z zakresu 0...255
    No, a w sumie, jak zamiast tych trzech składowych wstawiasz tylko luminancję, to jeszcze szybciej:
    wynik := (65536 + 256 + 1) * Y
REKLAMA