Switch to full style
For C/C++ coders discussions and solutions
Post a reply

help reading greyscaled image !

Wed Jun 10, 2009 12:40 pm

hello,

I need to read a grey-scale bitmap image using C++ , i have the code below but it works with some images while it reports error for other images.
I know that something goes wrong with reading in this line
Code:
if (fread(&grey,sizeof(char),1,fptr) != 1)


but i've no idea what is it ?
Can you help me please ?

cpp code
#include "stdio.h"
#include "stdlib.h"
#include "math.h"
#include <iostream.h>
// bitmap header structs
#ifndef TRUE
#define TRUE 1
#define FALSE 0
#endif

//#include "paulslib.h"

/*
Sample program to read a limited number of BMP file types
Write out lots of diagnostics
Write out a 24 bit RAW image file
*/

typedef struct {
unsigned short int type; /* Magic identifier */
unsigned int size; /* File size in bytes */
unsigned short int reserved1, reserved2;
unsigned int offset; /* Offset to image data, bytes */
} HEADER;
typedef struct {
unsigned int size; /* Header size in bytes */
int width,height; /* Width and height of image */
unsigned short int planes; /* Number of colour planes */
unsigned short int bits; /* Bits per pixel */
unsigned int compression; /* Compression type */
unsigned int imagesize; /* Image size in bytes */
int xresolution,yresolution; /* Pixels per meter */
unsigned int ncolours; /* Number of colours */
unsigned int importantcolours; /* Important colours */
} INFOHEADER;
typedef struct {
unsigned char r,g,b,junk;
} COLOURINDEX;
// functions used for reading bitmap
/*
Read a possibly byte swapped unsigned short integer
*/
int ReadUShort(FILE *fptr,short unsigned *n,int swap)
{
unsigned char *cptr,tmp;

if (fread(n,2,1,fptr) != 1)
return(FALSE);
if (swap) {
cptr = (unsigned char *)n;
tmp = cptr[0];
cptr[0] = cptr[1];
cptr[1] =tmp;
}
return(TRUE);
}

/*
Read a possibly byte swapped unsigned integer
*/
int ReadUInt(FILE *fptr,unsigned int *n,int swap)
{
unsigned char *cptr,tmp;

if (fread(n,4,1,fptr) != 1)
return(FALSE);
if (swap) {
cptr = (unsigned char *)n;
tmp = cptr[0];
cptr[0] = cptr[3];
cptr[3] = tmp;
tmp = cptr[1];
cptr[1] = cptr[2];
cptr[2] = tmp;
}
return(TRUE);
}
// end functions used for reading bitmap

