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

📄 unit1.cpp

📁 一种新的机遇小波变换的压缩存储方法
💻 CPP
字号:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "setpar.h"
#include "Unit1.h"
#include "gwic.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
//#define TERMINATE ShowMessage
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
  : TForm(Owner)
{
}
//---------------------------------------------------------------------------

int __fastcall TForm1::load_bmp(Graphics::TBitmap *bmp,float **pic, int *width, int *height,
	      int *orig_width, int *orig_height, int *maxcolor,	      BYTE *colormode)
{
  int i,j,h,w,oh,ow,c1,c2;
  float *p, *g;
  switch(bmp->PixelFormat)
  {
    case pf8bit  :   *colormode = CM_GRAY; break;
    case pf24bit :   *colormode = CM_RGB24;break;
    default : ;
  }
  ow = bmp->Width; oh = bmp->Height;
  if (ow<1 || oh<1) TERMINATE("PNM Width and Height must be > 0");
  w=ow>256 ? (ow+15) & 0xfffffff0 : (ow+7) & 0xfffffff8;  h=oh>256 ? (oh+15) & 0xfffffff0 : (oh+7) & 0xfffffff8;  *height = h; *width = w;  *orig_height = oh; *orig_width = ow;
  *maxcolor = 8;

  switch(*colormode)
  {
    case CM_GRAY: MALLOC(*pic,w*h*sizeof(float)); break;    case CM_RGB24: MALLOC(*pic,w*h*sizeof(float)*3); break;  }

  // Read image
  Byte *line;  p = *pic;  for(j=0; j<h; j++)  {    line=(Byte *)bmp->ScanLine[j];    if (*colormode == CM_GRAY)    {      for(i=0; i<w; i++,p++)      {	      if (i<ow && j<oh)  *p = *line++;        else *p = *(*pic + w*(j<oh?j:oh-1) + (i<ow?i:ow-1));      }    }    else if (*colormode == CM_RGB24)    {      for(i=0; i<w; i++)      {        if (i<ow && j<oh) {*p++ = *line++; *p++ = *line++; *p++ = *line++;}        else {g = (*pic + (3*w)*(j<oh?j:oh) + 3*(i<ow?i:ow));  *p++ = *g++; *p++ = *g++; *p++ = *g++;}      }    }
  }
}


void __fastcall TForm1::OpenBmpClick(TObject *Sender)
{
  if(bmpOpenDialog->Execute())
  {
    Image1->Picture->LoadFromFile(bmpOpenDialog->FileName);
  }
}
//---------------------------------------------------------------------------

void __fastcall TForm1::SaveWltClick(TObject *Sender)
{
  if(wltSaveDialog->Execute())
  {
  if(fmPar->ShowModal()==mrOk)
  {
    float bpp;
    int w,h,ow,oh,maxc,levelsY, levelsUV;
    float *f, *f2;
    U32 *coeff, *coeff2, *coeff3;
    heap2d *heap,*heap2,*heap3;
    header head;
    parameters par;
    int i,j,k;
    FILE *df;

    par.targetbpp = fmPar->etBPP->Text.ToDouble();
    par.transform = TR_DEFAULT;
    par.ccbsc = (int)(0.1 * 256.0);
    par.out=fopen(wltSaveDialog->FileName.c_str(),"wb");

    //load_pnm(par.in,&f,&w,&h,&ow,&oh,&maxc,&head.cm);
    load_bmp(Image1->Picture->Bitmap,&f,&w,&h,&ow,&oh,&maxc,&head.cm);

    head.magic = MAGIC; head.version = VERSION;
    head.iwidth = ow; head.iheight = oh;
    head.width = w; head.height = h;
    head.ccbsc = par.ccbsc;
    head.bpp[0] = maxc < 256 ? 8 : (maxc < 4096 ? 12 : 16); head.dpi = 0;
    head.transform = par.transform;
    switch (head.cm)
    {
      case CM_GRAY:
        head.levelsY = levelsY = forward_transform(f,w,h,head.transform);
        coeff = convert_matrix_from_float(f,w*h);
        heap = gen_2d_heap(coeff, w, h, levelsY);
        head.n[0] = heap->max;
        fwrite((void *)&head, 1, sizeof(header),par.out);
        start_coding(par.out,TOTALSTATES);
        zerotree_code(coeff,w,h,levelsY,(int)(par.targetbpp * ((float)(w*h)/8.0)),heap,ow*oh);
        break;
      case CM_GRAY_DEEPSPARC:
        TERMINATE("Unsupported color model\n");
        break;
      case CM_RGB24:
        head.bpp[1] = head.bpp[2] = head.bpp[0];
        if (head.bpp[0] != 8)TERMINATE("Unsupported color model - RGB24 with BPP != 8\n");
        convert_matrix_from_24bc_packed_to_yuv_planes(f,w*h);
        head.levelsY = levelsY = forward_transform(f,w,h,head.transform);
        head.levelsUV = levelsUV = forward_transform(f+w*h,w/2,h,head.transform);
        forward_transform(f+w*h+w*h/2,w/2,h,head.transform);
        coeff = convert_matrix_from_float(f,w*h*2);
        heap = gen_2d_heap(coeff, w, h, levelsY);
        heap2 = gen_2d_heap(coeff+w*h, w/2, h, levelsUV);
        heap3 = gen_2d_heap(coeff+w*h+w*h/2, w/2, h, levelsUV);
        head.n[0] = heap->max;
        head.n[1] = heap2->max;
        head.n[2] = heap3->max;
        fwrite((void *)&head, 1, sizeof(header),par.out);
        start_coding(par.out,TOTALSTATES);
        zerotree_code(coeff,w,h,levelsY,(int)((par.targetbpp*w*h*(256-2*head.ccbsc))/(256*8)),heap,ow*oh);
        zerotree_code(coeff+w*h,w/2,h,levelsUV,(int)((par.targetbpp*w*h*(256-head.ccbsc))/(256*8)),heap2,ow*oh);
        zerotree_code(coeff+w*h+w*h/2,w/2,h,levelsUV,(int)((par.targetbpp*w*h)/8),heap3,ow*oh);
        break;
      default:
        TERMINATE("Unsupported color model\n");
        break;
    }
    stop_coding();
    fclose(par.out);
  }
  }
}
//---------------------------------------------------------------------------

