国产午夜成人免费看片无遮挡_日本免费xxxx色视频_免费人成网上在线观看_黄网址在线永久免费观看

當(dāng)前位置:雨林木風(fēng)下載站 > 技術(shù)開發(fā)教程 > 詳細(xì)頁(yè)面

VC中完成多格式圖像的靈活轉(zhuǎn)換

VC中完成多格式圖像的靈活轉(zhuǎn)換

更新時(shí)間:2022-05-04 文章作者:未知 信息來源:網(wǎng)絡(luò) 閱讀次數(shù):

四川省新都縣國(guó)家稅務(wù)局 周鳴揚(yáng)

色彩鮮艷漂亮的高品質(zhì)圖像,一個(gè)個(gè)形象的Windows圖標(biāo),高速運(yùn)動(dòng)、活靈活現(xiàn)的三維動(dòng)畫,這些生動(dòng)的圖形無一不顯示著程序設(shè)計(jì)者的藝術(shù)才華。在程序設(shè)計(jì)中,圖像處理已經(jīng)成了每個(gè)程序員的必修課,所以,對(duì)于每個(gè)程序員來說,熟悉“BMP”、“GIF”、“JPEG”圖像格式及具體應(yīng)用、調(diào)色板、圖像文件頭格式、圖像壓縮算法等概念似乎已經(jīng)成了工作中不可缺少的基礎(chǔ)知識(shí)。面對(duì)如此多的圖像格式,如果要全部掌握其具體細(xì)節(jié),好像這對(duì)程序員有些不公。在VC中編程顯示一幅位圖,下列的步驟是不可少的:裝入位圖、獲得位圖的大小信息、啟用設(shè)備環(huán)境、位傳輸,所需的程序代碼顯得千篇一律的冗長(zhǎng)。如果想要裝入的位圖另存為其他格式的圖像文件……??jī)蓚(gè)字:頭疼!而這一切都是因?yàn)镚DI本身的局限性所造成。
隨著Windows 2000的推出,上面的情況有了大大的改觀:你可以不必了解每種圖像格式的具體含義,照樣可以寫出多格式圖像瀏覽或轉(zhuǎn)換程序,這一切,全部都依賴于Windows 2000及后繼版中所使用的GDI+技術(shù)。首先來看看GDI+的具體技術(shù)細(xì)節(jié)及GDI+編程特點(diǎn)。
Windows 2000在用戶界面方面包括了幾個(gè)重大的改進(jìn),可能你已經(jīng)注意到了有陰影的鼠標(biāo)、漸入的工具條快速提示、透明的窗口、平滑地窗口變化等。Windows 2000在界面上之所以有這么大的改進(jìn),完全是因?yàn)閃indows2000采用了一種GDI(graphics device interface :圖形設(shè)備接口)。這種GDI,以前叫GDI2k,現(xiàn)在有了一個(gè)更好聽的名字:GDI+。GDI+是一種新型的圖形設(shè)備接口,它的主要特點(diǎn)在于它能夠創(chuàng)建全新的用戶桌面體系、能夠輕易地完成二維或三維的圖形處理,為桌面帶來一種數(shù)字化的圖片。 GDI+ 同時(shí)也提供了增強(qiáng)的圖形處理技術(shù),如常見的:alpha blending、 紋理、貼圖、增強(qiáng)的文本及圖片顯示技術(shù)。實(shí)際上,GDI+主要的特色就在于強(qiáng)調(diào)通過硬件加速來達(dá)到良好的視覺感受!
同傳統(tǒng)的GDI不同,GDI+中引入了對(duì)COM(組件對(duì)象模型)技術(shù)的支持,通過COM技術(shù),GDI+簡(jiǎn)化了對(duì)圖像文件的訪問(打開、保存)程序:通過調(diào)用COM組件來實(shí)現(xiàn)的,GDI+扮演的只是指揮者,而非操作員。對(duì)于圖像文件,GDI+所關(guān)心的不是圖像文件的文件頭信息,不論欲打開的文件格式是什么類型,GDI+首先要做的是在注冊(cè)中查看該圖像格式的編碼(或解碼)信息是否已經(jīng)注冊(cè)(HKEY_CLASSES_ROOT\MIME\Database\Content Type),如果已經(jīng)注冊(cè),就通過該編碼信息調(diào)用COM組件,就這么簡(jiǎn)單。這種技術(shù)其實(shí)早就在微軟的其他軟件中已經(jīng)使用了,如IE。“體驗(yàn)”過NIMDA病毒的朋友可能對(duì)“audio/wav”這段代碼并不陌生,NIMDA就是靠它來偽裝自己的:讓IE認(rèn)為附件是WAV文件而自動(dòng)打開可執(zhí)行程序。這其實(shí)也是IE使用COM技術(shù)的一個(gè)突出表現(xiàn)。
配合GDI+的推出,微軟也同時(shí)發(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+的頭文件和庫(kù)文件。在使用GDI+之后,, 再有沒有必要去考慮什么句柄、設(shè)備環(huán)境這樣的概念了。你只需要簡(jiǎn)單地創(chuàng)建一個(gè)圖形對(duì)象(Graphics object),然后直接調(diào)用該對(duì)象的方法(methods)進(jìn)行繪圖即可。圖形對(duì)象是GDI+中核心,正如DC之于GDI那樣。圖形對(duì)象和DC有許多相似的地方,在使用上遵循著相同的使用規(guī)則,但是兩者在本質(zhì)上已經(jīng)有很大的區(qū)別。一個(gè)是基于句柄的GDI,一個(gè)是基于組件對(duì)象模型的GDI+。使用GDI+的SDK編程,必須得按照下面的規(guī)范來進(jìn)行:使用GDI+的名空間(namespace Gdiplus)、在使用GDI+函數(shù)時(shí)必須進(jìn)行GDI+的初始化,使用完畢之后也得銷毀GDI+,這種規(guī)范在下面所列的程序中有詳細(xì)的說明。
前面說到了GDI+是通過在注冊(cè)中查看編碼信息來訪問圖像文件的,在GDI+的SDK中,編碼信息是儲(chǔ)存在 ImageCodecInfo類中的,在這個(gè)類中,有編碼的CLSID(COM組件的GUID標(biāo)識(shí)碼)、編碼方式描述等。在GDI中,在注冊(cè)表中訪問編碼信息通常使用以下兩個(gè)函數(shù)來實(shí)現(xiàn):
1、查看系統(tǒng)中可用的圖像編碼信息(數(shù)量及大小)
Status GetImageEncodersSize(
UINT* numEncoders, //存儲(chǔ)編碼器數(shù)量的地址
UINT* size //存儲(chǔ)編碼信息所需內(nèi)存大小
);
2、得到所有的編碼信息
Status GetImageEncoders(
UINT numEncoders,//可用編碼器數(shù)量
UINT size,//儲(chǔ)存編碼器信息所需內(nèi)存(由ImageCodecInfo類組成的數(shù)組的大小)
ImageCodecInfo* encoders//編碼器信息指針
);
在GetImageEncoders函數(shù)中,參數(shù)numEncoders和size都是由GetImageEncodersSize所返回的。下面的代碼就能夠在注冊(cè)表中查找具體格式圖像的編碼方式:
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)識(shí),實(shí)現(xiàn)多格式的圖像的瀏覽與轉(zhuǎn)換就并不是什么難事了。為了講述的方便,首先在VC中建立一個(gè)SDI項(xiàng)目ImageShow,首先對(duì)使用GDI+申明和初始化及銷毀進(jìn)行代碼編制,具體代碼如下:
#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),重載“文件”菜單中的“打開”和“另存為”兩項(xiàng),為了編程的簡(jiǎn)單,本程序只將當(dāng)前打開的圖像文件直接存為BMP文件(實(shí)際上保存成其他格式的文件也很簡(jiǎn)單,只不過是對(duì)文件名進(jìn)行分析而已)。另外,為了在打開和保存文件進(jìn)行文件名的傳遞,首先應(yīng)在CImageShowView類中加入一全局變量“CString strOpenFileName”。“打開”和“另存為”兩項(xiàng)的響應(yīng)代碼如下,大家通過代碼中的注釋部份理解編程思路,應(yīng)該不會(huì)有什么問題:
WCHAR* ToWChar(char * str)
{
//在GDI+中,有關(guān)字符的參數(shù)類型全部都是WCHAR類型的
//該函數(shù)是將傳統(tǒng)字符串進(jìn)行轉(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)前沒有打開圖像文件,不能進(jìn)行保存!");
return;
}
//建立圖形對(duì)像
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);
//將保存后的圖像進(jìn)行顯示
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);

