?? unit1.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);
}
}
//---------------------------------------------------------------------------
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -