2013-10-06 2 views
-1

Я хочу использовать 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, но я не знаю о причинах. Заранее спасибо.

+0

Где вы устанавливаете imageData для jpeg-данных из apk? – krsteeve

+0

Я думаю, что jpeg_mem_src инициализирует imageData. Я читал об этом здесь: http://www.christian-etter.de/?tag=jpeg_mem_src. Существует описание jpeg_mem_src: «Следующая функция выполняет инициализацию буфера памяти». – ghost3D

+0

Но вы заполнили «imageData» с помощью 0 - вам нужно заполнить его данными jpeg для декодирования. – krsteeve

ответ

1

Похоже, вы не сообщаете библиотеке, где находятся данные изображения. imageData устанавливается в 0, а затем передается в библиотеку.

jpeg_mem_src просто сообщает библиотеке, где расположены ваши «декодированные данные jpeg». Вам нужно передать указатель на эти данные.

Похоже, что вы извлекаете это из APK, попробуйте передать указатель на данные в jpeg_mem_src.

Смежные вопросы