#### Archived

This topic is now archived and is closed to further replies.

# Opening JPEG images.

This topic is 6439 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

## Recommended Posts

I have been given a project that includes a .rpc file. In the file is information about a JPEG image and the image itself. I can open this file and get all kinds of information about the image but I don''t know how to display the JPEG image itself. Please help, I have been working on this for over a month. Axel

##### Share on other sites
libjpeg from http://www.ijg.org/ will let you do what you want in a couple of function calls. I was messing around with it trying to get it to dump the rendering window, and it works really well. I think I will try and modify lesson 6 to read the texture from a jpeg, and post the results if I get it to work.

##### Share on other sites
Rohar,

When you modify what lesson 6 to work with JPEG can you forward me the changes in the code.

Axel

##### Share on other sites
this will prettymuch drop in for loadBMP, and load the texture from a jpeg. It works, but I didn't put alot of time into error checking, I will when I get a chance. There is a whack of info returned from the libjpeg library, which should be error checked for correctness....

You need to link with libjpeg.lib & have the headers. (I built my own libjpeg library from the source @ http://www.ijg.org/ for vc on win98, but it also works on my RH6.2 box with the included libjpeg library)
Make sure you use a 256x256x24 RGB JFIF jpeg... and you should be okey-dokey. (I just converted the NeHe bmp to a jpeg with no changes)
The dumb-assed looking math where I am swapping the buffer is because the image loads upside down. The row pointer array is because libjpeg needs a pointer array, and can return more than 1 line at a time... When I understand the library better, I think that the temp buffer can get turfed, and more than 1 line can be processed at a time. (array of pointers to the output buffer, and change them with each call to jpeg_read_scanlines)

The docs that come with libjpeg are pretty good.

If you don't mind... don't pick on my code, I did this from scratch in an hour and it even works

you'll need to wrap extern "C" { } around the c includes for vc
  #include #include /* simple loader for 24bit jpeg (data is in rgb-format) */int LoadJPEG(char *filename, textureImage *texture){ FILE *file; struct jpeg_decompress_struct cinfo; struct jpeg_error_mgr jerr; volatile JSAMPROW row = 0; JSAMPROW rowptr[1]; int i,j,nrows; cinfo.err = jpeg_std_error(&jerr); jpeg_create_decompress(&cinfo); /* make sure the file is there and open it read-only (binary) */ if ((file = fopen(filename, "rb")) == NULL) { printf("File not found : %s\n", filename); return 0; } jpeg_stdio_src(&cinfo, file); jpeg_read_header(&cinfo, TRUE); jpeg_start_decompress(&cinfo); texture->width = cinfo.output_width; texture->height = cinfo.output_height; printf("Colorspace %d\n",cinfo.jpeg_color_space); row = (JSAMPROW)calloc(1,cinfo.image_width * cinfo.output_components * sizeof(JSAMPLE)); texture->data = malloc(cinfo.image_width * cinfo.image_height * cinfo.output_components * sizeof(JSAMPLE)); rowptr[0] = row; for (i = 0; i < cinfo.output_height; i++) { nrows = jpeg_read_scanlines(&cinfo, rowptr, 1); if (nrows != 1) { fprintf(stderr, "jpeg_read_scanlines" " returns %u, expected 1\n", nrows); return 0; } for (j = 0; j < cinfo.output_width*cinfo.output_components; j++) texture->data[(cinfo.output_height-1-i)*cinfo.output_width*cinfo.output_components+j] = row[j]; } jpeg_finish_decompress(&cinfo); jpeg_destroy_decompress(&cinfo); free(row); return 1;}

Edited by - rohar on November 1, 2000 7:48:28 PM

##### Share on other sites
rohar -> Thanks for your code...
But I couldn''t compile it... I done something wrong when I used it. The linker give me this messages:

"void __cdecl jpeg_destroy_decompress(struct jpeg_decompress_struct *)" (?jpeg_destroy_decompress@@YAXPAUjpeg_decompress_struct@@@Z)
"unsigned char __cdecl jpeg_finish_decompress(struct jpeg_decompress_struct *)" (?jpeg_finish_decompress@@YAEPAUjpeg_decompress_struct@@@Z)
"unsigned char __cdecl jpeg_start_decompress(struct jpeg_decompress_struct *)" (?jpeg_start_decompress@@YAEPAUjpeg_decompress_struct@@@Z)
"void __cdecl jpeg_stdio_src(struct jpeg_decompress_struct *,struct _iobuf *)" (?jpeg_stdio_src@@YAXPAUjpeg_decompress_struct@@PAU_iobuf@@@Z)
"void __cdecl jpeg_CreateDecompress(struct jpeg_decompress_struct *,int,unsigned int)" (?jpeg_CreateDecompress@@YAXPAUjpeg_decompress_struct@@HI@Z)
"struct jpeg_error_mgr * __cdecl jpeg_std_error(struct jpeg_error_mgr *)" (?jpeg_std_error@@YAPAUjpeg_error_mgr@@PAU1@@Z)

Or short, the linker couldn''t find the stuff.
I used the Libjpeg.lib (wrong version??) but the linker couldn''t find the stuff.
Can you help me to solve this ''little'' problem?

Thanks

##### Share on other sites
The library is compiled without a extern "C" {...} when linked into c++.

You need to wrap extern "C" around the includes when you compile & link with vc++.
  extern "C"{#include #include }

This should really be in the jpeglib.h, but it isn't.

Edited by - rohar on November 6, 2000 9:23:39 PM

1. 1
2. 2
3. 3
Rutin
19
4. 4
5. 5

• 14
• 12
• 9
• 12
• 37
• ### Forum Statistics

• Total Topics
631424
• Total Posts
3000008
×