軟件開發的共享空間

軟件開發的共享空間

電腦報遠程教育中心 唐明理

  筆者染指程序多年,與朋友交流編程心得、在網上漫遊搜尋編程資料、品味別人的共享模塊,確實收益匪淺。事實上共享軟件不僅僅存在於軟件的應用階段,在軟件的開發研製中我們早已感到了共享給軟件開發帶來的好處。

  微軟的Windows中給我們開放了成千上萬個功能函數、VC的MFC中的類庫可以讓我們在程序中輕鬆實現不少的功能;還有在網上你可以找到更多的第三方資源,控件、DLL、類庫和有關編程的好文章等等。雖然有些控件、DLL也需要少量的註冊費,但人們還是樂意接收它,畢竟少量的錢可以加快自己的項目開發進度。

  筆者在這裏給出一個基於VC-MFC的DLL庫和使用方法,同時杜撰一些使用這個DLL的編程思路。可能並沒有多高的技術含量,也算給新學編程的朋友們一個示範。這個DLL作爲共享資源,不含任何標誌,歡迎大家使用。

一、DDL的功能:

  一個基於VC-MFC的DLL庫 AVIDIB.DLL。內含以下功能函數:

A、位圖存取:
1.LPBITMAPINFOHEADER LoadBmp(CString fileName);
//調BMP圖形文件:輸入文件名,返回圖像數據區指針
2.LPBITMAPINFOHEADER LoadTml(CString fileName);
//調自定義壓縮圖形文件:輸入文件名,返回圖像數據區指針
3.void SaveBmp(CString fileName,LPBITMAPINFOHEADER bi1);
//存貯BMP圖形文件:輸入:1文件名,2圖像數據區指針
4.void SaveTml(CString fileName, LPBITMAPINFOHEADER bi1,
unsigned long mmio,);
//存貯自定義壓縮位圖文件:輸入: 1存貯文件名,2圖像數據區指針,3壓縮格式

B、屏幕拷貝
1.LPBITMAPINFOHEADER CopyScreen();
//屏幕拷貝,返回圖像數據區指針

C、將DIB位圖序列存爲AVI:
1.void AviFileOpen(LPCTSTR fileName,int Width,int Height ,
int ColorBits,int fps,unsigned long mmio);
//建立AVI文件:輸入:1文件名,2圖像寬,3圖像高,4顏色深度,5回放速度每秒幀數,6壓縮格式 (注:壓縮格式爲mmioFOURCC('t', 's', 'c', 'c')四字節表達式,mmio=0時爲選擇方式。)
2.BOOL AddFrame(DWORD mFrame,UCHAR *DataBuffer);
//向AVI中加入幀:輸入1序號,2圖像數據區指針
3.void AviFileClose();
//關閉建立的AVI文件
D、取AVI中的圖:
1. int AviOpen(CString fileName);
//打開AVI文件,返回AVI中的幀數
2. LPBITMAPINFOHEADER AviRead(int mFrame)
//取AVI文件的M幀,返回圖像數據區指針
3. void AviExit(); //關閉取圖AVI

二、應用思路:
  有點編程經歷的人已經看出這個DLL庫的用途了。它可以做什麼?下面筆者提出一些思路供大家參考。
  1、可以進行屏幕拷貝,並以BMP位圖方式保存,還可以用一些壓縮方式保存(800*600的一幅16位色位圖,選用適當的壓縮格式,可以壓縮到只有10多K),當然從DLL中看到,還可以直接將屏幕拷貝的圖形以AVI文件保存(也可以是壓縮的AVI)。這就是現在市面上共享抓圖軟件的基本功能。微軟曾經有一個叫作Microsoft Camcorder的屏幕拷貝程序,它的屏幕拷貝結果是一種特殊壓縮格式的AVI,很小。用這個DLL做出來的效果可以和它相當。
  2、可以在現有的AVI文件中取出任意幀作爲BMP(或壓縮)文件保存;也可以將一序列的BMP文件生成AVI文件。當然還可以選擇AVI的壓縮方式。例如可以生成現在大家熟悉的高壓縮比的MPG4格式的AVI文件。有了這些主要功能,不是可以做一個AVI文件編輯器了?如果你有興趣,你可以做一個將數碼圖像組成AVI的家庭版軟件。
  3、現在有的的教學軟件將屏幕的操作過程抓下來進行回放,但在AVI的畫面上疊加文字說明是一件麻煩的事情。用這個DLL的AVI單幀取圖的方法在AVI的回放中加文字說明就是一個簡單的事情了。
  4、有不少版本和格式的圖形資料閱讀工具深受人們的歡迎。你可以做一個播放屏幕操作過程的閱讀工具,配以各種計算機認證考試的資料,只要你能有幾篇做得好的教學輔導資料,相信這個閱讀工具是會被人們接收的。

  當然只要動腦筋,這個DLL提供的功能一定可以做很多事的(悄悄話:一個朋友看到這裏後說,他想搞一個後臺屏幕監視軟件,但一直嫌存貯量太大。現在可解決問題了。用一種專爲屏幕拷貝圖形壓縮的TSCC壓縮格式做的AVI文件;800*600的屏幕每秒存1幀,一分鐘才450Kb ,一小時27000Kb。一秒鐘就記錄別人一下屏幕情況,還有什麼看不到的?)。

  好,有了項目構思,有了關鍵模塊。你可以試着策劃你的項目了,別忘了一點,東西要做出來別人喜歡用,纔有效益可言。

