Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people, just like you, are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
Solved

C PROGRAMING

Posted on 2000-02-21
7
338 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
PRTG Network Monitor: Intuitive Network Monitoring

Network Monitoring is essential to ensure that computer systems and network devices are running. Use PRTG to monitor LANs, servers, websites, applications and devices, bandwidth, virtual environments, remote systems, IoT, and many more. PRTG is easy to set up & use.

 

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

ScreenConnect 6.0 Free Trial

Want empowering updates? You're in the right place! Discover new features in ScreenConnect 6.0, based on partner feedback, to keep you business operating smoothly and optimally (the way it should be). Explore all of the extras and enhancements for yourself!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Preface I don't like visual development tools that are supposed to write a program for me. Even if it is Xcode and I can use Interface Builder. Yes, it is a perfect tool and has helped me a lot, mainly, in the beginning, when my programs were small…
This tutorial is posted by Aaron Wojnowski, administrator at SDKExpert.net.  To view more iPhone tutorials, visit www.sdkexpert.net. This is a very simple tutorial on finding the user's current location easily. In this tutorial, you will learn ho…
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.
The goal of this video is to provide viewers with basic examples to understand opening and reading files in the C programming language.

829 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