Witam,
Głowie się juz chyba od godziny, jak napisać funkcję która
dostaje zmienną TBitmap(kolorową), a następnie zamienie wszystkie kolory oprócz czarnego na biały do osobnego Tbitmap.
Bardzo proszę o pomoc.
Witam,
Głowie się juz chyba od godziny, jak napisać funkcję która
dostaje zmienną TBitmap(kolorową), a następnie zamienie wszystkie kolory oprócz czarnego na biały do osobnego Tbitmap.
Bardzo proszę o pomoc.
Tutaj masz konwersję na bitmapę w skali szarości.
Procedure Greyscale(Bitmap:TBitmap);
var
Row:^TrgbTriple; // wskaźnik do rekordu reprezentującego składowe RGB Pixela
H,V,Index:Integer;
begin
Bitmap.PixelFormat:=Pf24bit;
for V:=0 to Bitmap.Height-1 do
begin
Row:=Bitmap.ScanLine[V];
for H:=0 to Bitmap.Width -1 do
begin
Index := ((Row.rgbtRed * 77 + //77 to stała dla czerwieni
Row.rgbtGreen* 150 + //150 stała dla zielonego
Row.rgbtBlue * 29) shr 8); //29 stała dla niebieskiego
Row.rgbtBlue:=Index;
Row.rgbtGreen:=Index;
Row.rgbtRed:=Index;
Inc(Row);{ Nie wolno przypisywać X:=0 lub 1,2 bo to Wskaźnk!!! poruszamy się inc() lub dec()}
end;
end;
end;
Niezupełnie o to mi chodziło.
Chodzi mi o hmm..<ort>po prostu </ort>podmienienie kolorów
Tak żeby wszystkie kolory zamieniły się na biały, oprócz czarnego.
HINT: czarny jak i biały wyróżniają się tym że dla nich R=G=B oraz względem siebie leżą na przeciwnych końcach skali =]
kurde, no nie moge dojść do tego jak to zrobić, co rusz jak coś wymyśle to nie działa prawidłowo :P
może wyjaśnię dokładniej:
Mam 2 zmienne TBitmap. Jedna z pf24bit, druga z pf8bit.
Chciałbym aby jakaś funkcja skopiowała to z pf24bit do tej z pf8bit ale bez kolorów (tzn. tak jak napisałem wyżej). Czy problemem jest to, że mają inny pixel format ? I przez to są różne "anomalie" ?
Może wyjaśnię to na przykładzie:
Chcę programowo otrzymać z takiej bitmapy:
http://img370.imageshack.us/my.php?image=48488158vd3.png
taką:
http://img220.imageshack.us/my.php?image=66896833wu2.png
I analogicznie z każdą inną.
Bardzo proszę o pomoc, bo już drugi dzień się głowię i nic wymyślić nie mogę.
Poszukaj algorytmu konwertującego bitmapę (wielobitową) do 1bitowej bitmapy monochromatycznej.
http://www.efg2.com/Lab/ImageProcessing/pf1bit.htm
Następnie, zastosuj Negatyw dla uzyskanej bitmapy 1bitowej.
procedure Negative(Bitmap:TBitmap);
var
H,V:Integer;
WskByte:^Byte; //Wskaźnik do Bajta (nie trzeba do całego pixela bo i tak wszystko odwracamy)
begin
Bitmap.PixelFormat:=Pf24bit;
for V:=0 to Bitmap.Height-1 do
begin
WskByte:=Bitmap.ScanLine[V]; // V jest to pozycja danej linii bitmapy (od góry )
for H:=0 to (Bitmap.Width -1)*3 do
begin
WskByte^:= not WskByte^ ;// (odwracamy wartość na którą pokazuje wskaźnik)
Inc(WskByte);//Przesuwam wskaźnik
end;
end;
end;
więc tak:
w tym programie: JeanPierreJouandetPf1bit.ZIP ( z linku który podałeś) wszystko działa dobrze tj.
wczytuje nim bitmape z pliku, klikam invert i jest tak jak powinno być.
Jednak gdy próbuję to wstawić do mojego programu to już nie jest tak kolorowo.
przeanalizwałem kod z tego programu, plik wczytuje normalnie do zmiennej tj. LoadFromFile, a potem klikam invert i jest OK, czyli teoretycznie w moim programie wystarczy wczytać plik i "przemielić" go przez funkcję invert.
więc wczytuję bitmapę do zmiennej:
a.LoadFromFile('a.bmp');
a potem wstawiam procedurę invert:
procedure Invert;
VAR
Bitmap: TBitmap;
i : INTEGER;
j : INTEGER;
bm : integer;
RowIn : pByteArray;
RowOut: pByteArray;
begin
Bitmap := TBitmap.Create;
TRY
WITH Bitmap DO
BEGIN
Width := a.Width;
Height := a.Height;
// Unclear why this must follow width/height to work correctly.
// If PixelFormat precedes width/height, bitmap will always be black.
PixelFormat := pf1bit;
END;
if bitmap.width mod 8 <> 0 then bm:= (bitmap.width div 8)
else bm := (bitmap.width div 8) -1;
FOR j := 0 TO Bitmap.Height-1 DO
BEGIN
RowOut := pByteArray(Bitmap.Scanline[j]);
RowIn := pByteArray(a.Scanline[j]);
FOR i := 0 TO bm DO
BEGIN
RowOut[i] := NOT RowIn[i]
END
END;
a := Bitmap
FINALLY
Bitmap.Free
END;
end;
ale przy kompilacji wyskakuje external exception.
dodam, że zmienna a jest 8-śmio bitowa, a nawet jak zamienie ją na 24-ro to i tak ten sam błąd.
Już mi ręce opadają bo nie mam pojęcia czemu w tym programie to działa, a w moim nie :P
// starałem się to opisać najlepiej jak potrafię :P