三、用法簡介:

  下面介紹這個DLL的簡單用法。黑體字部分是要在你的源程序中加入的。注:這個DLL只能在VC中使用(VB、Delphi中使用的版本容以後提供)。
用VC建立一個對話框模式的工程,例如工程名爲Test。將筆者提供的三個文件avidib.dll、avidib.lib和avifile.h拷貝到你的工程目錄下。
1.在Test的頭文件CtestDlg.h中加入
#include "AviFile.h" //DLL的頭文件引用
#pragma comment(lib," avidib.lib") //DLL的連接庫引用
再加入公有類數據成員。
public:
CAviFile m_avi; //定義DLL的引用指針
2.在CtestDlg.cpp中加入一段自定義的顯示函數
LPBITMAPINFOHEADER buf; //定義全局的圖形指針變量
void CTestDlg::xianshi()
{ CClientDC dc(this);
if (buf==NULL) {return;} //沒有圖形返回
HDRAWDIB hdd = DrawDibOpen(); //打開DrawDib
if(!hdd) return; //失敗返回
DrawDibDraw(hdd,dc.m_hDC,10,10,
buf->biWidth, buf->biHeight,
buf,NULL,0,0, buf->biWidth, buf->biHeight,0);
//在當前窗口的x=10,y=10處顯示圖形
DrawDibClose(hdd); //關閉DrawDib
}
不要忘記在頭文件中定義這個函數。
下面我們就可以使用DLL庫中的功能函數了。

A、屏幕拷貝:
1)拷貝一屏在當前目錄下存爲BMP文件
buf =m_avi.CopyScreen(); //拷貝一幀
m_avi.SaveBmp("test.bmp", buf); //存爲BMP文件
2)拷貝一屏在當前目錄下存爲壓縮圖形文件
bi1=m_avi.CopyScreen();
m_avi.SaveTml("test.tml", buf, //拷貝一幀
mmioFOURCC('d', 'i', 'v', '3'));
//存爲mpg4格式壓縮文件
注1:在Windows目錄下的system.ini文件[drivers32]項中可以看到你的系統已安裝的各種視頻壓縮格式的四字節描述方法。這裏選用的壓縮格式是mpg4。
VIDC.MRLE=msrle32.dll //這是微軟的8位色壓縮
vidc.MSVC=msvidc32.dll //這是微軟的16位色以上的壓縮
vidc.DIV3=DIVXc32.dll //這就是常見的mpg4
vidc.DIV4=DIVXc32f.dll //用於快速畫面的mpg4
VIDC.MJPG=Pvmjpg20.dll //這是一個jpg的壓縮
VIDC.I263=C:/WINDOWS/SYSTEM/i263_32.drv
………
注2:壓縮圖形文件爲筆者自定義的格式,文件後綴必爲tml.
3)一秒鐘拷貝一屏,連續拷貝20屏,存爲mpg4格式的AVI文件
bi1=m_avi.CopyScreen();//先拷貝一幀,取得當前屏幕的數據
m_avi.AviFileOpen("test.avi", //在當前目錄建立AVI文件
buf ->biWidth, //圖寬
buf ->biHeight, //圖高
buf ->biBitCount,//圖色
1, //幀/秒
mmioFOURCC('d', 'i', 'v', '3'));
for(int i=0;i<20;i++) //循環20次
{ buf =m_avi.CopyScreen();//抓屏,返回圖形指針
UCHAR *tmp;
tmp=(UCHAR *) buf +40; //數據前移40字節
m_avi.AddFrame(j,tmp); //將本幀圖形加入AVI
Sleep(1000); //延時1秒
}
m_avi.AviFileClose(); //完畢,關閉新建的AVI
B、調入文件顯示:
1) 調入壓縮圖形並顯示
buf =m_avi.LoadTml("test.tml");//在當前目錄調入壓縮文件,
//返回圖形指針
xianshi(); //調自己定義顯示
2)調入AVI文件並顯示
int len0=m_avi.AviOpen("test.avi");//在當前目錄打開AVI
//文件,返回幀數
for(int i=0;i<len0;i++)
{ buf= m_avi.AviRead(i); //讀取一幀
xianshi(); //顯示
}
m_avi.AviExit(); //完畢,關閉

注:無論壓縮與否的圖形和取出的AVI圖形,返回的圖形數據是解壓的與設備無關的DIB圖形格式,你也可以用其它的方式在窗口上顯示這些圖形。

四、獲取本文的相關資料:

  本文的三個文件:avidib.dll、avidib.lib、avifile.h
  歡迎大家下載:圖形存貯.zip
  歡迎交流,作者信箱:[email protected]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章