📄 jpeg.cpp
字号:
// Jpeg.cpp: implementation of the CJpeg class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "LCYImageProcess.h"
#include "Jpeg.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
#define DCTSIZE 8 //定义做DCT变换的图象块是8*8
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CJpeg::CJpeg()
{
}
CJpeg::~CJpeg()
{
}
//打开JPEG文件对话框
BOOL CJpeg::OpenJpegFile(CString filepath)
{
m_JpegFile=new CFile;
if(!m_JpegFile->Open(filepath,CFile::modeRead))
{
::AfxMessageBox("File Error!!");
return FALSE;
}
if((m_JpegFile=(CFile*)(fopen(filepath,"rb")))==NULL)
{
::AfxMessageBox("can't open JPEG FILE!");
return FALSE;
}
return TRUE;
}
//将RGB色彩空间转换为YCbCr色彩空间
void CJpeg::RGBtoYCbCr(RGBCOLOR* imagedata,long width,long height)
{
//得到Y值
for(int i=0;i<height;i++)
{
for(int j=0;j<width;j++)
{
m_Y[i*width+j]=(BYTE)(0.299*imagedata[i*width+j].rgbRed+0.587*imagedata[i*width+j].rgbGreen+0.114*imagedata[i*width+j].rgbBlue);
}
}
//得到CB值
for(i=0;i<height/2;i++)
{
for(int j=0;j<width/2;j++)
{
long h_old=i*2;
long w_old=j*2;
if(h_old<height && h_old>0 && w_old>0 && w_old<width)
{
m_Cb[i*width/2+j]=(BYTE)(-0.1687*imagedata[h_old*width+w_old].rgbRed-0.3313*imagedata[h_old*width+w_old].rgbGreen+0.5*imagedata[h_old*width+w_old].rgbBlue+128);
}
}
}
//得到CR值
for(i=0;i<height/2;i++)
{
for(int j=0;j<width/2;j++)
{
long h_old=i*2;
long w_old=j*2;
if(h_old<height && h_old>0 && w_old>0 && w_old<width)
{
m_Cr[i*width/2+j]=(BYTE)(0.5*imagedata[h_old*width+w_old].rgbRed-0.4187*imagedata[h_old*width+w_old].rgbGreen-0.0813*imagedata[h_old*width+w_old].rgbBlue+128);
}
}
}
}
//写入为JPEG文件
BOOL CJpeg::WriteJpegFile(CString filepath,CWinPic* bmpfile,long width,long height)
{
//分配色彩空间
m_Y=new BYTE[width*height];
m_Cb=new BYTE[width*height/4];
m_Cr=new BYTE[width*height/4];
//转换色彩空间
RGBtoYCbCr(bmpfile->m_ImageData,width,height);
//对Y,Cb,Cr分别做离散余弦变换
return TRUE;
}
////////////////////////////////////////
/*一维傅立叶变换:
//算法步骤:
//1,开辟存储空间以保存加权系数W及中间变量
//2,采用频率分解法进行碟形运算
//3,重新排列序列顺序
//4,释放存储空间*/
/////////////////////
/*void CJpeg::FFT(double* t,double* f,int r)
{
}*/
//正向离散余弦变换,只适合8*8的块变换 DCTSIZE=8
void CJpeg::FDCT(BYTE* data)
{
BYTE tmp0,tmp1,tmp2,tmp3,tmp4,tmp5,tmp6,tmp7;
BYTE tmp10,tmp11,tmp12,tmp13;
BYTE t1,t2,t3,t4,t5,t11,t13;
//对行进行计算
for(int i=0;i<DCTSIZE;i++)
{
tmp0=data[i*DCTSIZE+0]+data[i*DCTSIZE+7];
tmp7=data[i*DCTSIZE+0]-data[i*DCTSIZE+7];
tmp1=data[i*DCTSIZE+1]+data[i*DCTSIZE+6];
tmp6=data[i*DCTSIZE+1]-data[i*DCTSIZE+6];
tmp2=data[i*DCTSIZE+2]+data[i*DCTSIZE+5];
tmp5=data[i*DCTSIZE+2]-data[i*DCTSIZE+5];
tmp3=data[i*DCTSIZE+3]+data[i*DCTSIZE+4];
tmp4=data[i*DCTSIZE+3]-data[i*DCTSIZE+4];
//对偶数项进行计算
tmp10=tmp0+tmp3;
tmp13=tmp0-tmp3;
tmp11=tmp1+tmp2;
tmp12=tmp1-tmp2;
t1=(BYTE)((tmp12*tmp13)*0.707106781);
data[i*DCTSIZE+0]=tmp10+tmp11;
data[i*DCTSIZE+2]=tmp13+t1;
data[i*DCTSIZE+4]=tmp10-tmp11;
data[i*DCTSIZE+6]=tmp13-t1;
//对奇数项进行计算
tmp10=tmp4+tmp5;
tmp11=tmp5+tmp6;
tmp12=tmp6+tmp7;
t5=(BYTE)((tmp10-tmp12)*0.382683433);
t2=(BYTE)(0.541196100*tmp10+t5);
t4=(BYTE)(1.306562965*tmp12+t5);
t3=(BYTE)(tmp11*0.707106781);
t11=tmp7+t3;
t13=tmp7-t3;
data[i*DCTSIZE+1]=t11+t4;
data[i*DCTSIZE+3]=t13-t2;
data[i*DCTSIZE+5]=t13+t2;
data[i*DCTSIZE+7]=t11-t4;
}
//对列进行计算
for(i=0;i<DCTSIZE;i++)
{
tmp0=data[i+DCTSIZE*0]+data[i+DCTSIZE*7];
tmp7=data[i+DCTSIZE*0]-data[i+DCTSIZE*7];
tmp1=data[i+DCTSIZE*1]+data[i+DCTSIZE*6];
tmp6=data[i+DCTSIZE*1]-data[i+DCTSIZE*6];
tmp2=data[i+DCTSIZE*2]+data[i+DCTSIZE*5];
tmp5=data[i+DCTSIZE*2]-data[i+DCTSIZE*5];
tmp3=data[i+DCTSIZE*3]+data[i+DCTSIZE*4];
tmp4=data[i+DCTSIZE*3]-data[i+DCTSIZE*4];
//对偶数项进行计算
tmp10=tmp0+tmp3;
tmp13=tmp0-tmp3;
tmp11=tmp1+tmp2;
tmp12=tmp1-tmp2;
t1=(BYTE)((tmp12+tmp13)*0.707106781);
data[i+DCTSIZE*0]=tmp10+tmp11;
data[i+DCTSIZE*2]=tmp13+t1;
data[i+DCTSIZE*4]=tmp10-tmp11;
data[i+DCTSIZE*6]=tmp13-t1;
tmp10=tmp4+tmp5;
tmp11=tmp5+tmp6;
tmp12=tmp6+tmp7;
t5=(BYTE)((tmp10-tmp12)*0.382683433);
t2=(BYTE)(0.541196100*tmp10+t5);
t4=(BYTE)(1.306562965*tmp12+t5);
t3=(BYTE)(tmp11*0.707106781);
t11=tmp7+t3;
t13=tmp7-t3;
data[i+DCTSIZE*1]=t11+t4;
data[i+DCTSIZE*3]=t13-t2;
data[i+DCTSIZE*5]=t13+t2;
data[i+DCTSIZE*7]=t11-t4;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -