Android jpeglib 和 pnglib

Android jpeglib 和 pnglib,第1张

概述Androidstudio编译jpeglib和pnglig的so的简单记录编译多个SO:用ADD_SUBDIRECTORY添加多个目录,生产多个SO  mylibrary/CMakeLists.txt  png和jpeg目录下有源码和CMakeLists.txt生产SO, cmake_minimum_required(VERSION3.4.1)#设置生成的so动态库最后

AndroIDstudio 编译jpeglib 和 pnglig的 so的简单记录

编译多个SO: 用ADD_subdirectory 添加多个目录, 生产多个SO

 

 

mylibrary/CMakeLists.txt    png 和 jpeg 目录下有源码和CMakeLists.txt 生产SO, 

cmake_minimum_required(VERSION 3.4.1)#设置生成的so动态库最后输出的路径set(CMAKE_liBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/libs/${ANDROID_ABI})#添加子目录,将自动找到子目录中的CMakeLists.txtADD_subdirectory(${PROJECT_SOURCE_DIR}/src/main/cpp/png)ADD_subdirectory(${PROJECT_SOURCE_DIR}/src/main/cpp/jpeg)

 

 

测试libjpeg 和libpng:

可以从编译出来的aar中解压得到so

NativeFunc.java
public class NativeFunc {    static { System.loadlibrary("native-lib"); }    //测试libjpeg, 保存bitmap到/sdcard/image_test_save.jpeg    public static native voID saveJpeg(Bitmap bitmap);    //测试libpng, 保存bitmap到/sdcard/image_test_save.png    public static native voID savePng(Bitmap bitmap);}

//native-lib.cpp 

#include <jni.h>#include <string>#include <androID/bitmap.h>#include <androID/log.h>extern "C" {#include "jpeg/jpeglib.h"}#include "png/png.h"#define  LOG_TAG    "native_lib"#define  LOGI(...)  __androID_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)#define  LOGE(...)  __androID_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)static voID init_buffer(struct jpeg_compress_struct * c) {}static boolean empty_buffer(struct jpeg_compress_struct * compress_struct) {    return TRUE;}static voID term_buffer(struct jpeg_compress_struct * c) {}GLOBAL(voID)write_JPEG_Buff(uint8_t *buffPtr, int image_wIDth, int image_height,                JsAMPLE *imageBuffer, int resolution,  int *numCompBytes) {    struct jpeg_error_mgr jerr;    struct jpeg_compress_struct cinfo = {            .clIEnt_data = NulL, .err = jpeg_std_error(&jerr)    };    jpeg_create_compress(&cinfo);    struct jpeg_destination_mgr dm = {            .init_destination = init_buffer, .empty_output_buffer = empty_buffer,            .term_destination = term_buffer, .next_output_byte = buffPtr,            .free_in_buffer = (size_t) image_wIDth * image_height * 3    };    cinfo.dest = &dm;    cinfo.image_wIDth = (jdiMENSION) image_wIDth;    cinfo.image_height = (jdiMENSION) image_height;    cinfo.in_color_space = JCS_EXT_RGBA;    cinfo.jpeg_color_space = JCS_EXT_RGBA;    cinfo.input_components = 4;    jpeg_set_defaults(&cinfo);    jpeg_set_quality(&cinfo, 95, TRUE); // TRUE = limit to baseline-JPEG values    cinfo.MCUs_per_row = (jdiMENSION) image_wIDth;    cinfo.MCU_rows_in_scan = (jdiMENSION) image_height;    jpeg_start_compress(&cinfo, TRUE);    int row_strIDe; // physical row wIDth in image buffer    row_strIDe = image_wIDth * cinfo.input_components; // JsAMPLEs per row in imageBuffer    JsAMPROW row_pointer[1]; // pointer to JsAMPLE row[s]    while (cinfo.next_scanline < cinfo.image_height) {        row_pointer[0] = &imageBuffer[cinfo.next_scanline * row_strIDe];        (voID) jpeg_write_scanlines(&cinfo, row_pointer, 1);    }    jpeg_finish_compress(&cinfo);    jpeg_destroy_compress(&cinfo);    *numCompBytes = (int) (cinfo.dest->next_output_byte - buffPtr);}//测试libjpeg, 保存bitmap到/sdcard/image_test_save.jpegextern "C" JNIEXPORT voID JNICALLJava_com_lightin_imagedemo_NativeFunc_saveJpeg(        jnienv *env,        jclass type, /* this */        jobject bitmap) {    AndroIDBitmAPInfo  info;    int ret;    int wIDth = 0;    int height = 0;    voID*              pixels;    if ((ret = AndroIDBitmap_getInfo(env, bitmap, &info)) < 0) {        LOGE("AndroIDBitmap_getInfo() Failed ! error=%d", ret);        return;    }    wIDth = info.wIDth;    height = info.height;    if (info.format != ANDROID_BITMAP_FORMAT_RGBA_8888) {        LOGE("Bitmap format is not RGBA_8888 !");        return;    }    if ((ret = AndroIDBitmap_lockPixels(env, bitmap, &pixels)) < 0) {        LOGE("AndroIDBitmap_lockPixels() Failed ! error=%d", ret);    }    char filename[100];    sprintf(filename,"/sdcard/image_test_save.jpeg");    file *file;    file = fopen(filename, "wb");    int *ybuf = (int *)malloc(sizeof(int) * (wIDth*height));    int outSize;    write_JPEG_Buff((uint8_t*)ybuf,wIDth,height,(JsAMPLE *)pixels,0, &outSize);    fwrite((unsigned char *)ybuf, outSize, 1, file);    fclose(file);    if(ybuf) free(ybuf);    AndroIDBitmap_unlockPixels(env, bitmap);}int writePng(char* png_file_name, unsigned char*  pixels , int wIDth, int height, int bit_depth){    png_structp png_ptr;    png_infop info_ptr;    file *png_file = fopen(png_file_name, "wb");    if (!png_file)    {        return -1;    }    png_ptr = png_create_write_struct(PNG_liBPNG_VER_STRING, NulL, NulL, NulL);    if(png_ptr == NulL)    {        printf("ERROR:png_create_write_struct/n");        fclose(png_file);        return 0;    }    info_ptr = png_create_info_struct(png_ptr);    if(info_ptr == NulL)    {        printf("ERROR:png_create_info_struct/n");        png_destroy_write_struct(&png_ptr, NulL);        return 0;    }    png_init_io(png_ptr, png_file);    png_set_IHDR(png_ptr, info_ptr, wIDth, height, bit_depth, PNG_color_TYPE_RGB_Alpha,                 PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE);    png_colorp palette = (png_colorp)png_malloc(png_ptr, PNG_MAX_PALETTE_LENGTH * sizeof(png_color));    if (!palette) {        fclose(png_file);        png_destroy_write_struct(&png_ptr, &info_ptr);        return false;    }    png_set_pltE(png_ptr, info_ptr, palette, PNG_MAX_PALETTE_LENGTH);    png_write_info(png_ptr, info_ptr);    png_set_packing(png_ptr);    //这里就是图像数据了    png_bytepp rows = (png_bytepp)png_malloc(png_ptr, height * sizeof(png_bytep));    for (int i = 0; i < height; ++i)    {        rows[i] = (png_bytep)(pixels + (i) * wIDth*4 );    }    png_write_image(png_ptr, rows);    delete[] rows;    png_write_end(png_ptr, info_ptr);    png_free(png_ptr, palette);    palette=NulL;    png_destroy_write_struct(&png_ptr, &info_ptr);    fclose(png_file);    return 0;}//测试libpng, 保存bitmap到/sdcard/image_test_save.pngextern "C" JNIEXPORT voID JNICALLJava_com_lightin_imagedemo_NativeFunc_savePng(        jnienv *env,        jclass type/* this */,        jobject bitmap) {    AndroIDBitmAPInfo  info;    int ret;    int wIDth = 0;    int height = 0;    voID*              pixels;    if ((ret = AndroIDBitmap_getInfo(env, bitmap, &info)) < 0) {        LOGE("AndroIDBitmap_getInfo() Failed ! error=%d", ret);        return;    }    wIDth = info.wIDth;    height = info.height;    if (info.format != ANDROID_BITMAP_FORMAT_RGBA_8888) {        LOGE("Bitmap format is not RGBA_8888 !");        return;    }    if ((ret = AndroIDBitmap_lockPixels(env, bitmap, &pixels)) < 0) {        LOGE("AndroIDBitmap_lockPixels() Failed ! error=%d", ret);    }    char filename[100];    sprintf(filename,"/sdcard/image_test_save.png");    writePng(filename,( unsigned char*)pixels,wIDth,height,8);    AndroIDBitmap_unlockPixels(env, bitmap);}

 

总结

以上是内存溢出为你收集整理的Android jpeglib 和 pnglib全部内容,希望文章能够帮你解决Android jpeglib 和 pnglib所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1064475.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存