库地址

https://github.com/julienr/libpng-android

设置NDK环境变量

将NDK目录加入PATH变量:
C:\Users\xx\AppData\Local\Android\Sdk\ndk\20.0.5594570\

静态库

修改Android.mk文件

#LOCAL_SHARED_LIBRARIES := -lzLOCAL_EXPORT_LDLIBS := -lzLOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/.#include $(BUILD_SHARED_LIBRARY)include $(BUILD_STATIC_LIBRARY)

动态库

修改Android.mk文件

#LOCAL_SHARED_LIBRARIES := -lz#LOCAL_EXPORT_LDLIBS := -lzLOCAL_LDLIBS := -lz LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/.include $(BUILD_SHARED_LIBRARY)#include $(BUILD_STATIC_LIBRARY)

编译命令

ndk-build NDK_PROJECT_PATH=./

libpng库使用

从内存中读取png图片数据,解码为RGBA格式的raw数据
glPngReader.h

//// Created by Jinzhu on 2019/9/7.//#ifndef OPENGLES_GLPNGREADER_H#define OPENGLES_GLPNGREADER_H#ifdef __cplusplusextern "C" {#endif#include #include #include #include struct glPngReader {    uint8_t *m_raw_data;    size_t m_raw_size;    size_t m_raw_offset;    int m_width;    int m_height;    int m_color_type;    int m_pixel_depth;    int m_status;    uint8_t *m_pixel_data;};void glPngReader_Create(struct glPngReader *pngReader, uint8_t *raw_data, size_t raw_size);void glPngReader_Destory(struct glPngReader *pngReader);uint8_t *glPngReader_GetPixelData(struct glPngReader *pngReader);int glPngReader_GetWidth(struct glPngReader *pngReader);int glPngReader_GetHeight(struct glPngReader *pngReader);#ifdef __cplusplus};#endif#endif //OPENGLES_GLPNGREADER_H

glPngReader.c

