Re[4]: Считать картинку в массив char*
От: Ops Россия  
Дата: 15.02.14 21:57
Оценка: :)
Здравствуйте, Vzhyk, Вы писали:

V>http://www.cplusplus.com/

Не надо это советовать, там ересь встречается.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re: Считать картинку в массив char*
От: smeeld  
Дата: 16.02.14 07:27
Оценка:
Здравствуйте, 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-а.
Re[5]: Считать картинку в массив char*
От: Vzhyk  
Дата: 16.02.14 10:00
Оценка:
2/16/2014 12:57 AM, Ops пишет:

> V>http://www.cplusplus.com/

> Не надо это советовать, там ересь встречается.
Не, форум и писатели здесь восхитительны.
Posted via RSDN NNTP Server 2.1 beta
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.