Класс для работы с Jpeg
Автор John W. Ratcliff
Данный класс позволять производить компрессию
и декомпрессию изображений в формате Jpeg,
используя библиотеку Intel Jpeg Library.
Эта библиотека позволяет оперировать
изображением с помощью всего одной DLL. Для работы
с этой библиотекой достаточно добавить в Ваш
проект файлы из бибилиотеки IJL.H, IJL.LIB, IJL.DLL. Саму
бибилиотеку можно найти по адресу
http://www-cs.intel.com/support/performancetools/libraries/ijl/index.htm
.
Там Вас попросят зарегистрироваться и ждать
письма на почтовый ящик о регистрации (на мой
взгляд довольно утомительно) , а здесь можно взять без
регистрации.
В библиотеку включены несколько примеров,
которые помогут Вам разобраться с Интеловким
классом.
Скачать: jpeg.cpp
Листинг (пример использования библиотеки для
работы с Jpeg изображениями) |
// *** The JPEG.H wrapper layer header file.
#ifndef JPEG_H
#define JPEG_H
//############################################################################
//## ##
//## JPEG.H ##
//## ##
//## Wrapper class to compress or decompress a jpeg from a block of memory ##
//## using the Intel Jpeg Library. ##
//## OpenSourced 2/4/2000 by John W. Ratcliff ##
//## ##
//## No warranty expressed or implied. Released as part of the triangle ##
//## throughput testbed project. ##
//############################################################################
//## ##
//## Contact John W. Ratcliff at jratcliff@verant.com ##
//############################################################################
class Jpeg
{
public:
static void *ReadImage(int &width, // ширина загружаемой картинки.
int &height, // высота загружаемой картинки.
int &bpp, // БАЙТ (не бит) НА ПИКСЕЛЬ.
const void *buffer, // адрес памяти, в котором хранятся
// сжатые jpeg-ом данные.
int sizebytes); // размер сжатых jpeg-ом данных.
static void * Compress(const void *buffer, // адрес картинки в памяти
int width, // ширина картинки в пикселах
int height, // высота картинки в пикселах.
int bpp, // *БАЙТ* на пиксель изображения 1 или 3
int &len, // возвращённая длина сжатых данных
int quality=75); // качество картинки в процентах
};
#endif
// ** JPEG.CPP, the code used to wrap IJL
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
//############################################################################
//## ##
//## JPEG.CPP ##
//## ##
//## Wrapper class to load a jpeg from a block of memory. ##
//## ##
//## OpenSourced 2/4/2000 by John W. Ratcliff ##
//## ##
//## No warranty expressed or implied. Released as part of the triangle ##
//## throughput testbed project. ##
//############################################################################
//## ##
//## Contact John W. Ratcliff at jratcliff@verant.com ##
//############################################################################
#include "jpeg.h"
#include "ijl.h" // заголовочный файл Интелевской библиотеки jpeg.
// читаем картинку в этот буфер.
void * Jpeg::ReadImage(int &width,
int &height,
int &nchannels,
const void *buffer,
int sizebytes)
{
JPEG_CORE_PROPERTIES jcprops;
if ( ijlInit(&jcprops) != IJL_OK )
{
ijlFree(&jcprops);
return 0;
}
jcprops.JPGBytes = (unsigned char *) buffer;
jcprops.JPGSizeBytes = sizebytes;
jcprops.jquality = 100;
if ( ijlRead(&jcprops,IJL_JBUFF_READPARAMS) != IJL_OK )
{
ijlFree(&jcprops);
return 0;
}
width = jcprops.JPGWidth;
height = jcprops.JPGHeight;
IJLIOTYPE mode;
mode = IJL_JBUFF_READWHOLEIMAGE;
nchannels = jcprops.JPGChannels;
unsigned char * pixbuff = new unsigned char[width*height*nchannels];
if ( !pixbuff )
{
ijlFree(&jcprops);
return 0;
}
jcprops.DIBWidth = width;
jcprops.DIBHeight = height;
jcprops.DIBChannels = nchannels;
jcprops.DIBPadBytes = 0;
jcprops.DIBBytes = (unsigned char *)pixbuff;
if ( jcprops.JPGChannels == 3 )
{
jcprops.DIBColor = IJL_RGB;
jcprops.JPGColor = IJL_YCBCR;
jcprops.JPGSubsampling = IJL_411;
jcprops.DIBSubsampling = (IJL_DIBSUBSAMPLING) 0;
}
else
{
jcprops.DIBColor = IJL_G;
jcprops.JPGColor = IJL_G;
jcprops.JPGSubsampling = (IJL_JPGSUBSAMPLING) 0;
jcprops.DIBSubsampling = (IJL_DIBSUBSAMPLING) 0;
}
if ( ijlRead(&jcprops, mode) != IJL_OK )
{
ijlFree(&jcprops);
return 0;
}
if ( ijlFree(&jcprops) != IJL_OK ) return 0;
return (void *)pixbuff;
}
void * Jpeg::Compress(const void *source,
int width,
int height,
int bpp,
int &len,
int quality)
{
JPEG_CORE_PROPERTIES jcprops;
if ( ijlInit(&jcprops) != IJL_OK )
{
ijlFree(&jcprops);
return false;
}
jcprops.DIBWidth = width;
jcprops.DIBHeight = height;
jcprops.JPGWidth = width;
jcprops.JPGHeight = height;
jcprops.DIBBytes = (unsigned char *) source;
jcprops.DIBPadBytes = 0;
jcprops.DIBChannels = bpp;
jcprops.JPGChannels = bpp;
if ( bpp == 3 )
{
jcprops.DIBColor = IJL_RGB;
jcprops.JPGColor = IJL_YCBCR;
jcprops.JPGSubsampling = IJL_411;
jcprops.DIBSubsampling = (IJL_DIBSUBSAMPLING) 0;
}
else
{
jcprops.DIBColor = IJL_G;
jcprops.JPGColor = IJL_G;
jcprops.JPGSubsampling = (IJL_JPGSUBSAMPLING) 0;
jcprops.DIBSubsampling = (IJL_DIBSUBSAMPLING) 0;
}
int size = width*height*bpp;
unsigned char * buffer = new unsigned char[size];
jcprops.JPGSizeBytes = size;
jcprops.JPGBytes = buffer;
jcprops.jquality = quality;
if ( ijlWrite(&jcprops,IJL_JBUFF_WRITEWHOLEIMAGE) != IJL_OK )
{
ijlFree(&jcprops);
delete buffer;
return 0;
}
if ( ijlFree(&jcprops) != IJL_OK )
{
delete buffer;
return 0;
}
len = jcprops.JPGSizeBytes;
return buffer;
}
|