Page007
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
[[Page006]]
* Jpeg library の導入 [#j2a6640d]
この節では、C の library を用いることを考察する。例として...
この節で必要な全 source file 及び makefile を固めたものを...
として置いておく。
// mydjpeg.h
#ifndef MYDJPEG_H_INCLUDED
#define MYDJPEG_H_INCLUDED
#include "myimage.h"
#define XMD_H
#include <stdio.h>
#ifdef __cplusplus
extern "C"{
#endif
#include "jpeglib.h"
#include "jerror.h"
#ifdef __cplusplus
}
#endif
namespace mylib
{
class CMyDjpeg : public CMyImage
{
public:
CMyDjpeg(const TCHAR* szDocName);
virtual ~CMyDjpeg();
protected:
class my_source_mgr
{
// Expanded data source object for our io input
public:
struct jpeg_source_mgr pub; // public fields
HANDLE hfile; /* source stream */
JOCTET * buffer; /* start of buffer */
bool start_of_file; /* have we gotten any data yet? */
};
typedef my_source_mgr* my_src_ptr;
private:
static void init_source(j_decompress_ptr cinfo);
static boolean fill_input_buffer(j_decompress_ptr cinfo);
static void skip_input_data(j_decompress_ptr cinfo, lon...
static void term_source (j_decompress_ptr cinfo);
static void set_srcio(j_decompress_ptr cinfo, HANDLE hf...
static const int INPUT_BUF_SIZE = 4096;
private:
bool ReadFile(const TCHAR* szFilename);
bool Prepare(int width, int height, int numcomp);
bool FillImage(int lineno, JOCTET* buffer, int nlen);
protected:
int m_width;
int m_height;
int m_numcomponents;
int m_dispcomponents;
size_t m_linelength;
BITMAPINFO m_bmi;
BYTE* m_lpFileData;
};
} // namespace mylib
#endif // MYDJPEG_H_INCLUDED
実装では、jpeg library の一部として一緒に配布されている例...
// mydjpeg.cpp
#include "mydjpeg.h"
namespace mylib
{
CMyDjpeg::CMyDjpeg(const TCHAR* lpFileName)
{
::ZeroMemory(&m_bmi,sizeof(BITMAPINFO));
m_lpvBits = 0;
m_lpbmi = &m_bmi;
m_width = 0;
m_height = 0;
m_numcomponents = 0;
m_dispcomponents = 3;
m_linelength = 0;
ReadFile(lpFileName);
return;
}
CMyDjpeg::~CMyDjpeg()
{
delete [] m_lpvBits;
}
bool
CMyDjpeg::Prepare(int width, int height, int numcomp)
{
::ZeroMemory(&m_bmi,sizeof(BITMAPINFO));
delete [] m_lpvBits;
m_lpvBits = 0;
size_t n = ((width * m_dispcomponents + sizeof(LONG) - ...
size_t nsize = n * height;
if( nsize == 0 )
return false;
m_lpvBits = new BYTE [nsize];
m_width = width;
m_height = height;
m_numcomponents = numcomp;
m_linelength = n;
m_bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
m_bmi.bmiHeader.biWidth = width;
m_bmi.bmiHeader.biHeight = height;
m_bmi.bmiHeader.biPlanes = 1;
m_bmi.bmiHeader.biBitCount = m_dispcomponents * 8;
m_bmi.bmiHeader.biCompression = BI_RGB;
m_bmi.bmiHeader.biSizeImage = (DWORD)nsize;
return true;
}
bool
CMyDjpeg::FillImage(int lineno, JOCTET* buffer, int nlen)
{
if((m_lpvBits == 0) || (buffer == 0))
return false;
if(m_numcomponents == 3)
{
int k = (int)m_linelength * lineno;
for(int i = 0; i < m_width; i++)
{
int j = i * m_dispcomponents;
m_lpvBits[k + j + 0] = (BYTE)buffer[j + 2];
m_lpvBits[k + j + 1] = (BYTE)buffer[j + 1];
m_lpvBits[k + j + 2] = (BYTE)buffer[j + 0];
}
}
else if(m_numcomponents == 1)
{
int k = (int)m_linelength * lineno;
for(int i = 0; i < m_width; i++)
{
int j = i * m_dispcomponents;
m_lpvBits[k + j + 0] = (BYTE)buffer[i];
m_lpvBits[k + j + 1] = (BYTE)buffer[i];
m_lpvBits[k + j + 2] = (BYTE)buffer[i];
}
}
else
{
for(int i = 0; i < nlen; i++)
m_lpvBits[lineno * m_linelength + i] = (BYTE)buffer[i];
}
return true;
}
/*
* Initialize source --- called by jpeg_read_header
* before any data is actually read.
*/
void
CMyDjpeg::init_source(j_decompress_ptr cinfo)
{
my_src_ptr src = (my_src_ptr) cinfo->src;
/* We reset the empty-input-file flag for each image,
* but we don't clear the input buffer.
* This is correct behavior for reading a series of ima...
*/
src->start_of_file = TRUE;
}
/*
* Fill the input buffer --- called whenever buffer is e...
*
* In typical applications, this should read fresh data ...
* (ignoring the current state of next_input_byte & byte...
* reset the pointer & count to the start of the buffer,...
* indicating that the buffer has been reloaded. It is ...
* fill the buffer entirely, only to obtain at least one...
*
* There is no such thing as an EOF return. If the end ...
* reached, the routine has a choice of ERREXIT() or ins...
* the buffer. In most cases, generating a warning mess...
* fake EOI marker is the best course of action --- this...
* decompressor to output however much of the image is t...
* the resulting error message is misleading if the real...
* input file, so we handle that case specially.
*
* In applications that need to be able to suspend compr...
* not being available yet, a FALSE return indicates tha...
* obtained right now, but more may be forthcoming later...
* the decompressor will return to its caller (with an i...
* number of scanlines it has read, if any). The applic...
* decompression after it has loaded more data into the ...
* that there are substantial restrictions on the use of...
* the documentation.
*
* When suspending, the decompressor will back up to a c...
* (typically the start of the current MCU). next_input_...
* indicate where the restart point will be if the curre...
* Data beyond this point must be rescanned after resump...
* the front of the buffer rather than discarding it.
*/
boolean
CMyDjpeg::fill_input_buffer (j_decompress_ptr cinfo)
{
my_src_ptr src = (my_src_ptr) cinfo->src;
size_t nbytes;
// nbytes = JFREAD(src->infile, src->buffer, INPUT_BUF...
if(!::ReadFile(src->hfile, src->buffer, INPUT_BUF_SIZE,...
return FALSE;
if (nbytes <= 0) {
//@ if (src->start_of_file) /* Treat empty input file a...
//@ ERREXIT(cinfo, JERR_INPUT_EMPTY);
//@ WARNMS(cinfo, JWRN_JPEG_EOF);
/* Insert a fake EOI marker */
src->buffer[0] = (JOCTET) 0xFF;
src->buffer[1] = (JOCTET) JPEG_EOI;
nbytes = 2;
}
src->pub.next_input_byte = src->buffer;
src->pub.bytes_in_buffer = nbytes;
src->start_of_file = FALSE;
return TRUE;
}
/*
* Skip data --- used to skip over a potentially large a...
* uninteresting data (such as an APPn marker).
*
* Writers of suspendable-input applications must note t...
* is not granted the right to give a suspension return....
* beyond the data currently in the buffer, the buffer c...
* that the next read will cause a fill_input_buffer cal...
* Arranging for additional bytes to be discarded before...
* buffer is the application writer's problem.
*/
void
CMyDjpeg::skip_input_data (j_decompress_ptr cinfo, long ...
{
my_src_ptr src = (my_src_ptr) cinfo->src;
/* Just a dumb implementation for now. Could use fseek...
* it doesn't work on pipes. Not clear that being smar...
* any trouble anyway --- large skips are infrequent.
*/
if (num_bytes > 0) {
while (num_bytes > (long) src->pub.bytes_in_buffer) {
num_bytes -= (long) src->pub.bytes_in_buffer;
(void) fill_input_buffer(cinfo);
/* note we assume that fill_input_buffer will never r...
* so suspension need not be handled.
*/
}
src->pub.next_input_byte += (size_t) num_bytes;
src->pub.bytes_in_buffer -= (size_t) num_bytes;
}
}
/*
* An additional method that can be provided by data sou...
* resync_to_restart method for error recovery in the pr...
* For the moment, this source module just uses the defa...
* provided by the JPEG library. That method assumes th...
* is possible.
*/
/*
* Terminate source --- called by jpeg_finish_decompress
* after all data has been read. Often a no-op.
*
* NB: *not* called by jpeg_abort or jpeg_destroy; surro...
* application must deal with any cleanup that should ha...
* for error exit.
*/
void
CMyDjpeg::term_source (j_decompress_ptr cinfo)
{
/* no work necessary here */
}
void
CMyDjpeg::set_srcio(j_decompress_ptr cinfo, HANDLE hfile)
{
my_src_ptr src;
/* The source object and input buffer are made permanen...
* of JPEG images can be read from the same file by cal...
* only before the first one. (If we discarded the buf...
* one image, we'd likely lose the start of the next on...
* This makes it unsafe to use this manager and a diffe...
* manager serially with the same JPEG object. Caveat ...
*/
if (cinfo->src == NULL) { /* first time for this JPEG o...
cinfo->src = (struct jpeg_source_mgr *)
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPO...
sizeof(my_source_mgr));
src = (my_src_ptr) cinfo->src;
src->buffer = (JOCTET *)
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPO...
INPUT_BUF_SIZE * sizeof(JOCTET));
}
src = (my_src_ptr) cinfo->src;
src->pub.init_source = init_source;
src->pub.fill_input_buffer = fill_input_buffer;
src->pub.skip_input_data = skip_input_data;
src->pub.resync_to_restart = jpeg_resync_to_restart; /*...
src->pub.term_source = term_source;
src->hfile = hfile;
src->pub.bytes_in_buffer = 0; /* forces fill_input_buff...
src->pub.next_input_byte = NULL; /* until buffer loaded...
}
bool
CMyDjpeg::ReadFile(const TCHAR* szFilename)
{
if(szFilename == 0)
return false;
struct jpeg_error_mgr jerr;
struct jpeg_decompress_struct cinfo;
HANDLE hfile; /* source file */
JSAMPARRAY buffer; /* Output row buffer */
int row_stride; /* physical row width in output buffer...
hfile = ::CreateFile(szFilename, GENERIC_READ, FILE_SHA...
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
// We set up the normal JPEG error routines, then overr...
cinfo.err = jpeg_std_error(&jerr);
// Step 1: allocate and initialize JPEG decompression o...
// Now we can initialize the JPEG decompression object.
jpeg_create_decompress(&cinfo);
// Step 2: specify data source (eg, a file)
set_srcio(&cinfo, hfile);
// Step 3: read file parameters with jpeg_read_header()
(void) jpeg_read_header(&cinfo, TRUE);
// We can ignore the return value from jpeg_read_header...
// (a) suspension is not possible with the stdio data ...
// (b) we passed TRUE to reject a tables-only JPEG fil...
// See libjpeg.doc for more info.
// Step 4: set parameters for decompression
// In this example, we don't need to change any of the ...
// jpeg_read_header(), so we do nothing here.
// Step 5: Start decompressor
(void) jpeg_start_decompress(&cinfo);
// We can ignore the return value since suspension is n...
// with the stdio data source.
// We may need to do some setup of our own at this poin...
// the data. After jpeg_start_decompress() we have the...
// output image dimensions available, as well as the ou...
// if we asked for color quantization.
// In this example, we need to make an output work buff...
// JSAMPLEs per row in output buffer
row_stride = cinfo.output_width * cinfo.output_componen...
// Make a one-row-high sample array that will go away w...
buffer = (*cinfo.mem->alloc_sarray)
((j_common_ptr) &cinfo, JPOOL_IMAGE, row_stride, 1);
Prepare(cinfo.output_width, cinfo.output_height, cinfo....
// Step 6: while (scan lines remain to be read)
// jpeg_read_scanlines(...);
// Here we use the library's state variable cinfo.outpu...
// loop counter, so that we don't have to keep track ou...
while (cinfo.output_scanline < cinfo.output_height)
{
// jpeg_read_scanlines expects an array of pointers to...
// Here the array is only one element long, but you co...
// more than one scanline at a time if that's more con...
(void) jpeg_read_scanlines(&cinfo, buffer, 1);
// Assume put_scanline_someplace wants a pointer and s...
// put_scanline_someplace(buffer[0], row_stride);
int lineno = cinfo.output_height - cinfo.output_scanli...
FillImage(lineno, buffer[0], row_stride);
}
// Step 7: Finish decompression
(void) jpeg_finish_decompress(&cinfo);
// We can ignore the return value since suspension is n...
// with the stdio data source.
// Step 8: Release JPEG decompression object
// This is an important step since it will release a go...
jpeg_destroy_decompress(&cinfo);
// After finish_decompress, we can close the input file.
// Here we postpone it until after no more JPEG errors ...
// so as to simplify the setjmp error logic above. (Ac...
// think that jpeg_destroy can do an error exit, but wh...
::CloseHandle(hfile);
return true;
}
} // namespace mylib
終了行:
[[Page006]]
* Jpeg library の導入 [#j2a6640d]
この節では、C の library を用いることを考察する。例として...
この節で必要な全 source file 及び makefile を固めたものを...
として置いておく。
// mydjpeg.h
#ifndef MYDJPEG_H_INCLUDED
#define MYDJPEG_H_INCLUDED
#include "myimage.h"
#define XMD_H
#include <stdio.h>
#ifdef __cplusplus
extern "C"{
#endif
#include "jpeglib.h"
#include "jerror.h"
#ifdef __cplusplus
}
#endif
namespace mylib
{
class CMyDjpeg : public CMyImage
{
public:
CMyDjpeg(const TCHAR* szDocName);
virtual ~CMyDjpeg();
protected:
class my_source_mgr
{
// Expanded data source object for our io input
public:
struct jpeg_source_mgr pub; // public fields
HANDLE hfile; /* source stream */
JOCTET * buffer; /* start of buffer */
bool start_of_file; /* have we gotten any data yet? */
};
typedef my_source_mgr* my_src_ptr;
private:
static void init_source(j_decompress_ptr cinfo);
static boolean fill_input_buffer(j_decompress_ptr cinfo);
static void skip_input_data(j_decompress_ptr cinfo, lon...
static void term_source (j_decompress_ptr cinfo);
static void set_srcio(j_decompress_ptr cinfo, HANDLE hf...
static const int INPUT_BUF_SIZE = 4096;
private:
bool ReadFile(const TCHAR* szFilename);
bool Prepare(int width, int height, int numcomp);
bool FillImage(int lineno, JOCTET* buffer, int nlen);
protected:
int m_width;
int m_height;
int m_numcomponents;
int m_dispcomponents;
size_t m_linelength;
BITMAPINFO m_bmi;
BYTE* m_lpFileData;
};
} // namespace mylib
#endif // MYDJPEG_H_INCLUDED
実装では、jpeg library の一部として一緒に配布されている例...
// mydjpeg.cpp
#include "mydjpeg.h"
namespace mylib
{
CMyDjpeg::CMyDjpeg(const TCHAR* lpFileName)
{
::ZeroMemory(&m_bmi,sizeof(BITMAPINFO));
m_lpvBits = 0;
m_lpbmi = &m_bmi;
m_width = 0;
m_height = 0;
m_numcomponents = 0;
m_dispcomponents = 3;
m_linelength = 0;
ReadFile(lpFileName);
return;
}
CMyDjpeg::~CMyDjpeg()
{
delete [] m_lpvBits;
}
bool
CMyDjpeg::Prepare(int width, int height, int numcomp)
{
::ZeroMemory(&m_bmi,sizeof(BITMAPINFO));
delete [] m_lpvBits;
m_lpvBits = 0;
size_t n = ((width * m_dispcomponents + sizeof(LONG) - ...
size_t nsize = n * height;
if( nsize == 0 )
return false;
m_lpvBits = new BYTE [nsize];
m_width = width;
m_height = height;
m_numcomponents = numcomp;
m_linelength = n;
m_bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
m_bmi.bmiHeader.biWidth = width;
m_bmi.bmiHeader.biHeight = height;
m_bmi.bmiHeader.biPlanes = 1;
m_bmi.bmiHeader.biBitCount = m_dispcomponents * 8;
m_bmi.bmiHeader.biCompression = BI_RGB;
m_bmi.bmiHeader.biSizeImage = (DWORD)nsize;
return true;
}
bool
CMyDjpeg::FillImage(int lineno, JOCTET* buffer, int nlen)
{
if((m_lpvBits == 0) || (buffer == 0))
return false;
if(m_numcomponents == 3)
{
int k = (int)m_linelength * lineno;
for(int i = 0; i < m_width; i++)
{
int j = i * m_dispcomponents;
m_lpvBits[k + j + 0] = (BYTE)buffer[j + 2];
m_lpvBits[k + j + 1] = (BYTE)buffer[j + 1];
m_lpvBits[k + j + 2] = (BYTE)buffer[j + 0];
}
}
else if(m_numcomponents == 1)
{
int k = (int)m_linelength * lineno;
for(int i = 0; i < m_width; i++)
{
int j = i * m_dispcomponents;
m_lpvBits[k + j + 0] = (BYTE)buffer[i];
m_lpvBits[k + j + 1] = (BYTE)buffer[i];
m_lpvBits[k + j + 2] = (BYTE)buffer[i];
}
}
else
{
for(int i = 0; i < nlen; i++)
m_lpvBits[lineno * m_linelength + i] = (BYTE)buffer[i];
}
return true;
}
/*
* Initialize source --- called by jpeg_read_header
* before any data is actually read.
*/
void
CMyDjpeg::init_source(j_decompress_ptr cinfo)
{
my_src_ptr src = (my_src_ptr) cinfo->src;
/* We reset the empty-input-file flag for each image,
* but we don't clear the input buffer.
* This is correct behavior for reading a series of ima...
*/
src->start_of_file = TRUE;
}
/*
* Fill the input buffer --- called whenever buffer is e...
*
* In typical applications, this should read fresh data ...
* (ignoring the current state of next_input_byte & byte...
* reset the pointer & count to the start of the buffer,...
* indicating that the buffer has been reloaded. It is ...
* fill the buffer entirely, only to obtain at least one...
*
* There is no such thing as an EOF return. If the end ...
* reached, the routine has a choice of ERREXIT() or ins...
* the buffer. In most cases, generating a warning mess...
* fake EOI marker is the best course of action --- this...
* decompressor to output however much of the image is t...
* the resulting error message is misleading if the real...
* input file, so we handle that case specially.
*
* In applications that need to be able to suspend compr...
* not being available yet, a FALSE return indicates tha...
* obtained right now, but more may be forthcoming later...
* the decompressor will return to its caller (with an i...
* number of scanlines it has read, if any). The applic...
* decompression after it has loaded more data into the ...
* that there are substantial restrictions on the use of...
* the documentation.
*
* When suspending, the decompressor will back up to a c...
* (typically the start of the current MCU). next_input_...
* indicate where the restart point will be if the curre...
* Data beyond this point must be rescanned after resump...
* the front of the buffer rather than discarding it.
*/
boolean
CMyDjpeg::fill_input_buffer (j_decompress_ptr cinfo)
{
my_src_ptr src = (my_src_ptr) cinfo->src;
size_t nbytes;
// nbytes = JFREAD(src->infile, src->buffer, INPUT_BUF...
if(!::ReadFile(src->hfile, src->buffer, INPUT_BUF_SIZE,...
return FALSE;
if (nbytes <= 0) {
//@ if (src->start_of_file) /* Treat empty input file a...
//@ ERREXIT(cinfo, JERR_INPUT_EMPTY);
//@ WARNMS(cinfo, JWRN_JPEG_EOF);
/* Insert a fake EOI marker */
src->buffer[0] = (JOCTET) 0xFF;
src->buffer[1] = (JOCTET) JPEG_EOI;
nbytes = 2;
}
src->pub.next_input_byte = src->buffer;
src->pub.bytes_in_buffer = nbytes;
src->start_of_file = FALSE;
return TRUE;
}
/*
* Skip data --- used to skip over a potentially large a...
* uninteresting data (such as an APPn marker).
*
* Writers of suspendable-input applications must note t...
* is not granted the right to give a suspension return....
* beyond the data currently in the buffer, the buffer c...
* that the next read will cause a fill_input_buffer cal...
* Arranging for additional bytes to be discarded before...
* buffer is the application writer's problem.
*/
void
CMyDjpeg::skip_input_data (j_decompress_ptr cinfo, long ...
{
my_src_ptr src = (my_src_ptr) cinfo->src;
/* Just a dumb implementation for now. Could use fseek...
* it doesn't work on pipes. Not clear that being smar...
* any trouble anyway --- large skips are infrequent.
*/
if (num_bytes > 0) {
while (num_bytes > (long) src->pub.bytes_in_buffer) {
num_bytes -= (long) src->pub.bytes_in_buffer;
(void) fill_input_buffer(cinfo);
/* note we assume that fill_input_buffer will never r...
* so suspension need not be handled.
*/
}
src->pub.next_input_byte += (size_t) num_bytes;
src->pub.bytes_in_buffer -= (size_t) num_bytes;
}
}
/*
* An additional method that can be provided by data sou...
* resync_to_restart method for error recovery in the pr...
* For the moment, this source module just uses the defa...
* provided by the JPEG library. That method assumes th...
* is possible.
*/
/*
* Terminate source --- called by jpeg_finish_decompress
* after all data has been read. Often a no-op.
*
* NB: *not* called by jpeg_abort or jpeg_destroy; surro...
* application must deal with any cleanup that should ha...
* for error exit.
*/
void
CMyDjpeg::term_source (j_decompress_ptr cinfo)
{
/* no work necessary here */
}
void
CMyDjpeg::set_srcio(j_decompress_ptr cinfo, HANDLE hfile)
{
my_src_ptr src;
/* The source object and input buffer are made permanen...
* of JPEG images can be read from the same file by cal...
* only before the first one. (If we discarded the buf...
* one image, we'd likely lose the start of the next on...
* This makes it unsafe to use this manager and a diffe...
* manager serially with the same JPEG object. Caveat ...
*/
if (cinfo->src == NULL) { /* first time for this JPEG o...
cinfo->src = (struct jpeg_source_mgr *)
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPO...
sizeof(my_source_mgr));
src = (my_src_ptr) cinfo->src;
src->buffer = (JOCTET *)
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPO...
INPUT_BUF_SIZE * sizeof(JOCTET));
}
src = (my_src_ptr) cinfo->src;
src->pub.init_source = init_source;
src->pub.fill_input_buffer = fill_input_buffer;
src->pub.skip_input_data = skip_input_data;
src->pub.resync_to_restart = jpeg_resync_to_restart; /*...
src->pub.term_source = term_source;
src->hfile = hfile;
src->pub.bytes_in_buffer = 0; /* forces fill_input_buff...
src->pub.next_input_byte = NULL; /* until buffer loaded...
}
bool
CMyDjpeg::ReadFile(const TCHAR* szFilename)
{
if(szFilename == 0)
return false;
struct jpeg_error_mgr jerr;
struct jpeg_decompress_struct cinfo;
HANDLE hfile; /* source file */
JSAMPARRAY buffer; /* Output row buffer */
int row_stride; /* physical row width in output buffer...
hfile = ::CreateFile(szFilename, GENERIC_READ, FILE_SHA...
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
// We set up the normal JPEG error routines, then overr...
cinfo.err = jpeg_std_error(&jerr);
// Step 1: allocate and initialize JPEG decompression o...
// Now we can initialize the JPEG decompression object.
jpeg_create_decompress(&cinfo);
// Step 2: specify data source (eg, a file)
set_srcio(&cinfo, hfile);
// Step 3: read file parameters with jpeg_read_header()
(void) jpeg_read_header(&cinfo, TRUE);
// We can ignore the return value from jpeg_read_header...
// (a) suspension is not possible with the stdio data ...
// (b) we passed TRUE to reject a tables-only JPEG fil...
// See libjpeg.doc for more info.
// Step 4: set parameters for decompression
// In this example, we don't need to change any of the ...
// jpeg_read_header(), so we do nothing here.
// Step 5: Start decompressor
(void) jpeg_start_decompress(&cinfo);
// We can ignore the return value since suspension is n...
// with the stdio data source.
// We may need to do some setup of our own at this poin...
// the data. After jpeg_start_decompress() we have the...
// output image dimensions available, as well as the ou...
// if we asked for color quantization.
// In this example, we need to make an output work buff...
// JSAMPLEs per row in output buffer
row_stride = cinfo.output_width * cinfo.output_componen...
// Make a one-row-high sample array that will go away w...
buffer = (*cinfo.mem->alloc_sarray)
((j_common_ptr) &cinfo, JPOOL_IMAGE, row_stride, 1);
Prepare(cinfo.output_width, cinfo.output_height, cinfo....
// Step 6: while (scan lines remain to be read)
// jpeg_read_scanlines(...);
// Here we use the library's state variable cinfo.outpu...
// loop counter, so that we don't have to keep track ou...
while (cinfo.output_scanline < cinfo.output_height)
{
// jpeg_read_scanlines expects an array of pointers to...
// Here the array is only one element long, but you co...
// more than one scanline at a time if that's more con...
(void) jpeg_read_scanlines(&cinfo, buffer, 1);
// Assume put_scanline_someplace wants a pointer and s...
// put_scanline_someplace(buffer[0], row_stride);
int lineno = cinfo.output_height - cinfo.output_scanli...
FillImage(lineno, buffer[0], row_stride);
}
// Step 7: Finish decompression
(void) jpeg_finish_decompress(&cinfo);
// We can ignore the return value since suspension is n...
// with the stdio data source.
// Step 8: Release JPEG decompression object
// This is an important step since it will release a go...
jpeg_destroy_decompress(&cinfo);
// After finish_decompress, we can close the input file.
// Here we postpone it until after no more JPEG errors ...
// so as to simplify the setjmp error logic above. (Ac...
// think that jpeg_destroy can do an error exit, but wh...
::CloseHandle(hfile);
return true;
}
} // namespace mylib
ページ名: