我想在Android NDK应用程序中使用jpeg图像。我下载了libjpeg9并成功将其编译为静态库。我使用libzip从apk加载图像,当我开始读取图像的标题时,我得到以下错误:“不是JPEG文件:以0x00 0x00开头”。当我在模拟器和真实设备中启动我的应用程序时,也会发生同样的错误。我输入终端命令来检查我的文件:“file myjpeg.jpg”并得到以下消息:“myjpeg.jpg:JPEG图像数据,JFIF标准1.01”因此文件有效。此外,如果我在MacOS应用程序中使用jpeg_stdio_src
函数从文件加载相同的图像,我会获得成功。部分代码负责在Android中加载jpeg文件:
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 :(得分:1)
看起来你并没有告诉图书馆图像数据的位置。 imageData
设置为0,然后传递给库。
jpeg_mem_src
只是告诉库“解码的jpeg数据”所在的位置。您需要传入指向此数据的指针。
看起来您正在从APK中检索此内容,请尝试将指向数据的指针传递到jpeg_mem_src
。