各位大虾
      图片的数据通过jni用c语言读取,想把数据返回到android的java层,然后再把图片正常显示出来。应该怎么样处理数据?应该有一个什么过程?c语言的fopen函数是读txt文件的  有没有读取图片的函数。这个 没有思路。有没有  一个小程序实例??
        感谢各位 能够帮助下android图片

解决方案 »

  1.   

    java中读取图片的函数内部也是用类似fopen的东东读取图片文件的
    然后再把读取的数据转换成图片的rgba
    读取PNG文件步骤1.移植libpng库
    网上有教程,不会找我……2.读取图片数据
       以下为asset内图片的读取
       读程序数据空间或SD卡内的图片直接 FILE *fp.... 就行了
    #include <android/asset_manager.h>png_byte  *mImageData;
    png_uint_32  mW,mH;void mLoadPNGFile(char *pFileName)
    {
    off_t  start,length; png_byte  pSig[8];
    png_structp  png_ptr;
    png_infop  info_ptr;
    AAsset *asset=AAssetManager_open(gEngine.mApp->activity->assetManager,pFileName,AASSET_MODE_UNKNOWN);
    //这里需要从java端传入assetManager,我用的是纯c++ activity,所以不需要
    if(!asset)
    {
    return;
    } int fd=AAsset_openFileDescriptor(asset,&start,&length);
    if(fd<0)
    return;
    FILE *file=fdopen(fd,"rb");
    fseek(file,start,SEEK_SET);
    fread(pSig,sizeof(*pSig),8,file); if(!png_check_sig(pSig,8))
    {
    LOGI("The file \"%s\" isn't a PNG file",pFileName);
    fclose(file);
    AAsset_close(asset);
    return;
    }
    if((png_ptr=png_create_read_struct(PNG_LIBPNG_VER_STRING,NULL,NULL,NULL))==NULL)
    {
    fclose(file);
    AAsset_close(asset);
    return;
    }
    if((info_ptr=png_create_info_struct(png_ptr))==NULL)
    {
    png_destroy_read_struct(&png_ptr,NULL,NULL);
    fclose(file);
    AAsset_close(asset);
    return;
    }
    if(setjmp(png_jmpbuf(png_ptr)))
    {
    png_destroy_read_struct(&png_ptr,&info_ptr,NULL);
    fclose(file);
    AAsset_close(asset);
    return;
    } png_init_io(png_ptr,file);
    png_set_sig_bytes(png_ptr,8); int bit_depth,color_type;
    png_read_info(png_ptr,info_ptr);
    png_get_IHDR(png_ptr,info_ptr,&mW,&mH,&bit_depth,&color_type,NULL,NULL,NULL); int size=mH*mW*4;
    unsigned int rowbytes=png_get_rowbytes(png_ptr,info_ptr); mImageData=new unsigned char[size];
    if(!mImageData)
    {
    png_destroy_read_struct(&png_ptr,&info_ptr,NULL);
    fclose(file);
    AAsset_close(asset);
    return;
    } png_bytepp row_pointers=new png_bytep[mH];
    if(!row_pointers)
    {
    delete[] mImageData;
    png_destroy_read_struct(&png_ptr,&info_ptr,NULL);
    fclose(file);
    AAsset_close(asset);
    return;
    } for(png_uint_32 i=0;i<mH;i++)
    row_pointers[mH-1-i]=mImageData+i*rowbytes;
    png_read_image(png_ptr,row_pointers); delete[] row_pointers;
    png_destroy_read_struct(&png_ptr,&info_ptr,NULL);
    fclose(file);
    AAsset_close(asset);}