-1

我想在我的 Android NDK 应用程序中使用 jpeg 图像。我下载了 libjpeg9 并成功将其编译为静态库。我使用 libzip 从 apk 加载图像,当我开始读取图像的标头时,出现以下错误:“不是 JPEG 文件:以 0x00 0x00 开头”。当我在模拟器和真实设备中启动我的应用程序时,也会发生同样的错误。我输入终端命令来检查我的文件:“file myjpeg.jpg”并得到以下消息:“myjpeg.jpg:JPEG 图像数据,JFIF 标准 1.01”所以文件是有效的。jpeg_stdio_src此外,如果我从具有MacOS 应用程序功能的文件中加载相同的图像,我会成功。部分代码负责在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但我不知道原因。提前致谢。

4

1 回答 1

1

看起来你没有告诉图书馆图像数据在哪里。imageData设置为 0,然后传递给库。

jpeg_mem_src只是告诉图书馆您的“解码的 jpeg 数据”所在的位置。您需要传入指向此数据的指针。

看起来您正在从 APK 中检索此内容,请尝试将指向数据的指针传递给jpeg_mem_src

于 2013-10-07T17:25:16.657 回答