Solved

C PROGRAMING

Posted on 2000-02-21
7
307 Views
Last Modified: 2010-04-15
How to open .bmp and .jpeg files using
c program?
0
Comment
Question by:sriram_bandi
7 Comments
 

Author Comment

by:sriram_bandi
ID: 2544870
Adjusted points to 80
0
 

Author Comment

by:sriram_bandi
ID: 2544871
Please send the answer as early as possible.
0
 
LVL 10

Expert Comment

by:rbr
ID: 2544969


FILE *fp;

fp=fopen ("filename.bmp","rb");

or

fp=fopen (filename.jpeg","rb");

For a description of the fileformat check

http://www.wotsit.org/
0
How your wiki can always stay up-to-date

Quip doubles as a “living” wiki and a project management tool that evolves with your organization. As you finish projects in Quip, the work remains, easily accessible to all team members, new and old.
- Increase transparency
- Onboard new hires faster
- Access from mobile/offline

 

Author Comment

by:sriram_bandi
ID: 2549210
We already know that any file can be opened in C using File operations. But how to read the actual picture data from a bmp file. Because bmp file has a format i.e a header will be load at first inorder to identify the bmp file. So we request you to send the bmp format.
0
 
LVL 84

Expert Comment

by:ozo
ID: 2549290
rbr gave a link to a description of the file format
http://wotsit.org/cgi-bin/download.cgi?bmp
0
 
LVL 14

Expert Comment

by:AlexVirochovsky
ID: 2550186
What is you OS? What you want to do with BMP/jpg file?
0
 
LVL 3

Accepted Solution

by:
sumant032199 earned 80 total points
ID: 2550262
Really big stuff.
Try this.
If you don't mind I will recommend you to use djgpp compiler available at www.delorie.com Download ALLEGRO library it supports many file types like BMP,PCX readily and easily. Hence
go for it.

#include <alloc.h>
#include <conio.h>
#include <dos.h>
#include <dir.h>
#include <io.h>
#include <fcntl.h>
#include <sys\stat.h>
#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
//h file
typedef unsigned char BYTE;
typedef unsigned int  WORD;
typedef long       DWORD;
typedef struct tagBITMAPFILEHEADER{
    WORD   bfType;
    DWORD  bfSize;
    WORD   bfReserv1;
    WORD   bfReserv2;
    DWORD  bfOffbits;
} BITMAPFILEHEADER;
typedef struct tagBITMAPINFOHEADER{
    DWORD   biSize;
    DWORD   biWidth;
    DWORD   biHeight;
    WORD    biPlanes;
    WORD    biBitCount;
    DWORD   biCompression;
    DWORD   biSizeImage;
    DWORD   biXPelPerMeter;
    DWORD   biYPelPerMeter;
    DWORD   biClrUsed;
    DWORD   biClrImpotant;
} BITMAPINFOHEADER;
typedef struct tagRGBQUAD
{
    BYTE    rgbBlue;
    BYTE    rgbGreen;
    BYTE    rgbRed;
    BYTE    rgbReserved;
} RGBQUAD;
typedef struct tagBITMAPINFO{
    BITMAPINFOHEADER  bmiHeader;
    RGBQUAD           bmiColors[1];
} BITMAPINFO;
#define GALLOC(P,S)   if ((P = (unsigned char *)farmalloc(S))==NULL) error(0)
#define VALLOC(P,N,E) if ((P = (E *)calloc(N,sizeof(E)))==NULL) error(0)

/* constants for the biCompression field */
#define BI_RGB      0L
#define BI_RLE8     1L
#define BI_RLE4     2L
//c file
static RGBQUAD *rgbTable = NULL;
static BYTE *szFile = NULL;
static int nColor;
static BITMAPFILEHEADER bmHeader;
static BITMAPINFO bmInfo;
void main (int argc, char **argv);
int  ReadBitMap(char *name, int *nX, int *nY, int nType, int nYMax);
static int  GetColor256(RGBQUAD *rgbTable);
static BYTE Normal(BYTE color);
int  ReadBit(char *name);
void FreeMap(void);
static void Error_Graph(void);
void   error (int n);
/*=========================================================================*/
/*  Name       : main    */
/*  Descript   : test programme    */
/*  Parameters : name of bmp file    */
/*=========================================================================*/
void cdecl main (int argc, char **argv)
{
  int gdriver = VGA, gmode = VGAMED; //graphic initialization
  /* initialize graphics and local variables */
  initgraph(&gdriver, &gmode, "C:\\TC\\BGI");
  /* read result of initialization */
  Error_Graph();
  cleardevice();
  if (argc >= 2)
    {
      int nX,nY;
      ReadBitMap(argv[1],&nX,&nX,0,480);
      getch();
    }
  closegraph();     /* clean up */
}  // end main
/*=========================================================================*/
/*  Name       : Error_Graph       */
/*  Descript   : If there are errors ==> exit    */
/*  Parameters : None    */
/*  Return     : None    */
/*  Call       : main    */
/*=========================================================================*/
void Error_Graph(void)
{
  int errorcode = graphresult();

  if (errorcode != grOk)   // an error occurred
   {                                    // message of error
     printf("graph error: %s\n", grapherrormsg(errorcode));
     printf("press any symbol\n");
     getch();
     exit(1); // terminate with an error code
   }
} // end Error_Graph
/*=========================================================================*/
/*  Name       : ReadBitMap    */
/*  Descript   : Read BMP file (without Compression) and Display in 1-st   */
/*        :  Page of Graphik. Memory    */
/*  Parameters : name of file, # of column, # of lines    */
/*             : nType = 0: disply pixels with y < MAXY    */
/*        :       = 1 display pixels only > MAXY (in begin of screen) */
/*  Return     : -1: no such file, 0: OK    */
/*=========================================================================*/
int ReadBitMap(char *name, int *nX, int *nY, int nType, int nYMax)
{
   int x, y,color, n, ind, ind1, i, ret = -1;
   long lLen;

   if (ReadBit(name) == 0) //OK?
     {
       ind = 0;
       for (y = 0; y < bmInfo.bmiHeader.biHeight; y++)
{
ind1 = 0;
for (x = 0; x < bmInfo.bmiHeader.biWidth; x++)
{
n = szFile[ind]; //type of BMP;
switch(nColor)
{
case 2:          //monochrom
color = szFile[ind] & (1<< (7 - ind1) );
if (color) color = 1;
ind1++;
if (ind1 >= 8)
{
ind1 = 0; ind++;
}
break;
case 16:          //16 colors
if (!ind1)
{
color = n/16; ind1 = 1;
}
else
{
color = n%16; ind++; ind1 = 0;
}
break;
case 256: //256 colors
color = n; ind++;
break;
default:  //error (can be 24 : without RGBcolors: not in use for Dos
ind++;
break;
}
if (!nType && bmInfo.bmiHeader.biHeight - y < nYMax)
putpixel(x, bmInfo.bmiHeader.biHeight - y,GetColor256(&rgbTable[color]) );
else if (nType && bmInfo.bmiHeader.biHeight - y >= nYMax)
putpixel(x, bmInfo.bmiHeader.biHeight - y - nYMax,GetColor256(&rgbTable[color]) );
}
if (ind1 || ind%4) //next?
{
ind /= 4; ind = (ind+1)*4;
}
}
       FreeMap(); //delete RGB table
       ret = 0;
       *nX = bmInfo.bmiHeader.biWidth;  //return values
       *nY = bmInfo.bmiHeader.biHeight;
     }
     return ret;
} // end ReadBitMap
/*=========================================================================*/
/*  Name       : GetColor256    */
/*  Descript   : Get colr from Predefined table by real color    */
/*  Parameters : Color of Pixel    */
/*  Return     : index of Borlandc color/0(Black): no such    */
/*=========================================================================*/
int GetColor256(RGBQUAD *rgbT)
{
  int
  color, i;
  static RGBQUAD rgbTest[16] =
    {
      {  0,   0,   0, 0},
      {127,   0,   0, 0},
      {  0, 127,   0, 0},
      {127, 127,   0, 0},
      {  0,   0, 127, 0},
      {127,   0, 127, 0},
      {  0, 127, 127, 0},
      {127, 127, 127, 0},
      { 63,  63,  63, 0},
      {255,   0,   0, 0},
      {  0, 255,   0, 0},
      {255, 255,   0, 0},
      {  0,   0, 255, 0},
      {255,   0, 255, 0},
      {  0, 255, 255, 0},
      {255, 255, 255, 0}
    };

  for (i = 0; i < 16; i++)
    if (rgbT->rgbBlue == rgbTest[i].rgbBlue  &&
rgbT->rgbGreen == rgbTest[i].rgbGreen &&
rgbT->rgbRed == rgbTest[i].rgbRed)
      return i;

  return 0;
}
/*=========================================================================*/
/*  Name       : Normal    */
/*  Descript   : From Windows color goto Dos color    */
/*  Parameters : Color(from 0 to 255)    */
/*  Return     : 0/127/255:  nearest    */
/*=========================================================================*/
BYTE Normal(BYTE color)
{
  if (color != 0 && color <= 63)
    color = 0;
  else if (color != 127 && color > 63 && color <= 192)
    color = 127;
  else if (color != 255 && color > 192)
    color = 255;

  return color;
}
/*=========================================================================*/
/*  Name       : ReadBit    */
/*  Descript   : Read BMP file (without Compression)    */
/*  Parameters : name of file    */
/*  Return     : -1: no such file, 0: OK    */
/*=========================================================================*/
int ReadBit(char *name)
{
   int fIn = open(name, O_RDONLY | O_BINARY);
   if(fIn==-1) error(1);
   int n,i, ret = -1;
   long lLen;

   rgbTable = NULL;
   szFile = NULL;

   if (fIn >= 0)
     {
       read(fIn, &bmHeader, sizeof(bmHeader));    //read Header
       if (bmHeader.bfType == 19778)        //"BM"
{
read(fIn, &bmInfo, sizeof(BITMAPINFOHEADER ));    //read Header
switch (bmInfo.bmiHeader.biBitCount)       //find N of colors
{
case  1:  nColor = 2;  break; //MONO
case  4:  nColor = 16; break; //16 colors
case  8:  nColor = 256;break; //256 colors
case 24:  nColor = 0;break; //2**24 colors
}
if (nColor)
{
VALLOC(rgbTable,nColor,RGBQUAD);
read(fIn, rgbTable, nColor*sizeof(RGBQUAD)); //read Color Table

for (n = 0; n < nColor; n++)
{
rgbTable[n].rgbBlue = Normal(rgbTable[n].rgbBlue);
rgbTable[n].rgbGreen = Normal(rgbTable[n].rgbGreen);
rgbTable[n].rgbRed = Normal(rgbTable[n].rgbRed);
}
}
lseek(fIn, bmHeader.bfOffbits ,  SEEK_SET); //read file
lLen = bmHeader.bfSize - bmHeader.bfOffbits;
GALLOC(szFile,lLen); //alloc place for Bits
n = lLen/30000l;
if (lLen % 30000l) n++;
for (i = 0; i < n; i++) //read bits
read(fIn, szFile+i*30000l,30000);
ret = 0;
}
       close(fIn);
     }
  return ret;
} // end ReadBitMap
/*=========================================================================*/
/*  Name       : reeMap    */
/*  Descript   : Free color Table    */
/*=========================================================================*/
void FreeMap(void)
{
  if (rgbTable)
    {
      free(rgbTable);
      rgbTable = NULL;
    }

  if (szFile)
    {
      farfree(szFile);
      szFile = NULL;
    }
}
/*=========================================================================*/
/* Description: error - Exits program in case of fatal error.              */
/* Parameter  : nEInd   - index of code of error message to display.    */
/* szText  - added test of error message    */
/* Return val : None.    */
/*=========================================================================*/
void error (int n)
{
   fcloseall ();
   closegraph(); //clear screen
   perror("ERROR");
   exit (n); //exit from utile
} // end error
0

Featured Post

How to run any project with ease

Manage projects of all sizes how you want. Great for personal to-do lists, project milestones, team priorities and launch plans.
- Combine task lists, docs, spreadsheets, and chat in one
- View and edit from mobile/offline
- Cut down on emails

Join & Write a Comment

An Outlet in Cocoa is a persistent reference to a GUI control; it connects a property (a variable) to a control.  For example, it is common to create an Outlet for the text field GUI control and change the text that appears in this field via that Ou…
This is a short and sweet, but (hopefully) to the point article. There seems to be some fundamental misunderstanding about the function prototype for the "main" function in C and C++, more specifically what type this function should return. I see so…
The goal of this video is to provide viewers with basic examples to understand how to use strings and some functions related to them in the C programming language.
Video by: Grant
The goal of this video is to provide viewers with basic examples to understand and use nested-loops in the C programming language.

760 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

26 Experts available now in Live!

Get 1:1 Help Now