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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? vc中實現(xiàn)多格式圖像的靈活轉(zhuǎn)換.txt

?? vc學(xué)習(xí)記錄
?? TXT
字號:
色彩鮮艷漂亮的高品質(zhì)圖像,一個個形象的Windows圖標(biāo),高速運動、活靈活現(xiàn)的三維
動畫,這些生動的圖形無一不顯示著程序設(shè)計者的藝術(shù)才華。在程序設(shè)計中,圖像處理
已經(jīng)成了每個程序員的必修課,所以,對于每個程序員來說,熟悉“BMP”、“GIF”、
“JPEG”圖像格式及具體應(yīng)用、調(diào)色板、圖像文件頭格式、圖像壓縮算法等概念似乎已
經(jīng)成了工作中不可缺少的基礎(chǔ)知識。面對如此多的圖像格式,如果要全部掌握其具體細(xì)
節(jié),好像這對程序員有些不公。在VC中編程顯示一幅位圖,下列的步驟是不可少的:裝
入位圖、獲得位圖的大小信息、啟用設(shè)備環(huán)境、位傳輸,所需的程序代碼顯得千篇一律
的冗長。如果想要裝入的位圖另存為其他格式的圖像文件……?兩個字:頭疼!而這一
切都是因為GDI本身的局限性所造成。
隨著Windows 2000的推出,上面的情況有了大大的改觀:你可以不必了解每種圖像格式
的具體含義,照樣可以寫出多格式圖像瀏覽或轉(zhuǎn)換程序,這一切,全部都依賴于Window
s 2000及后繼版中所使用的GDI+技術(shù)。首先來看看GDI+的具體技術(shù)細(xì)節(jié)及GDI+編程
特點。
Windows 2000在用戶界面方面包括了幾個重大的改進,可能你已經(jīng)注意到了有陰影的鼠
標(biāo)、漸入的工具條快速提示、透明的窗口、平滑地窗口變化等。Windows 2000在界面上
之所以有這么大的改進,完全是因為Windows2000采用了一種GDI(graphics device in
terface :圖形設(shè)備接口)。這種GDI,以前叫GDI2k,現(xiàn)在有了一個更好聽的名字:GD
I+。GDI+是一種新型的圖形設(shè)備接口,它的主要特點在于它能夠創(chuàng)建全新的用戶桌面
體系、能夠輕易地完成二維或三維的圖形處理,為桌面帶來一種數(shù)字化的圖片。 GDI+ 
同時也提供了增強的圖形處理技術(shù),如常見的:alpha blending、 紋理、貼圖、增強的
文本及圖片顯示技術(shù)。實際上,GDI+主要的特色就在于強調(diào)通過硬件加速來達到良好的
視覺感受!
同傳統(tǒng)的GDI不同,GDI+中引入了對COM(組件對象模型)技術(shù)的支持,通過COM技術(shù),
GDI+簡化了對圖像文件的訪問(打開、保存)程序:通過調(diào)用COM組件來實現(xiàn)的,GDI+
扮演的只是指揮者,而非操作員。對于圖像文件,GDI+所關(guān)心的不是圖像文件的文件頭
信息,不論欲打開的文件格式是什么類型,GDI+首先要做的是在注冊中查看該圖像格式
的編碼(或解碼)信息是否已經(jīng)注冊(HKEY_CLASSES_ROOT\MIME\Database\Content Ty
pe),如果已經(jīng)注冊,就通過該編碼信息調(diào)用COM組件,就這么簡單。這種技術(shù)其實早就
在微軟的其他軟件中已經(jīng)使用了,如IE。“體驗”過NIMDA病毒的朋友可能對“audio/w
av”這段代碼并不陌生,NIMDA就是靠它來偽裝自己的:讓IE認(rèn)為附件是WAV文件而自動
打開可執(zhí)行程序。這其實也是IE使用COM技術(shù)的一個突出表現(xiàn)。
配合GDI+的推出,微軟也同時發(fā)布了相應(yīng)的SDK,如果你已經(jīng)安裝了最新的Microsoft 
PlatForm SDK或已經(jīng)開始使用VS .NET,GDI+ SDK已經(jīng)在你的系統(tǒng)中了。如果沒有的話
,可以到http://noner.top263.net/progtool上去下載GDI+的頭文件和庫文件。在使用
GDI+之后,, 再有沒有必要去考慮什么句柄、設(shè)備環(huán)境這樣的概念了。你只需要簡單地
創(chuàng)建一個圖形對象(Graphics object),然后直接調(diào)用該對象的方法(methods)進行
繪圖即可。圖形對象是GDI+中核心,正如DC之于GDI那樣。圖形對象和DC有許多相似的
地方,在使用上遵循著相同的使用規(guī)則,但是兩者在本質(zhì)上已經(jīng)有很大的區(qū)別。一個是
基于句柄的GDI,一個是基于組件對象模型的GDI+。使用GDI+的SDK編程,必須得按照下
面的規(guī)范來進行:使用GDI+的名空間(namespace Gdiplus)、在使用GDI+函數(shù)時必須
進行GDI+的初始化,使用完畢之后也得銷毀GDI+,這種規(guī)范在下面所列的程序中有詳
細(xì)的說明。
前面說到了GDI+是通過在注冊中查看編碼信息來訪問圖像文件的,在GDI+的SDK中,編
碼信息是儲存在 ImageCodecInfo類中的,在這個類中,有編碼的CLSID(COM組件的GUI
D標(biāo)識碼)、編碼方式描述等。在GDI中,在注冊表中訪問編碼信息通常使用以下兩個函
數(shù)來實現(xiàn):
1、查看系統(tǒng)中可用的圖像編碼信息(數(shù)量及大小)
Status GetImageEncodersSize(
UINT* numEncoders, //存儲編碼器數(shù)量的地址
UINT* size //存儲編碼信息所需內(nèi)存大小
);
2、得到所有的編碼信息
Status GetImageEncoders(
UINT numEncoders,//可用編碼器數(shù)量
UINT size,//儲存編碼器信息所需內(nèi)存(由ImageCodecInfo類組成的數(shù)組的大小)
ImageCodecInfo* encoders//編碼器信息指針
);
在GetImageEncoders函數(shù)中,參數(shù)numEncoders和size都是由GetImageEncodersSize所返
回的。下面的代碼就能夠在注冊表中查找具體格式圖像的編碼方式:
int GetImageCLSID(const WCHAR* format, CLSID* pCLSID)
{//得到格式為format的圖像文件的編碼值,訪問該格式圖像的COM組件的
//GUID值保存在pCLSID中
UINT num = 0;
UINT size = 0;
ImageCodecInfo* pImageCodecInfo = NULL;
GetImageEncodersSize(&num, &size);
if(size == 0)
return FALSE; // 編碼信息不可用
//分配內(nèi)存
pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
if(pImageCodecInfo == NULL)
return FALSE; // 分配失敗
//獲得系統(tǒng)中可用的編碼方式的所有信息
GetImageEncoders(num, size, pImageCodecInfo);
//在可用編碼信息中查找format格式是否被支持
for(UINT i = 0; i < num; ++i)
{ //MimeType:編碼方式的具體描述
if( wcscmp(pImageCodecInfo[i].MimeType, format) == 0 )
{
*pCLSID = pImageCodecInfo[i].Clsid;
free(pImageCodecInfo);
return TRUE;
}
}
free(pImageCodecInfo);
return FALSE;
}
有了這種認(rèn)識,實現(xiàn)多格式的圖像的瀏覽與轉(zhuǎn)換就并不是什么難事了。為了講述的方便
,首先在VC中建立一個SDI項目ImageShow,首先對使用GDI+申明和初始化及銷毀進行代
碼編制,具體代碼如下:
#include "Gdiplus.h"
using namespace Gdiplus;
CImageShowView::CImageShowView()
{
//初始化GDI+
GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
}
CImageShowView::~CImageShowView()
{
//銷毀GDI+
ULONG_PTR gdiplusToken;
GdiplusShutdown(gdiplusToken);
}
接著通過類向?qū)?Class Wizard),重載“文件”菜單中的“打開”和“另存為”兩項,
為了編程的簡單,本程序只將當(dāng)前打開的圖像文件直接存為BMP文件(實際上保存成其他
格式的文件也很簡單,只不過是對文件名進行分析而已)。另外,為了在打開和保存文
件進行文件名的傳遞,首先應(yīng)在CImageShowView類中加入一全局變量“CString strOpe
nFileName”。“打開”和“另存為”兩項的響應(yīng)代碼如下,大家通過代碼中的注釋部份
理解編程思路,應(yīng)該不會有什么問題:
WCHAR* ToWChar(char * str)
{
//在GDI+中,有關(guān)字符的參數(shù)類型全部都是WCHAR類型的
//該函數(shù)是將傳統(tǒng)字符串進行轉(zhuǎn)換
static WCHAR buffer[1024];
wcsset(buffer,0);
MultiByteToWideChar(CP_ACP,0,str,strlen(str),buffer,1024);
return buffer;
}
void CImageShowView::OnFileOpen()
{
//本程序能夠打開各類常見格式的圖像文件
static char szFilter[]="常見格式圖形文件(*.*)|*.*|";
CFileDialog dlgChoseImage(1,NULL,NULL,NULL,szFilter);
if(dlgChoseImage.DoModal()==IDOK)
{
strOpenFileName=dlgChoseImage.GetPathName();
//打開文件后立即在窗口中顯示(重繪客戶窗口)
this->Invalidate();
}
}
void CImageShowView::OnFileSaveAs()
{
if(strOpenFileName.IsEmpty())
{
AfxMessageBox("當(dāng)前沒有打開圖像文件,不能進行保存!");
return;
}
//建立圖形對像
Graphics graphics(GetDC()->m_hDC);
//裝入當(dāng)前已經(jīng)打開的圖形文件
Image image(ToWChar(strOpenFileName.GetBuffer(strOpenFileName.GetLength())))
;
CString strFileSave;
//當(dāng)其他格式的圖像全部另存為BMP文件
static char szFilter[]="位圖(*.BMP)|*.BMP|";
CFileDialog dlgChoseImage(0,"BMP",NULL,NULL,szFilter);
if(dlgChoseImage.DoModal()==IDOK)
{
strFileSave=dlgChoseImage.GetPathName();
CLSID clsid;
if(GetImageCLSID(L"image/bmp", &clsid))
{
image.Save(ToWChar(strFileSave.GetBuffer(strFileSave.GetLength())), &clsid, 
NULL);
//將保存后的圖像進行顯示
strOpenFileName=strFileSave;
this->Invalidate();
}
}
}
最后,為了顯示瀏覽圖像轉(zhuǎn)換前后的效果,還應(yīng)該在窗口中分另繪制轉(zhuǎn)換前后的圖像,
這很容易,只需要在OnDraw函數(shù)中添加繪制代碼,如下所述:
void CImageShowView::OnDraw(CDC* pDC)
{
CImageShowDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
//如果沒有選擇顯示圖形文件,則不用重繪
if(strOpenFileName.IsEmpty())
return;
//顯示當(dāng)前打開的圖像文件的全名
this->GetParent()->SetWindowText(strOpenFileName);
//建立圖形對象
Graphics graphics(pDC->m_hDC);
//裝入圖形文件
Image image(ToWChar(strOpenFileName.GetBuffer(strOpenFileName.GetLength())))
;
Point destPoints[3] =
{
Point(0, 0),
Point(image.GetWidth(), 0),
Point(0, image.GetHeight())
};
Point* pdestPoints = destPoints;
//在指定區(qū)域pdestPoints顯示圖像
graphics.DrawImage(&image, pdestPoints, 3);
}
在編譯上面的程序之前,應(yīng)該將Gdiplus.lib文件連編到項目中去,否則將會出現(xiàn)“LIN
K 2001”編譯錯誤。該程序在Visual Studio 6.0、Windows2000/XP下調(diào)試通過,它能
夠顯示或轉(zhuǎn)換的圖像格式有BMP、GIF、JPEG 、Exif 、PNG 、TIFF 、ICON、WMF 、EMF
等等。需要說明的是,本文只就GDI+編程的基本原理進行闡述,其實,GDI+的應(yīng)用遠(yuǎn)
不止于此。在GDI+的背后,有你意想不到的驚奇!
瞧,這程序運行起來是不是有些象ACDSee之類的圖像瀏覽程序?如果對本程序進行些改
進,你也以做出功能更加強勁的圖像處理程序。本文中所提到的程序,在我的主頁“國
稅之家”(http://nationaltax.home.chinaren.com)的“個人世界”中可以下下載到
。有關(guān)GDI+的編程序幫助信息,大家可以到微軟的MSDN網(wǎng)站去查閱。如果你有Visual 
Studio .NET,這就最好,因為所附的MSDN for Visual Studio.NET 7.0中有GDI+編程
所需的全部信息

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91丨九色丨尤物| 亚洲精品乱码久久久久久久久| 艳妇臀荡乳欲伦亚洲一区| 国产不卡视频在线播放| 国产午夜精品一区二区| 成人免费福利片| **性色生活片久久毛片| 色哦色哦哦色天天综合| 一区二区视频免费在线观看| 91久久精品午夜一区二区| 一区二区三区欧美日韩| 欧美高清视频不卡网| 美女一区二区在线观看| 久久久久久久免费视频了| 国产高清在线精品| 国产精品久久久久久久裸模| 色94色欧美sute亚洲13| 日韩中文字幕91| 久久丝袜美腿综合| 91麻豆国产香蕉久久精品| 性欧美大战久久久久久久久| 精品久久久久久久久久久院品网| 国产成人三级在线观看| 亚洲日本在线观看| 日韩欧美一二区| www.日本不卡| 日本免费新一区视频| 久久精品男人的天堂| 在线中文字幕一区二区| 久久成人免费网| 亚洲欧美一区二区三区国产精品 | 91福利在线导航| 日日噜噜夜夜狠狠视频欧美人| 欧美一区二区三区四区久久| 粉嫩13p一区二区三区| 亚洲国产综合91精品麻豆| 精品福利一区二区三区| 91丨porny丨户外露出| 日韩和欧美一区二区三区| 欧美极品少妇xxxxⅹ高跟鞋| 亚洲人成在线播放网站岛国| 91精品啪在线观看国产60岁| 成人免费视频网站在线观看| 午夜激情一区二区| 国产精品毛片久久久久久| 欧美精品丝袜久久久中文字幕| 国产精品香蕉一区二区三区| 亚洲第一激情av| 国产精品毛片高清在线完整版| 日韩一区二区免费视频| 91免费观看视频在线| 国产一区二区三区黄视频 | 亚洲午夜激情av| 中文字幕精品一区二区精品绿巨人| 欧美在线观看视频一区二区三区| 国产专区综合网| 日本亚洲三级在线| 亚洲免费观看高清完整版在线观看熊 | 中文字幕欧美国产| 日韩精品一区二区三区中文精品| 在线亚洲免费视频| 成人免费黄色大片| 国产一区二区福利| 久久aⅴ国产欧美74aaa| 亚洲成年人影院| 亚洲人成精品久久久久久| 国产亚洲一区二区三区四区| 日韩一区二区电影网| 欧美色倩网站大全免费| 色婷婷精品久久二区二区蜜臀av| 国产高清不卡二三区| 国产专区欧美精品| 麻豆精品国产传媒mv男同| 天天色综合天天| 亚洲一级在线观看| 一区二区三区在线观看国产| 中文字幕一区免费在线观看| 国产精品久久久久影视| 国产日韩欧美不卡在线| 国产午夜精品久久久久久免费视 | 蜜臀精品久久久久久蜜臀 | 色94色欧美sute亚洲13| 成人av网址在线观看| 成人午夜在线播放| jlzzjlzz亚洲女人18| 成人av在线影院| 99免费精品视频| 91在线视频在线| 色老头久久综合| 色婷婷国产精品久久包臀| 色狠狠av一区二区三区| 欧美视频中文字幕| 6080亚洲精品一区二区| 日韩欧美一级特黄在线播放| 日韩欧美国产麻豆| 久久精品人人做人人爽97| 欧美高清在线视频| 亚洲色图丝袜美腿| 亚洲第一av色| 久久er99热精品一区二区| 国产伦精品一区二区三区视频青涩| 国产一区三区三区| 成人97人人超碰人人99| 在线观看不卡视频| 欧美一区二区福利视频| 久久久久久久精| 亚洲视频网在线直播| 五月天亚洲精品| 黄色精品一二区| 91香蕉视频在线| 欧美浪妇xxxx高跟鞋交| 久久久亚洲国产美女国产盗摄| 国产精品亲子乱子伦xxxx裸| 亚洲一区二区三区在线播放| 蜜臀久久99精品久久久久久9| 国产69精品久久久久毛片| 在线观看一区二区精品视频| 日韩欧美卡一卡二| 中文字幕一区二| 欧美aaa在线| 成人精品鲁一区一区二区| 欧美日韩国产首页在线观看| www久久精品| 一区二区三区四区在线播放| 免费欧美高清视频| 91亚洲精华国产精华精华液| 中文字幕av一区二区三区高 | 97久久超碰国产精品电影| 欧美日本韩国一区| 国产精品卡一卡二| 免费精品99久久国产综合精品| 成人丝袜高跟foot| 在线播放欧美女士性生活| 欧美激情综合在线| 欧美96一区二区免费视频| 99久久精品国产精品久久| 4438x亚洲最大成人网| 中文字幕亚洲在| 国产永久精品大片wwwapp| 欧美日韩在线精品一区二区三区激情| 久久久久久久久久久电影| 午夜精品福利在线| av一二三不卡影片| 国产区在线观看成人精品 | 欧美人xxxx| 亚洲欧美在线视频| 韩国女主播一区| 在线播放日韩导航| 一区二区三区蜜桃网| 成人午夜视频网站| 久久久美女艺术照精彩视频福利播放| 亚洲成a人片在线不卡一二三区| 成人美女视频在线观看18| 日韩你懂的在线播放| 亚洲高清视频的网址| 91蜜桃在线免费视频| 欧美国产精品一区二区| 久久成人免费电影| 日韩一区二区影院| 亚洲第一会所有码转帖| 色哟哟在线观看一区二区三区| 久久久久国产精品麻豆ai换脸| 麻豆成人综合网| 日韩三级.com| 日本三级亚洲精品| 日韩午夜在线观看视频| 偷拍日韩校园综合在线| 在线看日本不卡| 一区二区久久久久久| 欧美中文字幕久久| 亚洲国产精品欧美一二99| 91国产精品成人| 亚洲永久精品国产| 欧美日韩午夜在线| 日韩制服丝袜先锋影音| 337p亚洲精品色噜噜| 天堂蜜桃一区二区三区 | 图片区小说区区亚洲影院| 欧美无乱码久久久免费午夜一区 | 洋洋成人永久网站入口| 色婷婷精品大在线视频| 一区二区三区自拍| 欧美午夜精品电影| 日韩高清中文字幕一区| 欧美伦理视频网站| 免费成人av在线播放| 精品国产免费久久| 国产成人综合在线观看| 中文字幕免费不卡| 日本精品一区二区三区四区的功能| 一区二区视频在线| 5566中文字幕一区二区电影| 免播放器亚洲一区| 国产欧美一区二区三区鸳鸯浴 | 国产一区在线精品| 国产精品毛片久久久久久| 色婷婷国产精品| 蜜臀av一区二区| 欧美国产激情二区三区| 在线影视一区二区三区|