老師讓做的第一個關於顯示圖像的程序。
什麼格式的圖像可以顯示?
有多少種方法?
每種方法的應用場合以及優劣?
從外部文件夾顯示和內部資源顯示?
顯示出圖像的大小是原圖大小還是可適應大小?
顯示圖像函數的內部原理?
以上是我能想到的這一個星期內要解決的問題。
事實上我遇到的第一個問題是什麼是真彩色啊256色啊128色啊。。。。。。
A1:一幅真彩色圖片,每一個像素都是用RGB三個字節表示的,每個字節有8位(適應計算機)表示RGB的256種亮度,所以這就是常說的24位真彩色,就特別真,涵蓋了全部的色彩16777216種,即真彩色圖像也叫16777216色圖像嘍。世界上的顏色遠不止這些,可是計算機最多的顏色也就這些,這也遠超過人類視覺能辨別的顏色了。看得出來這樣的真彩色圖像實在是太大了。所以一般所用的16色圖像啊,256色圖像啊都用到調色板的概念,很好的壓縮了。
A2:平時老是做的BMP文件格式,圖片的格式多種多樣,這裏也沒必要掌握吧,但是得搞清楚MFC中只有BMP格式的文件能顯示和處理嗎?爲什麼?
bmp格式的現在有很多種,有些MFC是識別不了的。這就尷尬了。
A3:顯示圖像的方法。
方法一:利用picture控件,無論是靜態還是動態吧,都是一個意思。這種方法得在資源中有BITMAP資源,所以也只能顯示bitmap類型的圖,picture控件本身成爲了一個圖片。動態只是動態加載了控件
方法二:從資源中裝入GDI位圖,或者是從磁盤中加載位圖,(其本質還是從DIB加載或是讀取過後來創建了GDI位圖)具體的顯示函數就是BitBlt函數和StretchBlt函數的應用
void CShowPicture2View::OnPicturethree()
{
// TODO: Add your command handler code here
//從資源中裝入DDB位圖
CDC * pDC = GetDC(); //獲取當前窗口的類對象指針
CBitmap bitmap; //CBitmap對象;
CDC dc; //CDC對象
bitmap.LoadBitmap(IDB_BITMAP2); //裝載資源
dc.CreateCompatibleDC(pDC); //創建內存設備環境
dc.SelectObject(&bitmap); //將位圖選入到設備環境中
pDC->BitBlt(0,0,699,600,&dc,0,0,SRCCOPY); //將內存設備複製到真正的設備環境中
}
方法三:
位圖是用來看的,Windows在視訊顯示器上或打印頁面上支持顯示DIB的兩個函數。這兩個函數稱爲SetDIBitsToDevice和StretchDIBits 。使用這兩個函數必須得很好的讀取位圖文件(詳見博客的讀取與寫入篇)每個函數都使用儲存在內存中的DIB並能顯示整個DIB或它的矩形部分。當使用SetDIBitsToDevice時,以圖素爲單位所顯示映像的大小與DIB的圖素大小相同。例如,一個640×480的DIB會佔據整個標準的VGA屏幕,但在300dpi的激光打印機上它只有約2.1×1.6英寸。StretchDIBits能延伸和縮小DIB尺寸的行和列從而在輸出設備上顯示一個特定的大小。參考《Windows程序設計》