void __fastcall TForm1::N3202401Click(TObject *Sender)
{
FILE *fp;
fp = fopen("E://±àÂëÏîÄ¿//YUVË«ÏßÐԱ任//320&240YUV422.yuv", "rb");
unsigned char *YUV=new unsigned char[320*240*2];
fread(YUV, sizeof(char), 320*240*2, fp);
double Y,U,V;
unsigned short height,width;
unsigned short heightNew,widthNew; //ÐÂͼÏñµÄ¸ß¶ÈºÍ¿í¶È
float k=0.525;
float widthScale=(float)(1.0/k),heightScale=(float)(1.0/k);
float xx,yy;
int a,b;
width=320; //ÔͼÏñ´óС
height=240;
widthNew=(int)(width*k); //µÃµ½ÐÂͼÏñµÄ¸ß¶ÈºÍ¿í¶È
heightNew =(int)(height*k);
unsigned char *YUVnew=new unsigned char[widthNew*heightNew*2];
for(int y=(int)k;y
for(int x=(int)k; x
xx=x*widthScale ;
yy=y*heightScale ;
if(xx<=1e-8)
{
xx=0;
}
if(xx>width-2)
{
xx=(float)(width-2);
}
if(yy<=1e-8)
{
yy=0;
}
if(yy>height-2)
{
yy=(float)(height-2);
}
a=(int)xx;
b=(int)yy;
//·Ö±ðµÃµ½¶ÔÓ¦ÏñËصÄYUVÖµ²¢ÓÃË«ÏßÐÔ²åÖµµÃµ½ÐÂÏñËصÄYUVÖµ
double y11,y12,y21,y22;
double u11,u12,u21,u22;
double v11,v12,v21,v22;
y11=YUV[b*320+a];
y12=YUV[b*320+a+1];
y21=YUV[(b+1)*320+a];
y22=YUV[(b+1)*320+a+1];
Y=y11*(a+1-xx)*(b+1-yy)+y12*(a+1-xx)*(yy-b)
+y21*(xx-a)*(b+1-yy)+y22*(xx-a)*(yy-b); //Y
YUVnew[x+y*widthNew]=(char)Y;
u11=YUV[320*240+b*320/2+a];
u12=YUV[320*240+b*320/2+a+1];
u21=YUV[(b+1)*320/2+320*240+a];
u22=YUV[(b+1)*320/2+320*240+a+1];
U=u11*(a+1-xx)*(b+1-yy)+u12*(a+1-xx)*(yy-b)
+u21*(xx-a)*(b+1-yy)+u22*(xx-a)*(yy-b); //U
v11=YUV[320*240+320*240/2+b*320/2+a];
v12=YUV[320*240+320*240/2+b*320/2+a+1];
v21=YUV[(b+1)*320/2+320*240+320*240/2+a];
v22=YUV[(b+1)*320/2+320*240+320*240/2+a+1];
V=v11*(a+1-xx)*(b+1-yy)+v12*(a+1-xx)*(yy-b)
+v21*(xx-a)*(b+1-yy)+v22*(xx-a)*(yy-b); //V
YUVnew[x+y*widthNew]=(char)Y;
YUVnew[widthNew*heightNew+x+y*widthNew/2]=(char)U;
YUVnew[widthNew*heightNew+widthNew*heightNew/2+x+y*widthNew/2]=(char)V;
}
}
/*Ëõ·ÅºóµÄYUVתRGB²¢ÏÔʾ*/
int col,row;
double red,blue,green;
unsigned char *RGB = new unsigned char [widthNew*heightNew*3];
for (row=0; row
int idx=((heightNew-row-1)*3)*widthNew;
int rowptr=row*widthNew;
for (col=0; col
int colhalf=col>>1;
Y=YUVnew[rowptr+col];
U=YUVnew[rowptr+colhalf+widthNew*heightNew-row*widthNew/2];
V=YUVnew[rowptr+colhalf+widthNew*heightNew-row*widthNew/2+widthNew*heightNew/2];
red=(Y+(U-128)*1.4022)+0.5;
green=(Y-(U-128)*0.3456-(V-128)*0.7145)+0.5;
blue=(Y+(V-128)*1.7710)+0.5;
if (red>255) red=255;
else if (red<0) red=0;
if (green>255) green=255;
else if (green<0) green=0;
if (blue>255) blue=255;
else if (blue<0) blue=0;
RGB[idx++]=(char)red;
RGB[idx++]=(char)green;
RGB[idx++]=(char)blue;
}
}
Graphics::TBitmap *pBitNew;
pBitNew = new Graphics::TBitmap();
pBitNew->Width=widthNew;
pBitNew->Height=heightNew;
Byte *ptr;
pBitNew->PixelFormat=pf24bit; //¶¨Òå24λµÄλͼ
for(int i=0; i
ptr= (Byte*)(pBitNew->ScanLine[i]);
int RGBIndex=3*widthNew*(heightNew-i);
for(int j=0;j
int B=RGB[RGBIndex+j];
int G=RGB[RGBIndex+j+1];
int R=RGB[RGBIndex+j+2];
*(ptr+j)= B;
*(ptr+j+1)= G;
*(ptr+j+2)= R;
}
}
Image2->Picture->Bitmap->Assign(pBitNew);
delete pBitNew;
}