//// Created by Jinzhu on 2019/9/7.//#include #ifdef __cplusplusextern "C" {#endif#include "glPngReader.h"#include #include #include #include #include #define LOG_TAG "PNGREADER-LIB"#define ALOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)void glPngReader_ReadCallback(png_structp png_ptr, png_bytep data, png_size_t length) {    struct glPngReader *pThis = (struct glPngReader *) png_get_io_ptr(png_ptr);    if (pThis != NULL) {        if (pThis->m_raw_offset + length <= pThis->m_raw_size) {            memcpy(data, pThis->m_raw_data + pThis->m_raw_offset, length);            pThis->m_raw_offset += length;        } else {            ALOGE("the length is illegal.");        }    }}void glPngReader_ReadImage(struct glPngReader *pngReader) {    png_structp png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);    if (png_ptr == NULL) {        ALOGE("load libpng error,png_ptr = NULL.");        pngReader->m_status = 0;        return;    }    png_infop info_ptr = png_create_info_struct(png_ptr);    if (info_ptr == NULL) {        png_destroy_read_struct(&png_ptr, NULL, NULL);        ALOGE("load libpng error,info_ptr = NULL.");        pngReader->m_status = 0;        return;    }    if (setjmp(png_jmpbuf(png_ptr))) {        png_destroy_read_struct(&png_ptr, &info_ptr, NULL);        ALOGE("libpng process error.");        pngReader->m_status = 0;        return;    }    png_set_read_fn(png_ptr, pngReader, glPngReader_ReadCallback);    png_read_png(png_ptr, info_ptr, PNG_TRANSFORM_EXPAND, NULL);    pngReader->m_width = info_ptr->width;    pngReader->m_height = info_ptr->height;    pngReader->m_color_type = info_ptr->color_type;    pngReader->m_pixel_depth = info_ptr->pixel_depth;    if ((pngReader->m_color_type != PNG_COLOR_TYPE_RGB &&         pngReader->m_color_type != PNG_COLOR_TYPE_RGB_ALPHA)        && pngReader->m_pixel_depth == 8) {        ALOGE("image format error.");        pngReader->m_status = 0;        png_destroy_read_struct(&png_ptr, &info_ptr, NULL);        return;    }    if (pngReader->m_pixel_data != NULL) {        free(pngReader->m_pixel_data);        pngReader->m_pixel_data = NULL;    }    pngReader->m_pixel_data = (uint8_t *) malloc(pngReader->m_width * pngReader->m_height * 4);    png_bytep *row_pointers = png_get_rows(png_ptr, info_ptr);    if (pngReader->m_color_type == PNG_COLOR_TYPE_RGB) {        int pos = 0;        for (int row = 0; row < pngReader->m_height; ++row) {            for (int col = 0; col < (3 * pngReader->m_width); col += 3) {                pngReader->m_pixel_data[pos++] = row_pointers[row][col + 0];//RED                pngReader->m_pixel_data[pos++] = row_pointers[row][col + 1];//GREEN                pngReader->m_pixel_data[pos++] = row_pointers[row][col + 2];//BLUE                pngReader->m_pixel_data[pos++] = 255;//ALPHA            }        }        pngReader->m_status = 1;    } else if (pngReader->m_color_type == PNG_COLOR_TYPE_RGB_ALPHA) {        int pos = 0;        for (int row = 0; row < pngReader->m_height; ++row) {            for (int col = 0; col < (4 * pngReader->m_width); col += 4) {                pngReader->m_pixel_data[pos++] = row_pointers[row][col + 0];//RED                pngReader->m_pixel_data[pos++] = row_pointers[row][col + 1];//GREEN                pngReader->m_pixel_data[pos++] = row_pointers[row][col + 2];//BLUE                pngReader->m_pixel_data[pos++] = row_pointers[row][col + 3];//ALPHA            }        }        pngReader->m_status = 1;    } else {        pngReader->m_status = 0;    }    png_destroy_read_struct(&png_ptr, &info_ptr, NULL);}void glPngReader_Create(struct glPngReader *pngReader, uint8_t *raw_data, size_t raw_size) {    pngReader->m_raw_data = raw_data;    pngReader->m_raw_size = raw_size;    pngReader->m_raw_offset = 0;    pngReader->m_width = 0;    pngReader->m_height = 0;    pngReader->m_color_type = PNG_TRANSFORM_STRIP_ALPHA;    pngReader->m_pixel_depth = 8;    pngReader->m_status = 0;    pngReader->m_pixel_data = NULL;    glPngReader_ReadImage(pngReader);}void glPngReader_Destory(struct glPngReader *pngReader) {    if (pngReader->m_pixel_data != NULL) {        free(pngReader->m_pixel_data);        pngReader->m_pixel_data = NULL;    }}uint8_t *glPngReader_GetPixelData(struct glPngReader *pngReader) { return pngReader->m_pixel_data; }int glPngReader_GetWidth(struct glPngReader *pngReader) { return pngReader->m_width; }int glPngReader_GetHeight(struct glPngReader *pngReader) { return pngReader->m_height; }#ifdef __cplusplus};#endif

更多相关文章

  1. mybatisplus的坑 insert标签insert into select无参数问题的解决
  2. python起点网月票榜字体反爬案例
  3. NPM 和webpack 的基础使用
  4. 【阿里云镜像】使用阿里巴巴DNS镜像源——DNS配置教程
  5. android light
  6. Android设置Button各种状态下背景改变
  7. Android(安卓)自定义的checkbox
  8. Android(安卓)命令行手动编译打包详解
  9. 按钮的多样话 selector的使用

随机推荐

  1. Android中使用log4j
  2. Android中GridView组件的使用
  3. Android(安卓)事件触发机制
  4. Android热插拔事件处理流程--Vold
  5. 关于Android方法数量限制的问题
  6. Android(安卓)HLS协议相关记录及部分解析
  7. android apk 签名信息 相关
  8. android之动画(一)通过AnimationDrawable控
  9. Android(安卓)uevent
  10. Android(安卓)常用RGB值以及中英文名称