Kolorowa bitmapa na czarno-białą

0

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.

0

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;
0

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.

0

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 =]

0

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" ?

0

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ę.

0

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;
0

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

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