【问题标题】:Android NDK. Not a JPEG image: starts with 0x00 0x00安卓 NDK。不是 JPEG 图像:以 0x00 0x00 开头
【发布时间】:2013-10-06 19:06:14
【问题描述】:

我想在我的 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 没有将文件加载到缓冲区中,但我不知道原因。提前致谢。

【问题讨论】:

  • 你在哪里将imageData设置为apk中的jpeg数据?
  • 我认为 jpeg_mem_src 会初始化 imageData。我在这里读过它:christian-etter.de/?tag=jpeg_mem_src。 jpeg_mem_src 有描述:“下面的函数执行内存缓冲区的初始化。”
  • 但是你用 0 填充了imageData - 你需要用要解码的 jpeg 数据填充它。
  • 在这种情况下,您能告诉我如何读取这些数据以及 jpeg_mem_src 做什么吗?
  • jpeg_mem_src 只是告诉库您的“解码的 jpeg 数据”所在的位置。您需要传入指向此数据的指针。您正在从 APK 中检索它。

标签: android android-ndk libjpeg


【解决方案1】:

您似乎没有告诉库图像数据在哪里。 imageData 设置为 0,然后传递给库。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多