Здравствуйте, Vzhyk, Вы писали:
V>http://www.cplusplus.com/
Не надо это советовать, там ересь встречается.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Здравствуйте, cupuyc., Вы писали:
Зачем сжатые данные, упакованные в контейнер .jpg тупо
копировать в буфер? Используйте libjpeg для распаковки.
Не знаю как с этим в win, на *nix-ах код будет выглядеть так:
struct _error_mgr {
struct jpeg_error_mgr pub;
jmp_buf setjmp_buffer;
};
typedef struct _error_mgr * _error_ptr;
METHODDEF(void)
_error_exit (j_common_ptr cinfo)
{
_error_ptr er = (_error_ptr) cinfo->err;
(*cinfo->err->output_message) (cinfo);
longjmp(er->setjmp_buffer, 1);
}
GLOBAL(int)
read_JPEG_file (char * filename, unsigned char** extbuf)
{
struct _error_mgr jerr;
FILE * infile;
unsigned char* buf;
JSAMPARRAY buffer;
int row_len;
int width, height;
int count=0;
if ((infile = fopen(filename, "rb")) == NULL) {
fprintf(stderr, "NOT SUCH FILE %s\n", filename);
return 0;
cinfo.err = jpeg_std_error(&jerr.pub);
jerr.pub.error_exit = _error_exit;
if (setjmp(jerr.setjmp_buffer)) {
jpeg_destroy_decompress(&cinfo);
fclose(infile);
return 0;
}
jpeg_create_decompress(&cinfo);
jpeg_stdio_src(&cinfo, infile);
(void) jpeg_read_header(&cinfo, TRUE);
(void) jpeg_start_decompress(&cinfo);
height=cinfo.output_height;
width=cinfo.output_width;
row_len = width * cinfo.output_components;
if((buf=(unsigned char*)malloc(sizeof(unsigned char)*height*row_len))==NULL){ printf("FACK\n"); fclose(infile); return -1; };
buffer = (*cinfo.mem->alloc_sarray)
((j_common_ptr) &cinfo, JPOOL_IMAGE, row_len, 1);
while (cinfo.output_scanline < cinfo.output_height) {
( void) jpeg_read_scanlines(&cinfo, buffer, 1);
memcpy(&buf[count], &buffer[0], row_len);
count+=row_len;
};
(void) jpeg_finish_decompress(&cinfo);
jpeg_destroy_decompress(&cinfo);
fclose(infile);
*extbuf=buf;
return 0;
};
Но и это не всё. Для воспроизводства изображения с Xlib,
мне понадобилось к количеству компоннетов в пикселе- cinfo.output_components, добавлять
четвёртый и инициализировать его 0xff. И переворачивать весь массив так, что первый char компонент из
каждой последовательной тройки ставился на третье место, третий на первое, иначе изображение получалось
в формате BGR, а не RGB, который ожидали функции Xlib-а.
2/16/2014 12:57 AM, Ops пишет:
> V>http://www.cplusplus.com/
> Не надо это советовать, там ересь встречается.
Не, форум и писатели здесь восхитительны.
Posted via RSDN NNTP Server 2.1 beta