亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? imgprocessview.cpp

?? 可用的基于小波的spiht算法
?? CPP
字號:
// ImgProcessView.cpp : implementation of the CImgProcessView class
//

#include "stdafx.h"
#include "ImgProcess.h"

#include  "GlobalApi.h"
#include "LEVEL.h"
#include "SPIHTCoder.h"

#include "ImgProcessDoc.h"
#include "ImgProcessView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CImgProcessView

IMPLEMENT_DYNCREATE(CImgProcessView, CScrollView)

BEGIN_MESSAGE_MAP(CImgProcessView, CScrollView)
	//{{AFX_MSG_MAP(CImgProcessView)
	ON_COMMAND(ID_TRANS_DWT, OnTransDwt)
	ON_COMMAND(ID_TRANS_IDWT, OnTransIdwt)
	ON_COMMAND(ID_SPIHT_CODE, OnSpihtCode)
	ON_COMMAND(ID_SPIHT_DECODE, OnSpihtDecode)
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CScrollView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CImgProcessView construction/destruction

CImgProcessView::CImgProcessView()
{
	// TODO: add construction code here
	// 為小波變換設置的參數
	// 臨時存放小波變換系數內存
	m_pDbImage = NULL;	
	
	// 設置當前層數
	m_nDWTCurDepth = 0;

	// 設置小波基緊支集長度
//	m_nSupp = 1;

}

CImgProcessView::~CImgProcessView()
{
	// 釋放已分配內存
	if(m_pDbImage){
		delete[]m_pDbImage;
		m_pDbImage = NULL;
	}
}

BOOL CImgProcessView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CScrollView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CImgProcessView drawing

void CImgProcessView::OnDraw(CDC* pDC)
{
	CImgProcessDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
	CSize sizeDibDisplay;		
		
	if(!pDoc->m_pDibInit->IsEmpty()){	
		sizeDibDisplay = pDoc->m_pDibInit->GetDimensions();
		pDoc->m_pDibInit->Draw(pDC,CPoint(0,0),sizeDibDisplay);	
	}
}

void CImgProcessView::OnInitialUpdate()
{
	CScrollView::OnInitialUpdate();

	CImgProcessDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	CSize sizeTotal = pDoc->m_pDibInit->GetDimensions();
	SetScrollSizes(MM_TEXT, sizeTotal);

	GetParentFrame()->RecalcLayout();
	ResizeParentToFit();
}

/////////////////////////////////////////////////////////////////////////////
// CImgProcessView printing

BOOL CImgProcessView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CImgProcessView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CImgProcessView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CImgProcessView diagnostics

#ifdef _DEBUG
void CImgProcessView::AssertValid() const
{
	CScrollView::AssertValid();
}

void CImgProcessView::Dump(CDumpContext& dc) const
{
	CScrollView::Dump(dc);
}

