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

📄 jpeg.cpp

📁 用在X86芯片的,嵌入式系统中的自动更新程序
💻 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 + -