在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美

當前位置:雨林木風下載站 > 技術開發教程 > 詳細頁面

VC中完成多格式圖像的靈活轉換

VC中完成多格式圖像的靈活轉換

更新時間:2022-05-04 文章作者:未知 信息來源:網絡 閱讀次數:

四川省新都縣國家稅務局 周鳴揚

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

接著通過類向導(Class Wizard),重載“文件”菜單中的“打開”和“另存為”兩項,為了編程的簡單,本程序只將當前打開的圖像文件直接存為BMP文件(實際上保存成其他格式的文件也很簡單,只不過是對文件名進行分析而已)。另外,為了在打開和保存文件進行文件名的傳遞,首先應在CImageShowView類中加入一全局變量“CString strOpenFileName”。“打開”和“另存為”兩項的響應代碼如下,大家通過代碼中的注釋部份理解編程思路,應該不會有什么問題:
WCHAR* ToWChar(char * str)
{
//在GDI+中,有關字符的參數類型全部都是WCHAR類型的
//該函數是將傳統字符串進行轉換

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("當前沒有打開圖像文件,不能進行保存!");
return;
}
//建立圖形對像
Graphics graphics(GetDC()->m_hDC);
//裝入當前已經打開的圖形文件
Image image(ToWChar(strOpenFileName.GetBuffer(strOpenFileName.GetLength())));
CString strFileSave;
//當其他格式的圖像全部另存為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();
}
}
}

最后,為了顯示瀏覽圖像轉換前后的效果,還應該在窗口中分另繪制轉換前后的圖像,這很容易,只需要在OnDraw函數中添加繪制代碼,如下所述:
void CImageShowView::OnDraw(CDC* pDC)
{
CImageShowDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
//如果沒有選擇顯示圖形文件,則不用重繪
if(strOpenFileName.IsEmpty())
return;
//顯示當前打開的圖像文件的全名
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;
//在指定區域pdestPoints顯示圖像
graphics.DrawImage(&image, pdestPoints, 3);
}