int main(int argc,char **argv)
{
int i,j;
int gotindex = FALSE;
char grey,r,g,b;
HEADER header;
INFOHEADER infoheader;
COLOURINDEX colourindex[256];
FILE *fptr;

/* Check arguments */
if (argc < 2) {
fprintf(stderr,"Usage: %s filename\n",argv[0]);
exit(-1);
}

/* Open file */
if ((fptr = fopen(argv[1],"r")) == NULL) {
fprintf(stderr,"Unable to open BMP file \"%s\"\n",argv[1]);
exit(-1);
}



/* Read and check the header */
ReadUShort(fptr,&header.type,FALSE);
fprintf(stderr,"ID is: %d, should be %d\n",header.type,'M'*256+'B');
ReadUInt(fptr,&header.size,FALSE);
fprintf(stderr,"File size is %d bytes\n",header.size);
ReadUShort(fptr,&header.reserved1,FALSE);
ReadUShort(fptr,&header.reserved2,FALSE);
ReadUInt(fptr,&header.offset,FALSE);
fprintf(stderr,"Offset to image data is %d bytes\n",header.offset);

/* Read and check the information header */
if (fread(&infoheader,sizeof(INFOHEADER),1,fptr) != 1) {
fprintf(stderr,"Failed to read BMP info header\n");
exit(-1);
}
fprintf(stderr,"Image size = %d x %d\n",infoheader.width,infoheader.height);
fprintf(stderr,"Number of colour planes is %d\n",infoheader.planes);
fprintf(stderr,"Bits per pixel is %d\n",infoheader.bits);
fprintf(stderr,"Compression type is %d\n",infoheader.compression);
fprintf(stderr,"Number of colours is %d\n",infoheader.ncolours);
fprintf(stderr,"Number of required colours is %d\n",
infoheader.importantcolours);

/* Read the lookup table if there is one */
for (i=0;i<255;i++) {
colourindex[i].r = rand() % 256;
colourindex[i].g = rand() % 256;
colourindex[i].b = rand() % 256;
colourindex[i].junk = rand() % 256;
}
if (infoheader.ncolours > 0) {
for (i=0;i<infoheader.ncolours;i++) {
if (fread(&colourindex[i].b,sizeof(unsigned char),1,fptr) != 1) {
fprintf(stderr,"Image read failed 1 \n");
exit(-1);
}
if (fread(&colourindex[i].g,sizeof(unsigned char),1,fptr) != 1) {
fprintf(stderr,"Image read failed 2 \n");
exit(-1);
}
if (fread(&colourindex[i].r,sizeof(unsigned char),1,fptr) != 1) {
fprintf(stderr,"Image read failed 3 \n");
exit(-1);
}
if (fread(&colourindex[i].junk,sizeof(unsigned char),1,fptr) != 1) {
fprintf(stderr,"Image read failed 4 \n");
exit(-1);
}
fprintf(stderr,"%3d\t%3d\t%3d\t%3d\n",i,
colourindex[i].r,colourindex[i].g,colourindex[i].b);
}
gotindex = TRUE;
}

/* Seek to the start of the image data */
fseek(fptr,header.offset,SEEK_SET);

/* Read the image */
for (j=0;j<infoheader.height;j++) {
for (i=0;i<infoheader.width;i++) {

if (infoheader.bits== 8) {

if (fread(&grey,sizeof(char),1,fptr) != 1) {
fprintf(stderr,"Image read failed 6 %s \n",&grey);
exit(-1);
}
if (gotindex) {
fprintf(stderr,"indexed\n");
putchar(colourindex[grey].r);
putchar(colourindex[grey].g);
putchar(colourindex[grey].b);
} else {

putchar(grey);
}
}
else
{
fprintf(stderr,"Not Grey Scale Image !!");
return 0;
}



} /* i */
} /* j */

fclose(fptr);
return 0;
}


Note: this code was supposed to read colored & grey-scaled images but I modified it to read gray-scale only , original code is here : http://local.wasp.uwa.edu.au/~pbourke/dataformats/bmp/parse.c

Thnx in advanced :)



Re: help reading greyscaled image !

Wed Jul 08, 2009 12:47 am

i probably should delete this post of yours anyway ..first of all read the fucking code before making a copy paste read the comments look the code you provided to us the original one ..
you problem solves bmp images restricted and you make it to work only with greyscale images that meant that the images are 8-bit when you import an image non bmp and more then 8 bit it wont work ..it is simple logicil you dont know what kind of restriction you put in your code and you expect me to sit and look throught your homework task ..?doesnt look like a silly thing to you ..
if (infoheader.bits== 8) for example why you put this? you can understand it?
its like telling me take a car and drive it but you know there is no fuel in it how you ll drive it?

Re: help reading greyscaled image !

Wed Jul 08, 2009 12:50 am

plus you want to make codes that have to do with images use matlab ..

Re: help reading greyscaled image !

Thu Jul 09, 2009 5:47 am

When I decrease the opacity of the pencil sketch layer it makes the sketch lines look faded and when I increase its opacity, the white in the sketch layer makes the colours of the airbrush layer look washed out. Is a compromise between the two the only way I'm going to be able to manage this?

Re: help reading greyscaled image !

Wed Jul 22, 2009 5:16 pm

probably you should find the right combination in order to have the best result..in my ocasio it was about 30% 25% 25% 20%
somehow like that ..:)

Post a reply
  Related Posts  to : help reading greyscaled image !
 Reading the all file in php     -  
 Reading email in Python     -  
 Reading a Specific Character in php     -  
 Parsing and Reading RSS feeds     -  
 Multithreaded File Reading     -  
 Java Object Reading     -  
 Reading file with integers     -  
 Earn $5000 for reading emails     -  
 Reading and Writing To text file     -  
 Reading selected data from a source file     -  

Topic Tags

C++ Files and I/O