Я хочу использовать jpeg-изображения в приложении Android NDK. Я загрузил libjpeg9 и успешно скомпилировал его как статическую библиотеку. Я загружаю изображение из apk с помощью libzip, и когда я начинаю читать заголовок изображения, я получаю следующую ошибку: «Не файл JPEG: начинается с 0x00 0x00». Такая же ошибка возникает при запуске приложения в эмуляторе и в реальном устройстве. Я набираю команду Terminal для проверки своего файла: «file myjpeg.jpg» и получаю следующее сообщение: «myjpeg.jpg: данные изображения JPEG, стандарт JFIF 1.01», поэтому файл действителен. Более того, если я загружаю одно и то же изображение из файла с помощью функции jpeg_stdio_src
в приложение MacOS, я получаю успех. Часть кода отвечает за загрузку jpeg-файлов в Android:Android NDK. Не изображение JPEG: начинается с 0x00 0x00
zip * apk = zip_open(apk_path.c_str(), 0, NULL);
if (!apk)
return false;
zip_file * fp = zip_fopen(apk, path.c_str(), 0);
if (!fp)
{
zip_close(apk);
return false;
}
JSAMPARRAY buffer;
int stride;
jpeg_error_handler jerr;
jpeg_decompress_struct cinfo;
cinfo.err = jpeg_std_error(&jerr.pub);
jerr.pub.error_exit = jpeg_error_exit;
jerr.pub.output_message = jpeg_error_msg;
unsigned char * imageData = NULL;
if (setjmp(jerr.setjmp_buffer))
{
jpeg_destroy_decompress(&cinfo);
zip_fclose(fp);
zip_close(apk);
if (imageData) free(imageData);
return false;
}
struct zip_stat st;
zip_stat_init(&st);
zip_stat(apk, path.c_str(), 0, &st);
if (st.size <= 0)
{
zip_fclose(fp);
zip_close(apk);
return false;
}
imageData = (unsigned char*)malloc(sizeof(unsigned char) * st.size);
memset(imageData, 0x0, sizeof(unsigned char) * st.size);
jpeg_create_decompress(&cinfo);
jpeg_mem_src(&cinfo, imageData, st.size);
jpeg_read_header(&cinfo, TRUE);
jpeg_start_decompress(&cinfo);
stride = cinfo.output_width * cinfo.output_components;
buffer = (*cinfo.mem->alloc_sarray)((j_common_ptr) &cinfo, JPOOL_IMAGE, stride, 1);
jpg->width = cinfo.image_width;
jpg->height = cinfo.image_height;
jpg->colorMode = cinfo.output_components;
log("Loaded: " + path + " width: " + StringUtils::intToStr(jpg->width) + " height: " +
StringUtils::intToStr(jpg->height) + " color mode: " +
StringUtils::intToStr(jpg->colorMode));
// read jpeg image...
Как я могу прочитать правильные данные из файла? Я полагаю, что файл не загружен в буфер jpeg_mem_src
, но я не знаю о причинах. Заранее спасибо.
Где вы устанавливаете imageData для jpeg-данных из apk? – krsteeve
Я думаю, что jpeg_mem_src инициализирует imageData. Я читал об этом здесь: http://www.christian-etter.de/?tag=jpeg_mem_src. Существует описание jpeg_mem_src: «Следующая функция выполняет инициализацию буфера памяти». – ghost3D
Но вы заполнили «imageData» с помощью 0 - вам нужно заполнить его данными jpeg для декодирования. – krsteeve