next up previous contents
Next: 2.6 PHIGS Up: 2 Programiranje Previous: 2.4 Portable PixMap

2.5 Windows BitMaP

V okolju Windows lahko zapisemoemo tudi datoteko BMP, ki jo razume vecina programov (Panitbrush, Slikar, ...). Zal je format zahtevnejsi in je zato primeren le za pisanje iz nasih programov. Za branje pa bi bil primer bolj kompleksen, saj obstaja vrsto podformatov ter kompresij rastrskih podatkov. Pisanje datoteke se najlazje izvede v jeziku C, v Fortranu pa standardno to ni mogoce.

Primer programa, ki zapise 24-bitno RGB datoteko:

/* Primer pisanja Windows BMP datoteke
   za LITTLE-ENDIAN (PC) racunalnike  LK98*/

#include <stdio.h>

#define WIDTH  28     /* mnogokratnik stevila 4 */
#define HEIGHT 25     /* visina slike */

#define RED 2
#define GREEN 1
#define BLUE 0

int
main()
{
  struct 
    {
      unsigned char _[2];
      unsigned long FileSize : 32;
      unsigned char __[12];
      unsigned long ImageWidth : 32;
      unsigned long ImageHeight : 32 ;
      unsigned char ___[8];
      unsigned long SizeOfBitmap : 32;
      unsigned char ____[16];
    } static header = { 
    {'B', 'M'}, 0, { 0,0,0,0, 0x36, 0,0,0, 0x28, 0,0,0}, 
    0, 0, { 1,0, 0x18,0, 0,0, 0,0}, 0,
    {0x6d, 0x0b, 0, 0, 0x6d, 0x0b, 0,0,0,0,0,0,0,0,0,0} };
  
  FILE *fbmp;
  int i, j;
  unsigned char img[HEIGHT][WIDTH][3];
  
  /* Nastavimo glavo BMP datoteke */
  header.ImageWidth = WIDTH;
  header.ImageHeight = HEIGHT;
  header.SizeOfBitmap = WIDTH * HEIGHT * 3;
  header.FileSize =  header.SizeOfBitmap + 0x36;

  /* Celotna slika je crna */
  for(i = 0; i < HEIGHT; i++)
    for(j = 0; j < WIDTH; j++)
        img[i][j][0] = img[i][j][1] = img[i][j][2] = 0;
  /* razen ene rumene pike spodaj levo */
  img[0][0][RED] = 255 ; img[0][0][GREEN] = 255;

  fbmp = fopen("primer.bmp", "wb");
  fwrite(&header, 0x36,  1, fbmp);
  fwrite(img, 3, WIDTH*HEIGHT, fbmp);
  fclose(fbmp);
  
  return 0;
}



Leon Kos
Tue Mar 24 18:24:32 CET 1998