Newsgroup: it.comp.lang.pascal
Titolo: BMP

Qualcuno ha le specifiche (o meglio un programma dimostrativo) per
visualizzare immagini BitMap MONOCROMATICHE (1bit).
Riesco a visualizzare quelle a 16 e 256 colori, ma le monocromo (soprattutto
quelle di grandi dimensioni) risultano incomprensibili.
Ciao
  Carlo

visualizzare immagini BitMap MONOCROMATICHE (1bit).
Allora, le immagini bitmap monocromatiche sono salvate per compressione di 1
pixel in 1 bit e quindi 1 byte e' l'insieme di 8 pixel.
Cio' significa che, in dipendenza dalle dimensioni delle immagini, avrai una
dimensione del file di questo tipo :
320x200  ->  8000 = 320 x 200 / 8
640x480  -> 38400 = 640 x 480 / 8
800x600  -> 60000 = 800 x 600 / 8
1024x768 -> 98304 = 1024 x 768 / 8
e cosi' via... 
scarti l'header e le informazioni aggiuntive, finche' non ti resta da leggere
solo il numero di byte riportati sopra ed espandi ogni byte negli 8 pixel
corrispondenti, a partire dalla linea di fondo del video.
Ti ho scritto, di seguito, un programma che ti mostra come fare :
{$x+}
uses crt, graph;
type packed_line   = array [0..79] of byte ;
type normal_line   = array [0..639] of byte ;
const pot2 : array [0..7] of byte = ($01,$02,$04,$08,$10,$20,$40,$80) ;
var gd, gm : integer ;
    x, y   : word ;
    f      : file ;
    dummy  : array [0..61] of byte ;
    linea_compressa : packed_line ;
    linea_espansa   : normal_line ;
procedure espandi_linea(l_comp : packed_line ; var l_exp : normal_line) ;
var i, j : byte ;
begin
  for i := 0 to 79 do
    for j := 0 to 7 do
      l_exp[8*i+j] := (l_comp[i] and pot2[7-j]) shr (7-j) ;
end;
begin
  gd := detect ;
  initgraph(gd, gm, '\tp\bgi') ;
  assign(f, 'bwcity.bmp');
  { apre un file di immagine monocromatica di dimensioni 640x480 pixel }
  reset(f, 1);
  blockread(f, dummy, 62);
  { salta l'header e le eventuali informazioni aggiuntive }
  { 38462 - 62 = 38400 = 640x480 / 8                      }
  for y := 479 downto 0 do
  begin
    blockread(f, linea_compressa, sizeof(linea_compressa));
    espandi_linea( linea_compressa, linea_espansa );
    for x := 0 to 639 do putpixel(x, y, white * linea_espansa[x]);
  end;
  close(f) ;
  readkey ;
end.
--
Posted from 
itaca.ulysse.it
 [195.223.254.1]
via Mailgate.ORG Server - 
http://www.mailgate.org


Te l'ho mandato per e-mail.
Ciao,  Fabio
--
fabi...@rocketmail.com

Te l'ho mandato per e-mail.
Non e' che le puoi postare anche qui su questo NG se non sono troppo
lunghe? Sai, potrebbero interessare a qualcuno.
Grazie.
Bye.

e cosi' via... 
Nel caso si dovessero aprire immagini che non sono in questo formato,
io aggiungerei che il numero di byte per descrivere una linea deve
essere un multiplo di 4.
Esempio:
se ho un immagini 8x8 pixel non vengono utilizzati 8 byte (1 byte per
ogniuna delle 8 righe) ma 32 (4 byte ogniuna delle 8 righe).
Fabio
--
fabi...@rocketmail.com

...

Se stai lavorando con le immagini in formato .BMP, invece di scriverti
tutte le procedure puoi utilizzare la unit che ho fatto io
(immbmp.tpu) e che puoi trovare nel mio sito
(
http://users.iol.it/fabio.manzo
), che ti permette di visualizzare
immagini in B/N, 16 e 256 colori. La unit permette anche di salvare lo
schermo in un file di formato .BMP
Cosi' almeno me la testi pure e mi dici se a volte non va.
Nel sito c'e' anche una unit per stampare immagini sempre in formato
BMP  per stampanti Epson ESC/P2 e FX (o in loro emulazione). Se ti
capita di provarla dimmi se a te funziona.
Ciao,   Fabio
--
fabi...@rocketmail.com