Newsgroup: it.comp.lang.delphi
Titolo: Procedura per convertire una BMP da colori a toni di grigio.

Posto una procedura per convertire una Bitmap da colori a toni di grigio.
Attualmente sono costretto a convertire la bitmap a 24bit (RGB) per poterci
accedere con meno problemi ai pixel.
Il problema è che la bitmap risultante è a 24Bit, con, al massimo 256
colori. Uno spreco notevole.
Sarebbe meglio che la bitmap risultante avesse una palette modificata,
chessò 8 bit e quindi con 256 colori sono l'optimum. Solo che non ho idea di
come intervenire sulle palette.
Se qulcuno è in grado di modificarla, oppure ne ha direttamente una già
funzionante per convertire una Bitmap da colori a toni di grigio, posti il
codice su NG.
procedure Color_to_grey(VAR bitmap:Tbitmap);
var
  X,Y,C: Integer;
  P: PByteArray;
begin
bitmap.HandleType:=bmDIB;
bitmap.PixelFormat:=pf24Bit;
  For Y:=0 to bitmap.Height-1 do
   begin
    P:=bitmap.ScanLine[Y];
    x:=-3;
    while x<(bitmap.Width)*3-1 do
     begin
      inc(x,3);
      C:=(P[x]+P[x+1]+P[x+2])div 3;
      p[x]:=c;p[x+1]:=c;p[x+2]:=c;
     end;
  end;
end;
Ciao
Matteo
--
|   "L'automobile non si diffonderà mai.
|   In fondo, non saranno molti gli autisti disposti a guidarla."
|
|   "La televisione? Non avrà mai futuro.
|   La parola stessa è mezza greca e mezza latina."
|
|   Le ultime parole famose...

 accedere con meno problemi ai pixel.
Per prima cosa devi crearti un bmp a 8 bit settando il pixelformat. Poi ci
copi i valori giusti pixel per pixel.
L'oggetto tbitmap di delphi ha una palette, basta che gli modifchi i valori.
Ciao Uberto

 come intervenire sulle palette.
prova con questo codice
  // crea la gray bitmap
 bmpgray := TBitmap.create;
 bmpgray.pixelformat := pf8bit;
 bmpgray.width := bitmap.width;
 bmpgray.height := bitmap.height;
  // crea la palette toni di grigio
 getmem (logpal, 1028);
 try
   logpal.palversion := $300;
   logpal.palnumentries := 256;
   for i := 0 to 255 do with logpal.palpalentry[i] do begin
     pered := i;
     pegreen := i;
     peblue := i;
     peflags := 0;
   end;
   pal := createpalette (logpal^);
 finally
   freemem (logpal, 1028);
 end;
  // la assegna alla bitmap grayscale
 bmpgray.palette := pal;
  // trasforma in grayscale
 for y := 0 to bitmap.height-1 do begin
   inp := bitmap.scanline [y];
   outp := bmpgray.scanline [y];
   for x := 0 to bitmap.width -1 do
     outp[x] := (inp [x*3] + inp [x*3+1] + inp [x*3+2]) div 3;
 end;
  // la copia su bitmap
 bitmap.assign (bmpgray);
 bmpgray.free;
a questo punto su bitmap ti ritrovi una bmp 8bit in toni di grigio.
ciao,
DOC.
----------
Paolo 'DOC' Rosi
Lead programmer
DREAMWARE S.r.l. Multimedia Productions
Via Pascoli 19 - Centro J.F.Kennedy - 19124  La Spezia - ITALY
Tel. 
+39-0187-500968
 (pabx) - Fax: +39-187-516388
DREAMWARE  NORD-EST
Via Caneva 66/B - Gemona del Friuli - Udine - Italy
Tel. 
+39 0432 891189
   Fax 
+39 0432 971811
DREAMWARE CANADA
3-552 Church St.  - Toronto -  Ontario - M4Y 2E3 Canada
Tel. 
+1 416 922-0904
   Fax. 
+1 416 922 0362
http://www.dreamware.com
e-mail: 
d...@dreamware.com
, 
pr...@italy.dreamware.com
-------------------------------



E se la volessi in solo bianco e nero (0 e 1)????
Grazie 1000....specialmente Davide DG
Con i migliori saluti
Paolo Cazzanti
___________________________________________
Corso Porta Po, 130
Ferrara - 44100 - Italia
0532210876 - 0338/5364346 - 03498455369
pa...@giullari.com
 - 
giul...@giullari.com
www.giullari.com/paolocazzanti
www.giullari.com
--
Posted from [212.216.176.55]
via Mailgate.ORG Server - 
http://www.mailgate.org

 E se la volessi in solo bianco e nero (0 e 1)????
dovresti prima di tutto definire la bitmap come pixelformat:=pf1bit e poi
nella routine di conversione dovresti applicare un filtro per decidere se il
pixel sara' nero o bianco.
Il metodo piu' efficace e' quello di usare un filtro di retinatura (stucky,
floyd...). se cerchi su internet ne trovi a valanghe.
