android - 如何在 ANativeWindow 上显示 JPEG?

标签 android c android-ndk libjpeg-turbo turbojpeg

我正在尝试使用 Android NDK 向 ANativeWindow 显示 JPEG。 我正在通过以下操作获取 ANativeWindow*:

_window = ANativeWindow_fromSurface(env, surface)

我正在使用 libjpeg-turbo 加载 jpeg,方法是:

if (tjDecompressHeader2(tj, jpeg, jpegSize, &width, &height, &subsamp) == 0) {
    int format = TJPF_ARGB;
    int pitch  = _windowWidth * tjPixelSize[format];

    _bufferSize = pitch * _windowHeight;
    _buffer = realloc(_buffer, _bufferSize);
    tjDecompress2(tj, jpeg, jpegSize, _buffer, _windowWidth, pitch, _windowHeight, format, 0);
}

我的问题是,如何在表面显示解码后的 jpeg?我目前正在这样做:

ANativeWindow_Buffer surface_buffer;
if (ANativeWindow_lock(_window, &surface_buffer, NULL) == 0) {
    memcpy(surface_buffer.bits, _buffer,  _bufferSize);
    ANativeWindow_unlockAndPost(_window);
}

但结果(见下文)不是我所期望的。在将缓冲区发送到表面之前我应该​​做什么?

snapshot

谢谢

最佳答案

只需使用 ANativeWindow_setBuffersGeometry(_window, 0, 0, WINDOW_FORMAT_RGBA_8888) 设置 ANativeWindow 的格式。然后使用 TJPF_RGBA 格式代替 TJPF_ARGB

关于android - 如何在 ANativeWindow 上显示 JPEG?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18224949/

相关文章:

android - 我有三个 Activity 。从主要 Activity 中我可以调用第二个 Activity ,但我不能调用第三个 Activity ?

c# - 我不了解 Xamarin 中 AutomationProperties 类的行为

android - 前台服务通知需要几秒钟才能显示

android - 防止/使修补二进制程序集变得困难

android - 如何仅针对 ARM 目标使用 NDK 构建基于 Android Gradle 的应用程序?

java - 从 java 扩展时,静态函数在 kotlin 中不可见

c - 为什么 frexp() 不产生科学记数法?

c - 为什么八进制转储输出整数变量的ascii码而不是二进制码?

c - 使用 fwrite() 将大块写入文件(例如 1000000000)

java - 通过 JNI 获取 Java ByteBuffer 的指针