本人项目中只需要读,因此没有提供写jpeg的代码。
有C的习惯用法,c++ hard core可能不习惯,欢迎修改。
提到的引擎,要找原始的代码,应可以找到。
主要代码
头文件:jpegReader.h
#define SIG_BYTES_OFFSET 6
#define HEADER_BYTES_TO_CHECK 4
//TODO:
//参考tge/../gBitmap.cc/GBitmap::allocateBitmap封装内存分配部分代码,并按osg2.2/.../Image.cpp/setImage封装设置MstBitmap的函数。
struct MstBitmap
{
unsigned int width;
unsigned int height;
unsigned int pixelFormat;
unsigned int internalFormat;
unsigned int dataType;
unsigned char *data;
};
源文件:jpegReader.cpp
#include "jpegReader.h"
#include <assert.h>
#include <GL/gl.h>
extern "C"
{
#include "jpeglib.h"
}
//参考ReaderWriterJPEG.cpp (osg2.2/.../jpeg)、bitmapPng.cc (tge/engine/dgl)完成。
//对libjpeg库的修改参考《libjpeg实现内存内位图的压缩及解压缩.mht》一文。不贴了。
MstBitmap * JpegReader::readJpegStream(void* stream,int size)
{
assert( size != 0);
assert(NULL != stream);
//检测是否jpeg格式
char sig[HEADER_BYTES_TO_CHECK];
strncpy(sig,(char*) stream + SIG_BYTES_OFFSET, HEADER_BYTES_TO_CHECK);
if( !strcmp(sig, "JFIF") )
return NULL;
struct jpeg_decompress_struct cinfo;
jpeg_error_mgr jerr;
int width;
int height;
int format ;
int rowBytes;
unsigned char *data;//解压后数据的指针
cinfo.err = jpeg_std_error(&jerr);
jpeg_create_decompress(&cinfo);
//指定数据源
jpeg_stdio_src(&cinfo,(char*)stream, size);
jpeg_read_header(&cinfo, TRUE);
switch (cinfo.out_color_space)
{
case JCS_GRAYSCALE:
format = 1; break;
case JCS_RGB:
format = 3; break;
default:
jpeg_destroy_decompress(&cinfo);
return NULL;
}
jpeg_start_decompress(&cinfo);
width = cinfo.output_width;
height = cinfo.output_height;
rowBytes = cinfo.output_width * cinfo.output_components;
data = new unsigned char[rowBytes * height];
//创建每一行数据的指针
unsigned char** row_p = new unsigned char*[height];
for (int i = 0; i < height; i++)
row_p[i] = &data[rowBytes*i];
//读取像素数据
for (unsigned int i = 0; i < height; i++)
jpeg_read_scanlines(&cinfo,&row_p[i], 1);
delete[] row_p;
jpeg_finish_decompress(&cinfo);
// Release JPEG decompression object
// This is an important step since it will release a good deal of memory.
jpeg_destroy_decompress(&cinfo);
unsigned int internalFormat =
format == 1 ? GL_LUMINANCE :
format == 2 ? GL_LUMINANCE_ALPHA :
format == 3 ? GL_RGB :
format == 4 ? GL_RGBA : (GLenum)-1;
unsigned int pixelFormat =
format == 1 ? GL_LUMINANCE :
format == 2 ? GL_LUMINANCE_ALPHA :
format == 3 ? GL_RGB :
format == 4 ? GL_RGBA : (GLenum)-1;
unsigned int dataType = GL_UNSIGNED_BYTE;
MstBitmap *pbi = (MstBitmap*)malloc(sizeof(MstBitmap));
if(NULL != pbi)
{
pbi->width = width;
pbi->height = height;
pbi->pixelFormat = pixelFormat;
pbi->internalFormat = internalFormat;
pbi->dataType = dataType;
pbi->data = data;
}
return pbi;
}
btw:
(csdn编辑系统貌似比较烂,所见非所得,反复弄几次,
也就这种乱七八糟的样子,有合适的就换)