//建立圖形對(duì)象
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àng)目中去,否則將會(huì)出現(xiàn)“LINK 2001”編譯錯(cuò)誤。該程序在Visual Studio 6.0、Windows2000/XP下調(diào)試通過,它能夠顯示或轉(zhuǎn)換的圖像格式有BMP、GIF、JPEG 、Exif 、PNG 、TIFF 、ICON、WMF 、EMF等等。需要說明的是,本文只就GDI+編程的基本原理進(jìn)行闡述,其實(shí),GDI+的應(yīng)用遠(yuǎn)不止于此。在GDI+的背后,有你意想不到的驚奇!

瞧,這程序運(yùn)行起來是不是有些象ACDSee之類的圖像瀏覽程序?如果對(duì)本程序進(jìn)行些改進(jìn),你也以做出功能更加強(qiáng)勁的圖像處理程序。本文中所提到的程序,在我的主頁(yè)“國(guó)稅之家”(http://nationaltax.home.chinaren.com)的“個(gè)人世界”中可以下下載到。有關(guān)GDI+的編程序幫助信息,大家可以到微軟的MSDN網(wǎng)站去查閱。如果你有Visual Studio .NET,這就最好,因?yàn)樗降腗SDN for Visual Studio.NET 7.0中有GDI+編程所需的全部信息。

溫馨提示:喜歡本站的話,請(qǐng)收藏一下本站!

本類教程下載

系統(tǒng)下載排行

国产午夜成人免费看片无遮挡_日本免费xxxx色视频_免费人成网上在线观看_黄网址在线永久免费观看

  • <label id="pxtpz"><meter id="pxtpz"></meter></label>
      1. <span id="pxtpz"><optgroup id="pxtpz"></optgroup></span>

        欧美性videosxxxxx| 欧美精品v日韩精品v韩国精品v| 国产一区二区三区香蕉| 欧美疯狂性受xxxxx喷水图片| 亚洲欧美色图小说| 色综合久久88色综合天天| 亚洲视频一区在线观看| 色综合天天视频在线观看| 亚洲一区二区高清| 91精品国产入口在线| 紧缚捆绑精品一区二区| 欧美哺乳videos| 成人av片在线观看| 午夜不卡av免费| 日韩三级高清在线| 99久久综合国产精品| 亚洲精品久久7777| 欧美性色aⅴ视频一区日韩精品| 日韩电影免费在线观看网站| 欧美电影免费观看高清完整版在线| 久久av中文字幕片| 国产精品久久久久久久久免费桃花 | 日本一区二区免费在线观看视频| 国产成人免费av在线| 亚洲一区二区三区自拍| 日韩欧美国产小视频| 成人av网站在线观看| 亚洲电影一区二区三区| 日韩一级在线观看| 欧美亚洲动漫精品| 成人小视频免费观看| 日韩精品乱码av一区二区| 精品国产91久久久久久久妲己| 色94色欧美sute亚洲13| 国产精品中文字幕一区二区三区| 亚洲国产毛片aaaaa无费看| 欧美一区二区三区影视| 91黄色小视频| 粉嫩嫩av羞羞动漫久久久| 看电视剧不卡顿的网站| 午夜精品久久久久久久久| 欧美激情在线一区二区三区| 日韩欧美美女一区二区三区| 欧美日韩精品一区二区三区 | 国产福利一区二区| 人禽交欧美网站| 天天综合天天做天天综合| 亚洲激情成人在线| 亚洲欧美日韩国产手机在线| 国产视频一区二区在线观看| 日韩欧美成人一区二区| 欧美一区二区精品在线| 337p亚洲精品色噜噜噜| 欧美一区二区三区视频在线观看| 69久久夜色精品国产69蝌蚪网| 欧美日韩在线不卡| 91 com成人网| 日韩一区二区三区观看| 精品美女被调教视频大全网站| 日韩午夜精品视频| www成人在线观看| 精品播放一区二区| 精品国产网站在线观看| 久久免费国产精品| 国产精品亲子伦对白| 亚洲欧美日韩一区| 亚洲chinese男男1069| 日本不卡的三区四区五区| 日本不卡123| 国产乱人伦精品一区二区在线观看| 国产一区二区伦理| 99re热视频精品| 欧美在线视频日韩| 欧美日韩黄色一区二区| 欧美不卡一二三| 国产精品美女久久久久久久网站| 亚洲人成网站影音先锋播放| 亚洲成人精品影院| 国产高清视频一区| 欧美日韩一卡二卡| 久久久99精品免费观看| 亚洲激情一二三区| 久久99久久精品| 色中色一区二区| 精品三级av在线| 综合婷婷亚洲小说| 久久精品国产一区二区| www.亚洲激情.com| 欧美一区二区免费视频| 最新日韩在线视频| 欧美96一区二区免费视频| 成人黄色av电影| 欧美一区二区三区四区久久| 国产目拍亚洲精品99久久精品| 亚洲一卡二卡三卡四卡| 国产乱色国产精品免费视频| 欧美在线观看视频一区二区三区| 精品国产自在久精品国产| 亚洲人成精品久久久久| 狠狠久久亚洲欧美| 欧美日韩视频第一区| 国产精品剧情在线亚洲| 蜜桃久久久久久| 欧美综合天天夜夜久久| 2020日本不卡一区二区视频| 亚洲最色的网站| 成人免费福利片| 久久综合狠狠综合| 日韩精品一区第一页| 在线观看亚洲精品视频| 中文字幕亚洲区| 成人久久久精品乱码一区二区三区| 欧美精品18+| 亚洲成av人影院在线观看网| 欧美美女bb生活片| 欧美国产一区二区在线观看| 精品亚洲成a人| 日韩免费视频一区二区| 亚洲成人动漫在线观看| 欧美中文字幕一二三区视频| 国产精品国产自产拍在线| 国产成人av一区| 国产欧美一区二区精品仙草咪| 美女视频黄 久久| 欧美一区二区三区视频免费 | 91碰在线视频| 欧美国产日韩在线观看| 国产成人在线视频网址| 久久久精品免费免费| 国产一区二区在线视频| 精品91自产拍在线观看一区| 免费精品视频最新在线| 欧美酷刑日本凌虐凌虐| 婷婷一区二区三区| 欧美一区二区三区日韩| 日本网站在线观看一区二区三区| 欧美女孩性生活视频| 午夜视频久久久久久| 欧美一区二区在线播放| 麻豆传媒一区二区三区| 欧美精品一区二区三区视频 | 五月天久久比比资源色| 欧美高清dvd| 老鸭窝一区二区久久精品| 精品国产在天天线2019| 国产一区二区女| 国产精品护士白丝一区av| 在线国产电影不卡| 日韩—二三区免费观看av| 日韩三级在线观看| 成人精品在线视频观看| 亚洲夂夂婷婷色拍ww47| 欧美日韩一级二级| 精品一区二区三区视频 | 欧美成人一区二区| 国产v综合v亚洲欧| 亚洲一区二区在线观看视频 | 亚洲人123区| 日韩精品影音先锋| 9l国产精品久久久久麻豆| 亚洲va欧美va天堂v国产综合| 日韩三级在线免费观看| 不卡的看片网站| 蜜臀av一区二区在线免费观看| 亚洲国产成人一区二区三区| 欧美日韩久久一区二区| 国产麻豆91精品| 亚洲综合色在线| 国产视频一区不卡| 欧美人伦禁忌dvd放荡欲情| 国产91富婆露脸刺激对白| 天堂成人免费av电影一区| 亚洲欧美影音先锋| 2022国产精品视频| 欧美视频自拍偷拍| 成人午夜视频免费看| 麻豆成人综合网| 亚洲成人av一区二区三区| 国产精品天干天干在线综合| 欧美精品乱人伦久久久久久| 国产aⅴ综合色| 青草国产精品久久久久久| 亚洲综合成人网| 国产精品美女久久久久久久久| 欧美一区二区三区免费| 在线视频国产一区| 97精品国产97久久久久久久久久久久| 久久99国内精品| 午夜精品福利视频网站| 一区二区三区精密机械公司| 国产精品美女一区二区在线观看| 精品第一国产综合精品aⅴ| 6080午夜不卡| 欧美乱妇15p| 欧美日韩不卡一区| 在线观看91精品国产入口| 91麻豆精东视频| 91丨porny丨首页| 一本一道波多野结衣一区二区| 极品少妇一区二区|