在編譯上面的程序之前,應該將Gdiplus.lib文件連編到項目中去,否則將會出現“LINK 2001”編譯錯誤。該程序在Visual Studio 6.0、Windows2000/XP下調試通過,它能夠顯示或轉換的圖像格式有BMP、GIF、JPEG 、Exif 、PNG 、TIFF 、ICON、WMF 、EMF等等。需要說明的是,本文只就GDI+編程的基本原理進行闡述,其實,GDI+的應用遠不止于此。在GDI+的背后,有你意想不到的驚奇!

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

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美
  • <li id="86scu"><menu id="86scu"></menu></li>
    <li id="86scu"></li>
    <button id="86scu"></button>
  • <s id="86scu"></s><button id="86scu"><menu id="86scu"></menu></button>
  • 欧美一级片免费播放| 999香蕉视频| www激情五月| 日本不卡一区在线| 日韩精品免费播放| 99热成人精品热久久66| av观看免费在线| 成人精品视频一区二区| www黄色在线| 向日葵污视频在线观看| 91蝌蚪视频在线| 色男人天堂av| 69sex久久精品国产麻豆| 国产成人艳妇aa视频在线 | 国产精品12p| 人妻互换免费中文字幕| 成人在线免费观看av| 无码精品国产一区二区三区免费| 超碰网在线观看| 手机免费看av网站| 日韩欧美猛交xxxxx无码| 成人性免费视频| 熟妇人妻无乱码中文字幕真矢织江| 超碰在线播放91| 自拍一级黄色片| 女人和拘做爰正片视频| 日本中文字幕观看| 国产美女永久无遮挡| 久久午夜夜伦鲁鲁一区二区| 吴梦梦av在线| 动漫av免费观看| 艳母动漫在线观看| 十八禁视频网站在线观看| 97人人模人人爽人人澡| aa在线观看视频| www.51色.com| 男女午夜激情视频| 26uuu成人| 视频在线观看免费高清| 日韩欧美精品免费| 91亚洲一区二区| 精品99在线视频| 欧美日韩午夜爽爽| 久久人人爽av| 国产精品97在线| 成人av在线不卡| 三级黄色片免费观看| 另类小说色综合| www黄色av| 久久久性生活视频| 黄色网zhan| 亚洲综合伊人久久| 国产精品一区二区小说| 欧美极品欧美精品欧美图片| 日韩精品一区二区免费| 男插女免费视频| 黄瓜视频免费观看在线观看www | 国产97色在线 | 日韩| 欧美视频在线第一页| 国产精品久久久影院| 国产高清免费在线| 做爰高潮hd色即是空| 最新国产黄色网址| 天天影视色综合| 欧美国产日韩在线视频| 色婷婷一区二区三区在线观看| 中文字幕第80页| 伊人网在线综合| 91插插插影院| 免费看污污视频| 潘金莲一级淫片aaaaaa播放1| 国产又粗又猛大又黄又爽| 超碰91在线播放| 永久免费看av| 国产精品va无码一区二区| 国产精品无码专区av在线播放 | 日韩av在线播放不卡| 免费国产a级片| 国产wwwxx| 爱爱爱视频网站| 久久久久久免费看| 成年人在线看片| 日韩高清在线一区二区| 国产乱子伦精品无码专区| 日本www在线播放| 男人添女人下面免费视频| 亚洲一级片免费观看| 精品少妇在线视频| 91看片在线免费观看| 米仓穗香在线观看| 国内外成人激情视频| 色呦色呦色精品| 久久这里只有精品18| 不卡av免费在线| 在线观看18视频网站| 无码人妻h动漫| 久久艹这里只有精品| 自慰无码一区二区三区| 成人av毛片在线观看| 男人添女人荫蒂免费视频| 国产成人精品无码播放| 996这里只有精品| 亚洲欧美久久久久| 九一国产精品视频| 手机在线视频你懂的| 精品久久久久久久无码 | 天天操天天干天天玩| 免费日韩视频在线观看| 国产福利片一区二区| 日本新janpanese乱熟| 成人毛片一区二区| 日韩精品一区二区三区电影| 日本成人中文字幕在线| 少妇人妻大乳在线视频| 潘金莲一级淫片aaaaa免费看| 国产wwwxx| 熟妇人妻va精品中文字幕| 免费拍拍拍网站| 国产91视频一区| 色爽爽爽爽爽爽爽爽| 中文字幕22页| 91小视频网站| 免费涩涩18网站入口| 日本在线观看a| 春日野结衣av| 成人黄色片视频| 成人小视频在线看| 人妻熟妇乱又伦精品视频| av在线播放天堂| 91亚洲精品国产| 亚洲熟妇无码一区二区三区导航| 狠狠干视频网站| 国产黄色激情视频| 欧美又粗又长又爽做受| 男人天堂av片| 青青草原av在线播放| 毛片av免费在线观看| 久久精品99国产| 五月婷婷狠狠操| 九九热99视频| 大桥未久一区二区| 精品国偷自产一区二区三区| 久久av综合网| 日本女优爱爱视频| 欧美一级小视频| 日本老太婆做爰视频| 人妻少妇精品无码专区二区| 国产av麻豆mag剧集| 精品久久久久久久无码| 国产欧美一区二| 日韩美女爱爱视频| 日韩精品一区二区三区色欲av| 人妻丰满熟妇av无码区app| 亚洲综合日韩欧美| 成人一区二区av| 国产三区在线视频| 欧美视频国产视频| 欧美又粗又长又爽做受| 一区二区三区国产免费| 国产一级黄色录像片| 成年人视频在线免费| 青娱乐精品在线| 国产高清精品在线观看| 九九热视频免费| 欧美日韩国产精品激情在线播放| 蜜臀av免费观看| 韩日视频在线观看| 57pao国产成永久免费视频| 高清欧美精品xxxxx| 日本三级黄色网址| 国产资源在线视频| 国产精品12p| www.污污视频| 少妇高清精品毛片在线视频| 青青青在线观看视频| 老司机久久精品| 欧美 国产 日本| 久久精品在线免费视频| 中文字幕成人在线视频| 男人天堂网视频| 五十路熟女丰满大屁股| 久久久久久久久久毛片| 能在线观看的av网站| 国产免费黄色av| 男人日女人视频网站| a级片一区二区| 手机在线观看日韩av| 一级黄色片国产| 蜜臀一区二区三区精品免费视频 | www婷婷av久久久影片| 天天色天天综合网| 精品久久久99| 亚洲精品手机在线观看| 999精彩视频| 国产区二区三区| 国产喷水theporn| 国产一二三区av| 精品久久久99| 免费观看黄色大片| 成人免费看片视频在线观看|