С++, jpeglib: Помогите плиз :)
а что, собственно, именно не работает?
byte R = pBuffer[0][0]
byte G = pBuffer[0][1]
byte B = pBuffer[0][2]
не прокатывает (эксперимент провожу на картинке полностью одного цвета)
как я понимаю двойной массив в результате дает пиксель, вохможно все RGB в один байт запиханы?
http://www.pocketpcdn.com/articles/jpeglib.html
т.е. JSAMPIMAGE нужен тогда первый(или последний) индекс как раз цвет
Нашел в инете некий jpeglib.h typedef JSAMPLE FAR *JSAMPROW; /* ptr to one image row of pixel samples. */
typedef JSAMPROW *JSAMPARRAY; /* ptr to some rows (a 2-D sample array) */
typedef JSAMPARRAY *JSAMPIMAGE; /* a 3-D sample array: top index is color */
т.е. JSAMPIMAGE нужен тогда первый(или последний) индекс как раз цвет
/* Replaces jpeg_read_scanlines when reading raw downsampled data. */
EXTERN(JDIMENSION) jpeg_read_raw_data JPPj_decompress_ptr cinfo,
JSAMPIMAGE data,
JDIMENSION max_lines;
В один байт запихать RGB невероятно - это всего 256 цветов получается. Просто может я не так что понял и там структура похитрее возвращается
Просто может я не так что понял и там структура похитрее возвращаетсявторой пост написана функция которую можно использовать для получения RAW данных
P.S. Статью видел.
RAW данные это не RGB мне кажется.ну если raw имеется в виду раскодированные то имхо как раз rgb.
я бы попробовал
...
jpeg_start_decompress(&jpegInfo);
int Width = jpegInfo.output_width;
int Height = jpegInfo.output_height;
BYTE* RGBData = (BYTE*) new BYTE[Width * 3 * Height];
JSAMPARRAY Buffer = (*jpegInfo.mem->alloc_sarrayj_common_ptr) &jpegInfo, JPOOL_IMAGE, Width * jpegInfo.output_components, 1);
while (jpegInfo.output_scanline < Height && jpegInfo.output_components == 3)
{
(void) jpeg_read_scanlines(&jpegInfo, Buffer, 1);
int offset = (jpegInfo.output_scanline - 1) * Width * 3;
for (int Count = 0; Count < Width; Count++)
{
*(RGBData + offset + Count * 3 + 0) = *(Buffer[0] + Count * 3 + 0);
*(RGBData + offset + Count * 3 + 1) = *(Buffer[0] + Count * 3 + 1);
*(RGBData + offset + Count * 3 + 2) = *(Buffer[0] + Count * 3 + 2);
}
}
Беда в том, что получается BGR набор (излечимо просто) и перевернутая картинка (то ж излечимо, тока не совсем понятно как просто сделать).
Код своровал отсюда - http://www.gamedev.ru/code/forum/?id=51252
...
jpeg_start_decompress(&jpegInfo);
int Width = jpegInfo.output_width;
int Height = jpegInfo.output_height;
BYTE* RGBData = (BYTE*) new BYTE[Width * 3 * Height];
JSAMPARRAY Buffer = (*jpegInfo.mem->alloc_sarrayj_common_ptr) &jpegInfo, JPOOL_IMAGE, Width * jpegInfo.output_components, 1);
while (jpegInfo.output_scanline < Height && jpegInfo.output_components == 3)
{
(void) jpeg_read_scanlines(&jpegInfo, Buffer, 1);
int offset = (Height - jpegInfo.output_scanline - 1) * Width * 3;
for (int Count = 0; Count < Width; Count++)
{
*(RGBData + offset + Count * 3 + 2) = *(Buffer[0] + Count * 3 + 0);
*(RGBData + offset + Count * 3 + 1) = *(Buffer[0] + Count * 3 + 1);
*(RGBData + offset + Count * 3 + 0) = *(Buffer[0] + Count * 3 + 2);
}
}
Ну и еще если у тебя width не кратно 4, то могут быть проблемы, потому что общепринято, что размер строчки изображения доводится до кратного 4м пустыми байтами.
Выравнивание уже есть, в модуле отвечающим выводом на экран.
BGR и ориентация только к bmp-формату вроде как относится.Ну модули вывода на экран обычно такой формат и требуют, так что переводить и переворачивать имхо лишнее. Про выравнивание не знаю, в обычной винде приходилось самостоятельно об этом думать.
Выравнивание уже есть, в модуле отвечающим выводом на экран.
у жпега в хедерах нет флагов поворота?
2
Может и есть Я проблему у себя решил, просто числа переставив.
Кстати, а никто не знает как отлавливать ошибки, возникающие при вызове jpeg-функций? Че та там какой то менеджер ошибок...
а ты не мог тупо поискать код который эту либу использует, раз уж документации нет?
Эту либу ругают за то, что она сложная для новичков (к коим я себя отношу).
Код поискал. Ни в одном обработок ошибок не нашел. а что есть - только инициализация менеджера ошибок.
Кстати говоря, скорость загрузки jpeg на порядок выше чем стандартной функцией SHLoadImageFile
...
struct my_error_mgr
{
struct jpeg_error_mgr pub;
jmp_buf jb;
};
METHODDEF(void) je_error_exit(j_common_ptr cinfo) {
my_error_mgr *mgr=(my_error_mgr*)cinfo->err;
(*cinfo->err->output_message) (cinfo);
jpeg_destroy(cinfo);
longjmp(mgr->jb,1);
}
...
struct my_error_mgr jpegErr;
struct jpeg_decompress_struct jpegInfo;
jpegInfo.err = jpeg_std_error(&jpegErr.pub);
jpegErr.pub.error_exit = je_error_exit;
if (setjmp(jpegErr.jb
{
return NULL;
}
jpeg_create_decompress(&jpegInfo);
Если кто то пояснит, как это работает - буду благодарен.
Оставить комментарий
0000
Уже три часа туплюПредыстория.
Хочется грузить jpeg в своей программе для КПК. Т.е. нужна процедурка, получающая на вход имя файла, а на выходе HBITMAP.
Стандартный загрузчик справляется удивительно медленно, потому решил воспользоваться сторонней библиотекой - jpeglib. Поправленные исходники для WinCE нашлись (изменений то 5коп тока вот проблемы с прикручиванием.
JSAMPARRAY определен как