CImgProcessDoc* CImgProcessView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CImgProcessDoc)));
	return (CImgProcessDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CImgProcessView message handlers

void CImgProcessView::OnTransDwt() 
{
	// TODO: Add your command handler code here
	// 獲得文檔類指針
	CImgProcessDoc * pDoc = (CImgProcessDoc *)this->GetDocument();

	// 指向圖象的指針
	CDib * pDib = pDoc->m_pDibInit;

	// 更改光標形狀
	BeginWaitCursor();

//*****************************************************
	int* pDbTemp;
	BYTE* pBits;

	CSize m_size;
	// 獲取圖象的存儲尺寸
	CSize sizeImageSave = pDib->GetDibSaveDim();

	m_size.cx = pDib->m_lpBMIH->biWidth;
	m_size.cy = pDib->m_lpBMIH->biHeight;
	iwidth=m_size.cx ;
	iheight=m_size.cy;
	
	frame=new int[m_size.cx * m_size.cy];
	
	// 將圖象數據放入frame中 
		for (int j=0; j<iheight; j++)
		{
			pDbTemp = frame + j*sizeImageSave.cx;
			pBits = pDib->m_lpImage + (iheight-1-j)*sizeImageSave.cx;		
			for (int i=0; i<iwidth; i++)
				pDbTemp[i] = pBits[i];
		}

//**********************************************
    //產生對話框
	CLEVEL Dialog;
    Dialog.m_level = 1;
	Dialog.m_supp = 1;
	if (Dialog.DoModal()!=IDOK)
    return;
	// 設置需要分解的層數
	m_nDWTLevel = Dialog.m_level;
	// 設置小波基緊支集長度
	m_nSupp = Dialog.m_supp;
	
	//刪除對話框
	delete Dialog;
//*********************************************

	// 進行小波變換
	int rsl;
	for(int i=0;i<m_nDWTLevel;i++)
	 rsl = DIBDWTStep(pDib,0);

	// 恢復光標形狀
	EndWaitCursor();

	// 如果小波變換不成功,則直接返回
	if (!rsl)			
		return;

	// 設置臟標志
	pDoc->SetModifiedFlag(TRUE);

	// 更新顯示
	pDoc->UpdateAllViews(NULL);

}

void CImgProcessView::OnTransIdwt() 
{
	// TODO: Add your command handler code here
	// 獲得文檔類指針	
	CImgProcessDoc * pDoc = (CImgProcessDoc *)this->GetDocument();

	// 指向圖象的指針
	CDib * pDib = pDoc->m_pDibInit;

	// 更改光標形狀
	BeginWaitCursor();

//**************************************

	try{
		if(m_nDWTCurDepth<1) 
			throw new CException;}
		//錯誤處理
	catch(CException* pe)
	{
		AfxMessageBox("當前已不能反變換");
		pe->Delete();
		return;
	}

//************************************

	// 進行小波反變換
	int rsl;
	for(int i=m_nDWTLevel;i>0;i--)
	 rsl = DIBDWTStep(pDib,1);
	//int rsl = DIBDWTStep(pDib,1);
//*****************************
	// 獲取圖象的存儲尺寸
	CSize sizeImageSave = pDib->GetDibSaveDim();
	int* image;
	int* pDbTemp;
	BYTE* pBits;
		image=new int[iheight * iwidth];
	
	// 將圖象數據放入frame中 
		for (int j=0; j<iheight; j++)
		{
			pDbTemp = image + j*sizeImageSave.cx;
			pBits = pDib->m_lpImage + (iheight-1-j)*sizeImageSave.cx;		
			for (int i=0; i<iwidth; i++)
				pDbTemp[i] = pBits[i];
		}
//計算PSNR
	int m,n,MSE;
	float PSNR;
	CString str;
	   MSE=0;
	   for(m=0;m<iheight;m++)
	      for(n=0;n<iwidth;n++)
		      MSE=MSE+(image[m*iwidth+n]-frame[m*iwidth+n])*(image[m*iwidth+n]-frame[m*iwidth+n]);
		      MSE=MSE/(iwidth*iheight);
		      PSNR=10*log10(255*255/MSE);  
			  str.Format("PSNR為%f",PSNR);
	          //AfxMessageBox(str);

	delete []image;
	delete []frame;

	// 恢復光標形狀
	EndWaitCursor();
	// 如果小波變換不成功,則直接返回
	if (!rsl)			
		return;
	pDoc->UpdateAllViews(FALSE);

	// 設置臟標記
	pDoc->SetModifiedFlag(TRUE);
	
	// 更新視圖
	pDoc->UpdateAllViews(NULL);
	AfxMessageBox(str);
}

BOOL CImgProcessView::DIBDWTStep(CDib* pDib,int nInv)
{
	// 循環變量
	int i, j;

	// 獲取圖象的長度和寬度
	int nWidth  = pDib->m_lpBMIH->biWidth;
	int nHeight = pDib->m_lpBMIH->biHeight;
		
	// 獲取變換的最大層數
	int nMaxWLevel = Log2(nWidth);
	int nMaxHLevel = Log2(nHeight);
	int nMaxLevel;
	if (nWidth == 1<<nMaxWLevel && nHeight == 1<<nMaxHLevel)
		nMaxLevel = min(nMaxWLevel, nMaxHLevel);

	// 獲取圖象的存儲尺寸
	CSize sizeImageSave = pDib->GetDibSaveDim();

	// 臨時變量
	double	*pDbTemp;
	BYTE	*pBits;

	// 如果小波變換的存儲內存還沒有分配,則分配此內存
	if(!m_pDbImage){			
		m_pDbImage = new double[nWidth*nHeight];
		if (!m_pDbImage)	return FALSE;

		// 將圖象數據放入m_pDbImage中 
		for (j=0; j<nHeight; j++)
		{
			pDbTemp = m_pDbImage + j*sizeImageSave.cx;
			pBits = pDib->m_lpImage + (nHeight-1-j)*sizeImageSave.cx;		
			for (i=0; i<nWidth; i++)
				pDbTemp[i] = pBits[i];
		}
	}
	
	// 進行小波變換(或反變換)
	if (!DWTStep_2D(m_pDbImage, nMaxWLevel-m_nDWTCurDepth, nMaxHLevel-m_nDWTCurDepth,
						nMaxWLevel, nMaxHLevel, nInv, 1, m_nSupp))
		return FALSE;

	// 如果是反變換,則當前層數減1
	if (nInv)
		m_nDWTCurDepth --;
	// 否則加1
	else
		m_nDWTCurDepth ++;

	// 然后,將數據拷貝回原CDib中,并進行相應的數據轉換
	int lfw = nWidth>>m_nDWTCurDepth, lfh = nHeight>>m_nDWTCurDepth;
	for (j=0; j<nHeight; j++)
	{
		pDbTemp = m_pDbImage + j*sizeImageSave.cx;
		pBits = pDib->m_lpImage + (nHeight-1-j)*sizeImageSave.cx;
		for (i=0; i<nWidth; i++)
		{
			if (j<lfh && i<lfw)
				pBits[i] = FloatToByte(pDbTemp[i]);
			else
				pBits[i] = BYTE(FloatToChar(pDbTemp[i]) ^ 0x80);			
		}
	}

	// 返回
	return TRUE;
}

void CImgProcessView::OnSpihtCode() 
{
	// TODO: Add your command handler code here
	// 獲得文檔類指針	
	CImgProcessDoc * pDoc = (CImgProcessDoc *)this->GetDocument();

	// 指向圖象的指針
	CDib * pDib = pDoc->m_pDibInit;

	int nWidth  = pDib->m_lpBMIH->biWidth;
	int nHeight = pDib->m_lpBMIH->biHeight;

	int i,j,*data;
	float bytecounts2;
	data=new int[nHeight*nWidth];
   	CSPIHTCoder SPIHTCoder;

	for (j=0; j<nHeight; j++)
		for (i=0; i<nWidth; i++)
			data[j*nHeight+i] = (int)m_pDbImage[j*nHeight+i];
	
	
    //開始計時
//	start = clock();
	 
	/*5/3提升小波變換*/
 //  IntDwt53.Dwt2D(data1, iheight,iwidth,level);
//	SPTransform.Dwt2D(data1, nHeight,nWidth,level);

	//計時開始
	start = clock();	
	/*spiht編碼*/
    SPIHTCoder.Losslessencode(data,nWidth,nHeight); 
	threshold2=SPIHTCoder.threshold;
    bytecounts2=SPIHTCoder.counts;

	//計時結束
	finish = clock();

	double  duration1;
	//計算編碼時間
    duration1 = (double)(finish - start)/CLOCKS_PER_SEC;

	float CR1;
	/*計算壓縮比*/
	CR1=float((nWidth*nHeight)/bytecounts2);
 		 
    //清除內存
 	delete []data;

	
	CString str1,str2;
	str1.Format("%f",duration1);
	str2.Format("%f",CR1);

    AfxMessageBox("編碼時間:"+str1+"s"+"\n壓縮比:"+str2);
    
}

void CImgProcessView::OnSpihtDecode() 
{
	// TODO: Add your command handler code here
	CImgProcessDoc * pDoc = (CImgProcessDoc *)this->GetDocument();

	// 指向圖象的指針
	CDib * pDib = pDoc->m_pDibInit;

	int nWidth  = pDib->m_lpBMIH->biWidth;
	int nHeight = pDib->m_lpBMIH->biHeight;

	int i,j,*data;
	
	data=new int[nHeight*nWidth];
   	CSPIHTCoder SPIHTCoder;
//	CString str;
//	lpDst1=lpSrc;
	      
	//計時開始
	start = clock();
    /*spiht解碼*/
    SPIHTCoder.Losslessdecoder(nWidth,nHeight,threshold2);  
	//計時結束
	finish = clock();

	double  duration1;
	//計算編碼時間
    duration1 = (double)(finish - start)/CLOCKS_PER_SEC;
	   

	/*獲取spiht解碼后的數據*/
	for(i=0;i<nHeight;i++)
	  for(j=0;j<nWidth;j++)
	      data[i*nWidth+j]=SPIHTCoder.MR->m[i][j];

    /*5/3提升小波反變換*/
  //  IntDwt53.IDwt2D(data1, iheight,iwidth,level);
   //   SPTransform.IDwt2D(data, iheight,iwidth,level);
	  FILE *fp;
	 fp = fopen("lenai1dwt.txt","w");
	 for(i=0;i<nHeight;i++)
	   for(j=0;j<nWidth;j++)
		   fprintf(fp,"%d ",data[i*nWidth+j]);
	   fclose(fp);

	 //解碼后數據賦值給m_pDbImage
	 for (i=0; i<nWidth; i++) 
	{
		for (j=0; j<nHeight; j++) 
		 {
			m_pDbImage[i*nWidth+j] = (double)data[i*nWidth+j];
		 }	
	}

    /*清除內存*/
 	delete []data;

	CString str1;
	str1.Format("%f",duration1);
	
    AfxMessageBox("解碼時間:"+str1+"s");
	
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
777a∨成人精品桃花网| 国产精品高潮呻吟| av在线播放一区二区三区| 美女视频第一区二区三区免费观看网站 | 国模少妇一区二区三区| 亚洲综合丝袜美腿| 亚洲激情综合网| 中文字幕一区二区三区四区| 亚洲国产精品精华液ab| 国产精品天美传媒| 中文字幕国产一区| 亚洲视频香蕉人妖| 亚洲精品久久7777| 亚洲在线观看免费| 舔着乳尖日韩一区| 美女视频第一区二区三区免费观看网站| 图片区日韩欧美亚洲| 奇米一区二区三区av| 国产一区二三区| 成人精品国产一区二区4080| 成人精品国产一区二区4080| 色哟哟日韩精品| 欧美久久免费观看| 久久久影院官网| 1024成人网| 日韩精品亚洲一区二区三区免费| 日本va欧美va瓶| 国产成a人亚洲精| 日本高清不卡在线观看| 欧美精品 国产精品| 精品国产乱码久久久久久老虎| 欧美国产综合色视频| 亚洲欧美日韩一区二区| 日韩精品成人一区二区在线| 紧缚奴在线一区二区三区| 国产精品白丝av| 欧美亚洲综合色| 欧美mv日韩mv| 欧美激情中文字幕一区二区| 久久久国产精华| 国产成人av一区二区| 国产在线不卡一区| 精品久久久久久久人人人人传媒| 色综合激情五月| 99riav久久精品riav| 欧美日韩美女一区二区| 久久精品亚洲国产奇米99| 亚洲激情五月婷婷| 国产一区二区三区久久悠悠色av | 91亚洲资源网| 日韩欧美国产系列| 亚洲免费在线看| 国产精品一区二区在线观看不卡| 色综合久久久网| 久久精品视频网| 亚洲国产成人porn| 亚洲黄色录像片| 亚洲国产电影在线观看| 天堂一区二区在线| 不卡一区二区中文字幕| 久久这里都是精品| 日本欧美一区二区三区| 不卡一卡二卡三乱码免费网站| 欧美一区二区三区小说| 亚洲欧美日韩中文字幕一区二区三区| 激情欧美一区二区| 6080国产精品一区二区| 亚洲国产婷婷综合在线精品| 99国产一区二区三精品乱码| 国产欧美一区二区在线观看| 看国产成人h片视频| 欧美日本不卡视频| 亚洲成人一区在线| 色综合久久久久网| 亚洲人成在线观看一区二区| 99久久伊人网影院| 国产精品久久久久久久久图文区| 国产一区在线观看视频| 精品国产一区二区亚洲人成毛片 | 亚洲视频一区在线| 成人激情校园春色| 中文字幕欧美日本乱码一线二线| 国产一区二区三区蝌蚪| 久久蜜桃av一区二区天堂| 国产在线精品一区二区不卡了 | 国产成人精品综合在线观看| 欧美精品一区二区三区蜜桃视频| 麻豆国产91在线播放| 欧美va天堂va视频va在线| 蜜桃免费网站一区二区三区| 欧美不卡一区二区三区四区| 国内精品在线播放| 国产日韩欧美亚洲| 91无套直看片红桃| 亚洲夂夂婷婷色拍ww47| 欧美日本在线观看| 蜜桃精品视频在线| 国产午夜亚洲精品不卡| 99视频在线精品| 亚洲国产一区二区三区青草影视| 欧美色图第一页| 毛片一区二区三区| 国产精品女人毛片| 欧美性xxxxx极品少妇| 青草av.久久免费一区| 久久久欧美精品sm网站| av资源网一区| 日韩va欧美va亚洲va久久| 精品国产一区二区三区忘忧草| 国产激情视频一区二区在线观看| 亚洲情趣在线观看| 日韩一区二区三区电影| 国产成人精品1024| 亚洲国产乱码最新视频 | 欧美aaaaa成人免费观看视频| 国产亚洲一二三区| 91国偷自产一区二区开放时间 | 亚洲日本电影在线| 欧美一区二区三区小说| www.亚洲国产| 午夜视频在线观看一区| 国产午夜一区二区三区| 91日韩在线专区| 亚洲一区二区综合| 椎名由奈av一区二区三区| 国产成人精品网址| 午夜久久久久久久久| 久久久久久久综合| 欧美日韩高清不卡| 国产99久久久国产精品免费看| 性感美女久久精品| 国产精品国产成人国产三级| 日韩精品一区二区在线| 欧日韩精品视频| 99久久国产综合精品麻豆| 美国av一区二区| 爽爽淫人综合网网站| 亚洲欧美综合色| 国产三级欧美三级日产三级99 | 色综合色综合色综合| 国产精品中文有码| 日韩av网站在线观看| 亚洲乱码国产乱码精品精98午夜| 国产日韩av一区二区| 日韩欧美一二三区| 欧美日韩国产大片| 在线免费不卡电影| 91日韩在线专区| 北条麻妃国产九九精品视频| 成人一区二区三区在线观看| 国内成人自拍视频| 国产一区二区免费在线| 日韩电影一二三区| 日本中文字幕一区| 日韩电影在线观看一区| 亚洲国产精品久久久久秋霞影院| 中文字幕一区二区三区精华液| 国产亚洲精品bt天堂精选| 久久久久久久久一| 国产欧美一区二区精品婷婷| 国产亚洲成aⅴ人片在线观看 | 久久久不卡影院| 久久婷婷色综合| 亚洲精品在线免费播放| 久久久久久久久久久久久久久99| 精品国产三级a在线观看| 日韩欧美精品在线| 26uuu欧美日本| 国产清纯在线一区二区www| 欧美国产国产综合| 中文字幕一区二区三区四区不卡| 国产精品久久久久影视| 一区二区三区在线视频播放| 亚洲国产视频一区二区| 琪琪久久久久日韩精品| 黄一区二区三区| 播五月开心婷婷综合| 色偷偷久久人人79超碰人人澡| 欧美吞精做爰啪啪高潮| 欧美成va人片在线观看| 国产精品视频线看| 亚洲男女一区二区三区| 午夜av电影一区| 国产二区国产一区在线观看| 91丝袜高跟美女视频| 欧美一区二区三区男人的天堂| 2021国产精品久久精品| 国产精品高潮呻吟| 天天操天天干天天综合网| 国产高清一区日本| 在线观看区一区二| 精品成人一区二区三区| 亚洲欧洲国产日韩| 日韩精彩视频在线观看| 国产高清久久久久| 欧美日韩一二区| 久久久精品国产免费观看同学| 一区二区高清在线| 国产精品小仙女| 91精品久久久久久久91蜜桃 |