modyfikacja bitmapy

0

mam nastepujacy problem :-|, otwieram plik *.bmp (256x256 w 256 kolorach szarosci), nastepnie wyswietlam go na canvas i pobieram kazdy piksel z obrazka, chce go zmodyfikowac np. podzielic kazda wartosc pixela na 2 i nastepnie wyswietlic go na nastepnym canvas - i tu pojawia sie problem bo obraz po modyfikacji ma jakby czerwone tlo (chyba zapisuje sie w innej palecie kolorów - tak podejrzewam) - dopiero zaczynam moja przygode z modyfikacji bitmap w delphi oto ponizszy kod...

var
i,j : integer;
pix: Tcolor;
pixn: double;

begin

OpenPictureDialog1.Execute;
Image1.Picture.LoadFromFile(OpenPictureDialog1.Filename);
for i:=0 to 255 do
for j:=0 to 255 do //pobieram kolejne pixele
begin
pixn:=0;
pix:=GetRValue(Image1.Canvas.Pixels[i,j]); //pobieram wartosc koloru (0-255)
pixn:=pix/2;
end;
Image2.Canvas.Pixels[i,j]:=round(pixn); //aby uzyskac wartosc bez przecinka
end;</delphi>

0

Po pierwsze to daj format pixeli bitmapy na 24bit
Bitmapa.PixelFormat:=pf24bit;
Po drugie nie operuj na Pixelach tylko na ScanLine (jakie 200 X szybciej)

0
beginneruser napisał(a)

chce go zmodyfikowac np. podzielic kazda wartosc pixela na 2 i nastepnie wyswietlic go na nastepnym canvas - i tu pojawia sie problem bo obraz po modyfikacji ma jakby czerwone tlo
...

        pixn:=0;
        pix:=GetRValue(Image1.Canvas.Pixels[i,j]);    //pobieram wartosc koloru (0-255)
        pixn:=pix/2;
</delphi>

Wcale mnie to nie dziwi że obrazek robi sie czerowny ponieważ pobierasz czerwoną składową koloru i przypisujesz ją całemu pikselowi.
Spróbuj tak:

...       
BYTE r = GetRValue(pixel);
BYTE g = GetGValue(pixel);
BYTE b = GetBValue(pixel);
...
// Tu przetwarzasz pobrane przed chwilą wartości
...
TColor NewColor = RGB(r, g, b); // Łączysz w jeden kolor i możesz go przypisac pikselowi
...

-edit
sry za c++

var
 pixel : TColor;
 r : Byte;
 g : Byte;
 b : Byte;
 NewColor : TColor;

begin
...
 r := GetRValue(pixel);
 g := GetGValue(pixel);
 b := GetBValue(pixel);
...
// Tu przetwarzasz pobrane przed chwilą wartości
...
 NewColor := RGB(r, g, b); // Łączysz w jeden kolor i możesz go przypisac pikselowi
...
end;
0

ok, to wiele wyjasnie - dzieki, jednak jak podzielic uzyskany kolor przez np. 9 (jak dokonac konwersji typów, jezli pixel to wartosc Tcolor ?, na razie szukam w helpie - ale jak by ktos wiedzial chetnie skorzystam z pomocy.

ps.
A jest mozliwosc pobrania od razu z obrazka wartosc pixela w poziomie szarosci (0-255) ?

0

Widzę ,że interesujesz się grafiką a skoro tak to powinieneś opanować sobie ScanLine (kulkadziesiąt , jeśli nie kilkaset razy szybciej)
Masz tu takiego małego gotowca którego napisałem kiedyś tam
http://4programmers.net/Delphi/Gotowce/Bitmapa-Scan_Line_-_jak_zrobić_negatyw,skalę_szarości,_zmanę_kanałów_RGB

Jeśli nie umiesz ScanLine to możesz się zwrócić do mnie o pomoc (za free bo to nie trudne)
to przyspieszy twoją naukę i zaoszczędzi mjejsca na Serwerze :)
A tak sobie myślę ,że to jakiś art o ScanLine muszę tu strzelić bo dużo osób pyta potem jak przyspieszyć algorytmy na Pixelach .

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