void __fastcall TForm1::OpenWltClick(TObject *Sender)
{
  if(wltOpenDialog->Execute())
  {
    float bpp;
    int w,h,ow,oh,maxc,levelsY, levelsUV;
    float *f, *f2;
    U32 *coeff, *coeff2, *coeff3;
    heap2d *heap,*heap2,*heap3;
    header head;
    parameters par;
    int i,j,k;
    FILE *df;

    par.targetbpp = 1.0;
    par.transform = TR_DEFAULT;
    par.ccbsc = (int)(0.1 * 256.0);
    par.in=fopen(wltOpenDialog->FileName.c_str(),"rb");
    fread((void *)&head, 1, sizeof(header),par.in);
    start_decoding(par.in,TOTALSTATES);
    switch (head.cm)
    {
      case CM_GRAY:
        coeff = zerotree_decode(head.width,head.height,head.levelsY,head.n[0]);
        stop_decoding();
        f = convert_matrix_from_int(coeff,head.width*head.height);
        inverse_transform(f,head.width,head.height,head.transform);
        break;
      case CM_GRAY_DEEPSPARC:
        TERMINATE("Unsupported color model\n");
        break;
      case CM_RGB24:
        coeff = zerotree_decode(head.width,head.height,head.levelsY,head.n[0]);
        coeff2 = zerotree_decode(head.width/2,head.height,head.levelsUV,head.n[1]);
        coeff3 = zerotree_decode(head.width/2,head.height,head.levelsUV,head.n[2]);
        stop_decoding();
        MALLOC(f2,sizeof(float)*3*head.width*head.height);
        j = head.width * head.height;

        f = convert_matrix_from_int( coeff, head.width * head.height);
        inverse_transform( f, head.width, head.height, head.transform);
        for(i=0; i<j; i++) *(f2+i) = *(f+i); free(f);

        f = convert_matrix_from_int(coeff2, head.width * head.height / 2);
        inverse_transform(f, head.width / 2, head.height, head.transform);
        for(i=0; i<j/2; i++) *(f2+i+j) = *(f+i); free(f);

        f = convert_matrix_from_int( coeff3, head.width * head.height / 2);
        inverse_transform( f, head.width / 2, head.height, head.transform);
        for(i=0; i<j/2; i++) *(f2+i+j+j/2) = *(f+i); free(f);

        f = f2;
        convert_matrix_from_to_yuv_planes_24bc_packed(f,j);
        break;
      default:
        TERMINATE("Unsupported color model\n");
        break;
    }
    fclose(par.in);

    //save_pnm(par.out,f,head.width,head.height,head.iwidth,head.iheight,(1<<(head.bpp[0]))-1,head.cm);
    {
      float *pic=f;
      int width=head.width;
      int height=head.height;
      int orig_width=head.iwidth;      int orig_height=head.iheight;      int maxcolor=(1<<(head.bpp[0]))-1;      BYTE colormode=head.cm;

      Graphics::TBitmap *bmp=new Graphics::TBitmap();
      bmp->PixelFormat=pf24bit;
      bmp->Width=orig_width;
      bmp->Height=orig_height;
      int i,j,k;
      float *p;      Byte *ptr;      switch (colormode)      {        case CM_GRAY:        {          for (j=0; j<orig_height; j++)          {            p=pic+width*j;            ptr=(Byte *)bmp->ScanLine[j];            for (i=0; i<orig_width; i++,p++)            {              k = (int)*p;              if(k>maxcolor) k=maxcolor;              if (k<0) k=0;              if (maxcolor <256) {*ptr++=k;  *ptr++=k;  *ptr++=k;}              else {/*fputc(k & 0xff,out);  fputc(k >> 8,out);*/}            }          }          Image2->Width=bmp->Width;          Image2->Height=bmp->Height;                    Image2->Canvas->Draw(0,0,bmp);          break;        }        case CM_RGB24:        {          for (j=0; j<orig_height; j++)          {            p=pic+width*j*3;            ptr=(Byte *)bmp->ScanLine[j];            for (i=0; i<orig_width; i++)            {              k = (int)*p++; if(k>255) k=255; if (k<0) k=0;*ptr++=k;              k = (int)*p++; if(k>255) k=255; if (k<0) k=0;*ptr++=k;              k = (int)*p++; if(k>255) k=255; if (k<0) k=0;*ptr++=k;            }          }          Image2->Width=bmp->Width;          Image2->Height=bmp->Height;          Image2->Canvas->Draw(0,0,bmp);          break;        }        default:  TERMINATE("Unsupported colormode");      }
      delete bmp;
    }
  }
}
//---------------------------------------------------------------------------

void __fastcall TForm1::SaveBmpClick(TObject *Sender)
{
  if(bmpSaveDialog->Execute())
  {
    Image2->Picture->SaveToFile(bmpSaveDialog->FileName);
  }
}
//---------------------------------------------------------------------------



⌨️ 快捷键说明

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