壓縮文件的基本原理是查找文件內的重復位元組,並建立一個相同位元組的"詞典"文件,並用一個代碼表示,比如在文件里有幾處有一個相同的詞"中華人民共和國"用一個代碼表示並寫入"詞典"文件,這樣就可以達到縮小文件的目的.
由於計算機處理的信息是以二進制數的形式表示的,因此壓縮軟體就是把二進制信息中相同的字元串以特殊字元標記來達到壓縮的目的。為了有助於理解文件壓縮,請您在腦海里想像一幅藍天白雲的圖片。對於成千上萬單調重復的藍色像點而言,與其一個一個定義「藍、藍、藍……」長長的一串顏色,還不如告訴電腦:「從這個位置開始存儲1117個藍色像點」來得簡潔,而且還能大大節約存儲空間。這是一個非常簡單的圖像壓縮的例子。其實,所有的計算機文件歸根結底都是以「1」和「0」的形式存儲的,和藍色像點一樣,只要通過合理的數學計算公式,文件的體積都能夠被大大壓縮以達到「數據無損稠密」的效果。總的來說,壓縮可以分為有損和無損壓縮兩種。如果丟失個別的數據不會造成太大的影響,這時忽略它們是個好主意,這就是有損壓縮。有損壓縮廣泛應用於動畫、聲音和圖像文件中,典型的代表就是影碟文件格式mpeg、音樂文件格式mp3和圖像文件格式jpg。但是更多情況下壓縮數據必須准確無誤,人們便設計出了無損壓縮格式,比如常見的zip、rar等。壓縮軟體(compression software)自然就是利用壓縮原理壓縮數據的工具,壓縮後所生成的文件稱為壓縮包(archive),體積只有原來的幾分之一甚至更小。當然,壓縮包已經是另一種文件格式了,如果你想使用其中的數據,首先得用壓縮軟體把數據還原,這個過程稱作解壓縮。常見的壓縮軟體有winzip、winrar等。
有兩種形式的重復存在於計算機數據中,zip就是對這兩種重復進行了壓縮。
一種是短語形式的重復,即三個位元組以上的重復,對於這種重復,zip用兩個數字:1.重復位置距當前壓縮位置的距離;2.重復的長度,來表示這個重復,假設這兩個數字各佔一個位元組,於是數據便得到了壓縮,這很容易理解。
一個位元組有 0 - 255 共 256 種可能的取值,三個位元組有 256 * 256 * 256 共一千六百多萬種可能的情況,更長的短語取值的可能情況以指數方式增長,出現重復的概率似乎極低,實則不然,各種類型的數據都有出現重復的傾向,一篇論文中,為數不多的術語傾向於重復出現;一篇小說,人名和地名會重復出現;一張上下漸變的背景圖片,水平方向上的像素會重復出現;程序的源文件中,語法關鍵字會重復出現(我們寫程序時,多少次前後、paste?),以幾十 K 為單位的非壓縮格式的數據中,傾向於大量出現短語式的重復。經過上面提到的方式進行壓縮後,短語式重復的傾向被完全破壞,所以在壓縮的結果上進行第二次短語式壓縮一般是沒有效果的。
第二種重復為單位元組的重復,一個位元組只有256種可能的取值,所以這種重復是必然的。其中,某些位元組出現次數可能較多,另一些則較少,在統計上有分布不均勻的傾向,這是容易理解的,比如一個 ASCII 文本文件中,某些符號可能很少用到,而字母和數字則使用較多,各字母的使用頻率也是不一樣的,據說字母 e 的使用概率最高;許多圖片呈現深色調或淺色調,深色(或淺色)的像素使用較多(這里順便提一下:png 圖片格式是一種無損壓縮,其核心演算法就是 zip 演算法,它和 zip 格式的文件的主要區別在於:作為一種圖片格式,它在文件頭處存放了圖片的大小、使用的顏色數等信息);上面提到的短語式壓縮的結果也有這種傾向:重復傾向於出現在離當前壓縮位置較近的地方,重復長度傾向於比較短(20位元組以內)。這樣,就有了壓縮的可能:給 256 種位元組取值重新編碼,使出現較多的位元組使用較短的編碼,出現較少的位元組使用較長的編碼,這樣一來,變短的位元組相對於變長的位元組更多,文件的總長度就會減少,並且,位元組使用比例越不均勻,壓縮比例就越大。
Ⅱ 如何減小MFC程序
要用MFC只能如此,除非你不用。
不過用MFC也不至於有2M吧,除非是DEBUG版,Release版一般的小程序都在100k以下。
另外在vc里有優化選項,你可以選擇優化速度,也可以選擇優化程序大小,選擇優化大小看情況,大概還可以減少幾k的量。
-----
滑鼠右鍵點擊工具欄,選擇「build」或「組建」
Ⅲ mfc怎麼做錄音程序
MFC多媒體開發
======================
高層音頻介面:播放聲音資源/文件
調用MCI::Media Control Interface 和Api::MessageBeep,sndPlaySound,PlaySound
底層音頻介面:數據採集
開發一般步驟:
檢測音頻設備->打開驅動程序->分配緩沖區->管理緩沖區->操作音頻數據->釋放緩沖區->關閉驅動程序.
SDK參考::ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.WIN32COM.v10.en/multimed/htm/_win32_multimedia_functions.htm
多媒體控制兩種方式可選:調API,執行命令.
MCI命令結構:
系統命令:直接由MCI解析,並由系統處理,與設備無關
通用命令:由設備驅動處理
可選命令:
擴展命令:
常用MCI命令:
MCI_OPEN,MCI_PLAY,MCI_RECORD,MCI_STATUS,MCI_SET,時間操作宏命令.
--------------------------------------------------------
視頻開發:
Microsoft基於視頻軟體工作平台 VFW(Video For Windows,Avi標准),六個DLL
AVICAP.DLL,::視頻採集函數
MSVIDEO.DLL,DrawLib函數,回放用
MCIAVI.DRV.MCI命令解析
AVIFILE.DLL,支持從標准IO訪問AVI文件.
VCM,包含視頻壓縮/解碼工具(CODEC)
ACM,針對AVI提供視頻壓縮/解碼
MSDN::ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.WIN32COM.v10.en/multimed/htm/_win32_video_for_windows.htm
視頻媒體:圖像,數字視頻,
使用AVIFile操作 AVI文件步驟:
初始化AviFileInit->打開文件AviFileOpen->取文件信息AviFileInfo->打開數據流AviFileGetStream->獲取數據流信息AviFileStreamInfo->操作數據流AviStream::Read,Write,ReadFormat,SetFormat等->關閉文件AviFileRelease->釋放 AviFileExit;
AVI視頻採集:AVICap:
MSDN::ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.WIN32COM.v10.en/multimed/htm/_win32_video_capture.htm
AVI視頻播放:DrawDib
MSDN::ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.WIN32COM.v10.en/multimed/htm/_win32_drawdib.htm
AVI視頻編解碼:VCM::Video Compression Manager
MSDN::ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.WIN32COM.v10.en/multimed/htm/_win32_video_compression_manager.htm
播放工具:ActiveMovie控制項.
應用示例::MSDN::ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.chs/dv_vcsample/html/dade0c5d-ddc8-4ceb-8a15-e58efd37af3e.htm
追問:
關於錄音頻的函數有哪些呢?謝謝
回答:
不好意思,有一個重要的函數沒有列出,添加如下:
=====================================================
MCIERROR mciSendCommand(MCIDEVICEID wDeviceID, UINT uMsg, DWord dwFlags, DWORD dwParam);
第一個參數指定了設備標識,這個標識會在程序員打開MCI設備時由系統提供。第二個參數指定將如何控制設備,見後面MCI指令清單,其中有有關錄音的指令。第三個參數為訪問標識,第四個參數一般是一個數據結構,標識程序在訪問MCI時要的一些信息。
MCI的設備類型:
設備描述 描述字元串 說明
MCI_ALL_DEVICE_ID 所有設備
MCI_DEVTYPE_ANIMATION Animation 動畫設備
MCI_DEVTYPE_CD_AUDIO Cdaudio CD音頻
MCI_DEVTYPE_DAT Dat 數字音頻
MCI_DEVTYPE_DIGITAL_VIDEO Digitalvideo 數字視頻
MCI_DEVTYPE_OTHER Other 未定義設備
MCI_DEVTYPE_OVERLAY Overlay 重疊視頻
MCI_DEVTYPE_SCANNER Scanner 掃描儀
MCI_DEVTYPE_SEQUENCER Sequencer MIDI 序列器
MCI_DEVTYPE_VCR Vcr 合式錄像機
MCI_DEVTYPE_VIDEODISC Videodisc 激光視盤
MCI_DEVTYPE_WAVEFORM_AUDIO waveaudio Wave 音頻
MCI指令
MCI_BREAK設置中斷鍵,預設是」CTRL+BREAK"
MCI_CAPTURE抓取當前幀並存入指定文件,僅用於數字視頻
MCI_CLOSE關閉設備
MCI_CONFIGURE彈出配置對話框,僅用於數字視頻
MCI_COPY拷貝數據至剪貼板
MCI_CUE延時播放或錄音
MCI_CUT刪除數據
MCI_DELETE刪除數據
MCI_ESCAPE僅用於激光視頻
MCI_FREEZE將顯示定格
MCI_GETDEVCAPS獲取設備信息
MCI_INDEX當前屏幕顯示與否,僅用於VCR設備
MCI_INFO獲取字元串信息
MCI_LIST獲取輸入設備數量,支持數字視頻和VCR設備
MCI_LOAD裝入一個文件
MCI_MARK取消或做一個記號,與MCI_SEEK配套
MCI_MARK取消或做一個記號,與MCI_SEEK配套
MCI_MONITOR為數字視頻指定報告設備
MCI_OPEN打開設備
MCI_PASTE粘帖數據
MCI_PAUSE暫停當前動作
MCI_PLAY播放
MCI_PUT設置源、目的和邊框矩形
MCI_QUALITY定義設備預設質量
MCI_RECORD開始錄制
MCI_RESERVE分配硬碟空間
MCI_RESTORE拷貝一個bmp文件至幀緩沖
MCI_RESUME使一個暫停設備重新啟動
MCI_SAVE保存數據
MCI_SEEK更改媒體位置
MCI_SET設置設備信息
MCI_SETAUDIO設置音量
MCI_SETTIMECODE啟用或取消VCR設備的時間碼
MCI_SETTUNER設置VCR設備頻道
MCI_SETVIDEO設置video參數
MCI_SIGNAL在工作區上設置指定空間
MCI_STATUS獲取設備信息
MCI_STEP使播放設備跳幀
MCI_STOP停止播放
MCI_SYSINFO返回MCI設備信息
MCI_UNDO取消操作
MCI_UNFREEZE使使用MCI_UNFREEZE的視頻緩沖區恢復運動
MCI_UPDATE更新顯示區域
MCI_WHERE獲取設備裁減矩形
MCI_WINDOW指定圖形設備窗口和窗口特性
其中比較常用的指令有MCI_OPEN、MCI_RECORD、MCI_CLOSE、MCI_PLAY、MCI_STOP、MCI_PAUSE、MCI_STATUS等等。
舉例:
//關閉一個MCI設備
mciSendCommand(DeviceID, MCI_CLOSE, NULL, NULL);
//打開CD播放器
MCI_OPEN_PARMS mciOpen;
mciOpen.lpstrDeviceType = (LPSTR)MCI_DEVTYPE_CD_AUDIO ;
mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_TYPE | MCI_OPEN_TYPE_ID, (DWORD)&mciOpen);
Ⅳ 畢業設計的課題是《壓縮與解壓縮的軟體實現》 想用C++做,求高手指導啊!!
請問你的畢設做好了嗎?問題解決了嗎?
Ⅳ VC MFC 想用bzip2 來解壓文件流
首先,如果你的開發環境是vs2005以上,就可以使用c#裡面的類了。要在項目設置里設置一下。
當然,要解壓,有很多庫可以使用。例如zlib這個庫。
Ⅵ 霍夫曼 解壓縮
哈夫曼編碼(Huffman Coding)是一種編碼方式,以哈夫曼樹—即最優二叉樹,帶權路徑長度最小的二叉樹,經常應用於數據壓縮。 在計算機信息處理中,「哈夫曼編碼」是一種一致性編碼法(又稱"熵編碼法"),用於數據的無損耗壓縮。這一術語是指使用一張特殊的編碼表將源字元(例如某文件中的一個符號)進行編碼。這張編碼表的特殊之處在於,它是根據每一個源字元出現的估算概率而建立起來的(出現概率高的字元使用較短的編碼,反之出現概率低的則使用較長的編碼,這便使編碼之後的字元串的平均期望長度降低,從而達到無損壓縮數據的目的)。這種方法是由David.A.Huffman發展起來的。 例如,在英文中,e的出現概率很高,而z的出現概率則最低。當利用哈夫曼編碼對一篇英文進行壓縮時,e極有可能用一個位(bit)來表示,而z則可能花去25個位(不是26)。用普通的表示方法時,每個英文字母均佔用一個位元組(byte),即8個位。二者相比,e使用了一般編碼的1/8的長度,z則使用了3倍多。倘若我們能實現對於英文中各個字母出現概率的較准確的估算,就可以大幅度提高無損壓縮的比例。
本文描述在網上能夠找到的最簡單,最快速的哈夫曼編碼。本方法不使用任何擴展動態庫,比如STL或者組件。只使用簡單的C函數,比如:memset,memmove,qsort,malloc,realloc和memcpy。
因此,大家都會發現,理解甚至修改這個編碼都是很容易的。
背景
哈夫曼壓縮是個無損的壓縮演算法,一般用來壓縮文本和程序文件。哈夫曼壓縮屬於可變代碼長度演算法一族。意思是個體符號(例如,文本文件中的字元)用一個特定長度的位序列替代。因此,在文件中出現頻率高的符號,使用短的位序列,而那些很少出現的符號,則用較長的位序列。
編碼使用
我用簡單的C函數寫這個編碼是為了讓它在任何地方使用都會比較方便。你可以將他們放到類中,或者直接使用這個函數。並且我使用了簡單的格式,僅僅輸入輸出緩沖區,而不象其它文章中那樣,輸入輸出文件。
bool CompressHuffman(BYTE *pSrc, int nSrcLen, BYTE *&pDes, int &nDesLen);
bool DecompressHuffman(BYTE *pSrc, int nSrcLen, BYTE *&pDes, int &nDesLen);
要點說明
速度
為了讓它(huffman.cpp)快速運行,我花了很長時間。同時,我沒有使用任何動態庫,比如STL或者MFC。它壓縮1M數據少於100ms(P3處理器,主頻1G)。
壓縮
壓縮代碼非常簡單,首先用ASCII值初始化511個哈夫曼節點:
CHuffmanNode nodes[511];
for(int nCount = 0; nCount < 256; nCount++)
nodes[nCount].byAscii = nCount;
然後,計算在輸入緩沖區數據中,每個ASCII碼出現的頻率:
for(nCount = 0; nCount < nSrcLen; nCount++)
nodes[pSrc[nCount]].nFrequency++;
然後,根據頻率進行排序:
qsort(nodes, 256, sizeof(CHuffmanNode), frequencyCompare);
現在,構造哈夫曼樹,獲取每個ASCII碼對應的位序列:
int nNodeCount = GetHuffmanTree(nodes);
構造哈夫曼樹非常簡單,將所有的節點放到一個隊列中,用一個節點替換兩個頻率最低的節點,新節點的頻率就是這兩個節點的頻率之和。這樣,新節點就是兩個被替換節點的父節點了。如此循環,直到隊列中只剩一個節點(樹根)。
// parent node
pNode = &nodes[nParentNode++];
// pop first child
pNode->pLeft = PopNode(pNodes, nBackNode--, false);
// pop second child
pNode->pRight = PopNode(pNodes, nBackNode--, true);
// adjust parent of the two poped nodes
pNode->pLeft->pParent = pNode->pRight->pParent = pNode;
// adjust parent frequency
pNode->nFrequency = pNode->pLeft->nFrequency + pNode->pRight->nFrequency;
這里我用了一個好的訣竅來避免使用任何隊列組件。我先前就直到ASCII碼只有256個,但我分配了511個(CHuffmanNode nodes[511]),前255個記錄ASCII碼,而用後255個記錄哈夫曼樹中的父節點。並且在構造樹的時候只使用一個指針數組(ChuffmanNode *pNodes[256])來指向這些節點。同樣使用兩個變數來操作隊列索引(int nParentNode = nNodeCount;nBackNode = nNodeCount –1)。
接著,壓縮的最後一步是將每個ASCII編碼寫入輸出緩沖區中:
int nDesIndex = 0;
// loop to write codes
for(nCount = 0; nCount < nSrcLen; nCount++)
{
*(DWORD*)(pDesPtr+(nDesIndex>>3)) |=
nodes[pSrc[nCount]].dwCode << (nDesIndex&7);
nDesIndex += nodes[pSrc[nCount]].nCodeLength;
}
(nDesIndex>>3): >>3 以8位為界限右移後到達右邊位元組的前面
(nDesIndex&7): &7 得到最高位.
注意:在壓縮緩沖區中,我們必須保存哈夫曼樹的節點以及位序列,這樣我們才能在解壓縮時重新構造哈夫曼樹(只需保存ASCII值和對應的位序列)。
解壓縮
解壓縮比構造哈夫曼樹要簡單的多,將輸入緩沖區中的每個編碼用對應的ASCII碼逐個替換就可以了。只要記住,這里的輸入緩沖區是一個包含每個ASCII值的編碼的位流。因此,為了用ASCII值替換編碼,我們必須用位流搜索哈夫曼樹,直到發現一個葉節點,然後將它的ASCII值添加到輸出緩沖區中:
int nDesIndex = 0;
DWORD nCode;
while(nDesIndex < nDesLen)
{
nCode = (*(DWORD*)(pSrc+(nSrcIndex>>3)))>>(nSrcIndex&7);
pNode = pRoot;
while(pNode->pLeft)
{
pNode = (nCode&1) ? pNode->pRight : pNode->pLeft;
nCode >>= 1;
nSrcIndex++;
}
pDes[nDesIndex++] = pNode->byAscii;
}
Ⅶ mfc有沒有可以解壓縮 播放媒體的類啊。
DirectShow
Ⅷ 在mfc工程中我先將壓縮文件解壓,然後想使用解壓縮後的.txt文件,但遍歷時因為前面解壓縮佔用導致打不開
什麼樣的壓縮文件?怎麼樣解壓的?
Ⅸ mfc使用windows media player控制項如何支持多種視頻格式的播放
WMP是Windows自帶的播放器。MFC中這個插件是調用Windows中的WMP,而不是包含了WMP全套的代碼。
我們可以給電腦增加視頻格式編碼來讓它播放更多的視頻格式,但是這個軟體在另一台沒有自己加裝視頻格式的電腦上,還是和現在一樣。
可以下載格式工廠,這個用著不錯。
Ⅹ 想用mfc做一個視頻播放器
1.首先要對mfc比較了解,如果你做播放器,將來會涉及很多關於滑鼠消息處理的函數,在一開始的 時候做好准備.我去年做播放器其他技術都沒怎麼難我,就是界面消息的處理搞得很亂.
2.看你是想省力氣還是費力氣了,如果省勁的話,直接上網找些開源的編碼解析包,或者自己水平比較高的話就自己參考DirectShow的api自己寫各種視頻格式的解析包,不過會累死的,我光學習mpeg2就花了將近兩個月時間,如果你想要支持很多格式,最好不要自己寫解析庫,上網搜開源的拿來用,發現其中有哪幾種文件格式打開效果或者速度實在太差勁的話你再自己寫.
3.具體寫程序的建議: 最好一開始只寫一種格式,等到自己水平確實上來了再寫多種格式,最後把這些格式整合到一個程序裡面.其實很簡單,無非是加上一些判斷或者switch,但是你要對mfc的消息機制有比較深入的了解