⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 liw_jp2_dll.c

📁 This document is intended to serve as an introduction to Wavelet processing through a set of Matlab
💻 C
字号:
#include "liw.h"#include "liw_id_dll.h"#include "image.h"#include "image_jp2.h"#include "liw_error.h"#include "mathop.h"#include "stream.h"#define FILEID "J1"int CALL_TYPE liw_jp2_encode_ex(void * in_image_ex,               int in_size_x,               int in_size_y,               int nb_components,               int bits_per_pixel,               int bytes_per_pixel,               unsigned char * out_jp2_code,               int jp2_code_size){    IMAGE32 tmp1;    tmp1=Image32_Alloc(nb_components,in_size_x,in_size_y,bits_per_pixel);    CATCHFAIL(tmp1==NULL);    Image_Ex2Image32(in_image_ex, tmp1, bytes_per_pixel);    CATCHFAILLAB(Image_J2K_Write_Ex(tmp1,out_jp2_code,jp2_code_size, jp2_code_size-2),flag_err);    Image32_Free(tmp1);    return(SUCCESS);flag_err:    Image32_Free(tmp1);    return(FAILURE);}int CALL_TYPE liw_jp2_encode(unsigned char * in_rgb_image,               int in_size_x,               int in_size_y,               unsigned char * out_jp2_code,               int  jp2_code_size){   IMAGE tmp1;   tmp1=Image_Alloc(3,in_size_x,in_size_y);   CATCHFAIL(tmp1==NULL);  Image_RGB2Image(in_rgb_image,tmp1);  CATCHFAILLAB(Image_J2K_Write(tmp1,out_jp2_code,jp2_code_size, jp2_code_size-2),flag_err);  Image_Free(tmp1);  return(SUCCESS); flag_err:  Image_Free(tmp1);  return(FAILURE);}/* *********************************************************** *//* *********************************************************** */int CALL_TYPE liw_jp2_decode(unsigned char * in_jp2_code,               int jp2_code_size,               unsigned char * out_rgb_image){   IMAGE tmp1;   tmp1=Image_J2K_Read(in_jp2_code,jp2_code_size);   CATCHFAIL(tmp1==NULL);   Image_Saturation(tmp1,IntTo(0),IntTo(255));   Image_Image2RGB(tmp1,out_rgb_image);   Image_Free(tmp1); /* dirty */   return(SUCCESS);}int CALL_TYPE liw_jp2_decode_ex(    unsigned char * in_jp2_code,    int jp2_code_size,    void * out_image_ex,    int bytes_per_pixel){   IMAGE32 tmp1;   /* Note: Saturation is inside */   tmp1=Image_J2K_Read_Ex(in_jp2_code, jp2_code_size);   CATCHFAIL(tmp1==NULL);   Image_Image322Ex(tmp1, out_image_ex, bytes_per_pixel);   Image32_Free(tmp1); /* dirty */   return(SUCCESS);}/* *********************************************************** *//* *********************************************************** */int CALL_TYPE liw_jp2_info(unsigned char * jp2_code,             int jp2_code_size,             int * size_x, int * size_y){  int nchannels;  *size_x=-1;  if(Image_J2K_Info(jp2_code,jp2_code_size,&nchannels,size_x,size_y))    return(FAILURE);  else    if (*size_x==-1)      return(FAILURE);  return(SUCCESS);}int CALL_TYPE liw_jp2_info_ex(unsigned char * jp2_code,             int jp2_code_size,             int * size_x, int * size_y, int * nb_components, int * bits_per_pixel){  *size_x=-1;  if(Image_J2K_Info_Ex(jp2_code,jp2_code_size,nb_components,size_x,size_y,bits_per_pixel))    return(FAILURE);  else    if (*size_x==-1)      return(FAILURE);  return(SUCCESS);}/* *********************************************************** *//* *********************************************************** *//* Memory allocation */IMAGEImage_Alloc(INT32 nchannels, INT32 nx, INT32 ny){  IMAGE  I =  malloc(sizeof(Image));  INT32 k;  size_t const nxnysize=nx*ny*sizeof(Math_Type);  CATCHFAILLAB(I==NULL,flag_err_I);  I->pix = (Math_Type **) malloc(nchannels*sizeof(Math_Type *));  CATCHFAILLAB(I->pix==NULL,flag_err_Ipix);  for (k=0;k<nchannels;k++)    {      I->pix[k] =  (Math_Type *) malloc(nxnysize);      CATCHFAILLAB(I->pix[k]==NULL,flag_err_Ipixk);    }  I->nchannels=nchannels;  I->nx=nx;  I->ny=ny;  return(I);  /* In case of emergency */ flag_err_Ipixk:  for (k--;k--;)    free(I->pix[k]); flag_err_Ipix:  free(I); flag_err_I:  return(NULL);}BOOLEAN Image_RGB2Image(const unsigned char * RGB, IMAGE I){  INT32 sizexy=I->nx*I->ny;  unsigned char * cur= (unsigned char *) RGB;  INT32 ind;  CATCHFAIL(I->nchannels != 3);  for (ind=0;ind<sizexy;ind++)    {      I->pix[0][ind]=IntTo((unsigned char)(*cur++));      I->pix[1][ind]=IntTo((unsigned char)(*cur++));      I->pix[2][ind]=IntTo((unsigned char)(*cur++));    }  return(SUCCESS);}BOOLEAN Image_Image2RGB(IMAGE I, unsigned char * RGB){  unsigned char *cur;  INT32 size=I->nx*I->ny;  INT32 ind;  CATCHFAIL(I->nchannels != 3);  cur=RGB;   for (ind=0;ind<size;ind++)    {      *cur++=(unsigned char) ToInt(I->pix[0][ind]);      *cur++=(unsigned char) ToInt(I->pix[1][ind]);      *cur++=(unsigned char) ToInt(I->pix[2][ind]);    }   return(SUCCESS);}void Image_Free(/*@null@*/ /*@special@*/ IMAGE I)     /*@releases I->pix,I@*/{    INT32 k;    if (I != NULL)    {        for (k=0; k<I->nchannels; k++)            free(I->pix[k]);        free(I->pix);        free(I);    }}void Image_Saturation(IMAGE in, Math_Type min, Math_Type max){  int k,ind;  int size=in->nx*in->ny;  Math_Type * pixcur, tmp;  for (k=0;k<in->nchannels;k++)    for (pixcur=in->pix[k],ind=0;ind< size;ind++,pixcur++)      {	if ( (tmp=*pixcur) < min)	   *pixcur=min;	else	  if (tmp>max)	  *pixcur=max;      }}/* Image32 ************************************************************/IMAGE32 Image32_Alloc(INT32 nchannels, INT32 nx, INT32 ny, int bits_per_pixel){  IMAGE32  I =  malloc(sizeof(Image32));  INT32 k;  size_t const nxnysize=nx*ny*sizeof(INT32);  CATCHFAILLAB(I==NULL,flag_err_I);  I->pix = (INT32 **) malloc(nchannels*sizeof(INT32 *));  CATCHFAILLAB(I->pix==NULL, flag_err_Ipix);  for (k=0;k<nchannels;k++)    {      I->pix[k] =  (INT32 *) malloc(nxnysize);      CATCHFAILLAB(I->pix[k]==NULL,flag_err_Ipixk);    }  I->nchannels=nchannels;  I->nx=nx;  I->ny=ny;  I->bits_per_pixel=bits_per_pixel;  return(I);  /* In case of emergency */ flag_err_Ipixk:  for (k--;k--;)    free(I->pix[k]); flag_err_Ipix:  free(I); flag_err_I:  return(NULL);}void Image32_Free(IMAGE32 I){    INT32 k;    if (I != NULL)    {        for (k=0; k<I->nchannels; k++)            free(I->pix[k]);        free(I->pix);        free(I);    }}BOOLEAN Image_Ex2Image32(const void * multiplexed, IMAGE32 I, int bytes_per_pixel){    INT32 sizexy = I->nx * I->ny;    char *   cur_1 = (char *)   multiplexed;    short *  cur_2 = (short *)  multiplexed;    long *   cur_4 = (long *)   multiplexed;    INT32 ind;    int channel;    if (bytes_per_pixel == 1)    {        for (ind=0;ind<sizexy;ind++)        for ( channel = 0; channel < I->nchannels ; channel ++)            I->pix[channel][ind] = *cur_1++;    }    else if (bytes_per_pixel == 2)    {        for (ind=0;ind<sizexy;ind++)        for ( channel = 0; channel < I->nchannels ; channel ++)            I->pix[channel][ind] = *cur_2++;    }    else if (bytes_per_pixel == 4)    {        for (ind=0;ind<sizexy;ind++)        for ( channel = 0; channel < I->nchannels ; channel ++)            I->pix[channel][ind] = *cur_4++;    }    else        return (FAILURE);  return(SUCCESS);}BOOLEAN Image_Image322Ex(IMAGE32 I, void * multiplexed, int bytes_per_pixel){    char     * cur_1 = (char *)     multiplexed;    short    * cur_2 = (short *)    multiplexed;    long     * cur_4 = (long *)     multiplexed;    INT32 size=I->nx*I->ny;    INT32 ind;    int channel;    if (bytes_per_pixel == 1)    {        for (ind=0;ind<size;ind++)        for (channel=0;channel < I->nchannels;channel++)            *cur_1++ = (char) (I->pix[channel][ind]);    }    else if (bytes_per_pixel == 2)    {        for (ind=0;ind<size;ind++)        for (channel=0;channel < I->nchannels;channel++)            *cur_2++ = (short) (I->pix[channel][ind]);    }    else if (bytes_per_pixel == 4)    {        for (ind=0;ind<size;ind++)        for (channel=0;channel < I->nchannels;channel++)            *cur_4++ = (long) (I->pix[channel][ind]);    }    else        return (FAILURE);    return(SUCCESS);}void Image32_Saturation(IMAGE32 in, INT32 min, INT32 max){  int k,ind;  int size=in->nx*in->ny;  INT32 * pixcur, tmp;  for (k=0;k<in->nchannels;k++)    for (pixcur=in->pix[k],ind=0;ind< size;ind++,pixcur++)      {	if ( (tmp=*pixcur) < min)	   *pixcur=min;	else	  if (tmp>max)	  *pixcur=max;      }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -