青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

萬星星@豌豆莢 歡迎加入我們
一個吃軟飯的男人!!!!!我只想寫程序####
微博:http://weibo.com/wanlianwen
posts - 172,  comments - 1253,  trackbacks - 0

這里提及高效稍許有些夸張,僅為應景,因為本身就沒有太多高科技,權且作為一種有效的實現(xiàn)。

 

首先是圖片解碼器的選擇。一般來講有幾種選擇:1、組裝各種開源庫,如libpng, libjpg, giflib等,支持什么格式就得添加對應的解碼器;2、開源解碼包,如freeimage,沒用過但聽說也很不錯;3GDI+,支持圖片格式廣泛,接口簡單,性能一般。當然還有其它方式,大抵差不多。我選擇的是GDI+,圖簡便好用,且目前微軟支持的OS上都是自帶的,無需發(fā)布?!。對QQ的程序集DLL進行分析,發(fā)現(xiàn)其中貫穿了各種解碼技術,有直接采用開源庫的,也有依賴GDI+的,不知道是歷史遺留問題,還是各個部門之間技術偏好,抑或是另有玄機。扯到技術偏好,讓我頭疼的就是程序員在項目中隨意的引入庫,解決同一個問題,往往看到不同的人用不同的技術,甚至同一個人在不同的項目中造不同的輪子,有時候沒法說服別人,只能罷了。

 

GDI+的初始化需要注意一件事情:不要在DLL入口處加載或卸載GDI+,否則會發(fā)生鎖死現(xiàn)象,具體可查閱msdn

 

考慮到高性能的界面中可能會采用多線程UI,因此我建立了ThreadStateTLS對象,所有的數(shù)據(jù)都存儲在這個對象中,同步線程消息是通過慣用手法之隱藏窗口來保證。時至今日,或者早12年,我才深刻理解mfc庫設計時的那些state管理結構體的用處。GDI+的初始化在ThreadState構造函數(shù)中調(diào)用,正好避免了加載沖突這個問題。TLS對象的銷毀技巧來自谷歌的chromium源碼中的base庫里的tls實現(xiàn),原始出處來自CodeProjecthttp://www.codeproject.com/threads/tls.asp。嗯,其實牛逼的程序員也是縱覽乾坤,吸取精華。提到CodeProject,順帶提一下我的學習歷程,早期瘋狂的泡這個網(wǎng)站,幾乎VC方面的東西都把玩過,形成了自己的點狀知識積累,類似的有CodeGuru、vckbase(現(xiàn)在已經(jīng)成為廣告站了);之后是 sourceforge、codegoogle、codeplex 找一些小的項目研究,形成自己的線狀知識結構;再后來就是大型的源碼閱讀,偶爾會去谷歌討論組、微軟新聞組看一些疑難雜癥問題,構成了自己的面狀知識體系。每個人都有自己的學習方法論,這里僅僅是分享我自己的。很多東西都已經(jīng)看上去有些過時,現(xiàn)在的年輕程序員可能接觸的是stackoverflowgithub等。

 

GDI+中的Image是抽象接口,為了方便使用,增加了一層簡易封裝IMImage,主要接口如下:

 

static IMImage* FromFile(const std::wstring& uri);

long AddRef();
long Release();

const std::wstring& uri() const { return uri_; }
UINT frame_count() const { return frame_count_; }
bool IsAnimate() const { return frame_count_ > 1; }
long GetFrameDelay(UINT frame) const;
long GetWidth() const;
long GetHeight() const;
Gdiplus::Image* GetImage(UINT frame);

 

通過uri加載圖片,GDI+對本地圖片的加載非常簡單,Image::FromFile可以直接返回;對于網(wǎng)絡圖片,需要先通過WinINet下載到本地,然后再加載。

 

由于使用了tls技術,這里的引用計數(shù)實現(xiàn)很簡單,就是++-- 操作。曾經(jīng)有人告訴我引用技術是為了解決多線程中對象的生命周期問題,我欲與否認。引用計數(shù)只是為了解決對象的生命周期問題,而這種情況往往在多線程中出現(xiàn),因此多線程中或多或少會用到引用計數(shù)。

 

IMImage類可以簡單的返回一些GDI+Image對象提供的圖片信息,而GetImage需要多做一些事情。對于包含多幀圖片的文件,在繪制的時候需要通過GDI+Image::SelectActiveFrame方法選擇當前幀,該操作非常耗時,因此在加載圖片的時候,發(fā)現(xiàn)如果是多幀的,我們需要額外的decode_image_來解碼存放每一幀圖像,這樣除第一次渲染比較耗時外,后面的獲取都是非??斓?。

 

GetFrameDelay函數(shù)是獲取某一幀之間的時間間隔,通過GDI+PropertyItem可以很容易的獲取。需要指出的是PropertyItem類使用起來卻不是類的方式,需要手動new出一塊內(nèi)存,所以這里用一個結構體我看更合適,而且還是C風格的。

再增加一個IMImageService,管理整個系統(tǒng)中用到的IMImage對象,接口很簡單:

 

IMImage* GetImage(const std::wstring& uri);
void ReleaseImage(IMImage* image);

 

需要圖像就找它要,用完之后記得釋放即可。

 

這樣就完成了圖片的管理,目前來說足夠用,也非常簡單,不是么?

posted on 2012-06-17 09:48 萬連文 閱讀(2980) 評論(2)  編輯 收藏 引用 所屬分類: richedit

FeedBack:
# re: richedit研究03 – 高效圖片管理
2012-06-17 10:44 | 春秋十二月
boost中也有tls的實現(xiàn),早期的時候,我一直也想自己弄個tls,但至今沒動手,引用計數(shù)一是生命周期,二是共享資源。  回復  更多評論
  
# re: richedit研究03 – 高效圖片管理
2012-08-23 22:00 | 路障
對于包含多幀圖片的文件,在繪制的時候需要通過GDI+的Image::SelectActiveFrame方法選擇當前幀,該操作非常耗時,因此在加載圖片的時候,發(fā)現(xiàn)如果是多幀的,我們需要額外的decode_image_來解碼存放每一幀圖像,這樣除第一次渲染比較耗時外,后面的獲取都是非??斓?。

解碼存放每一幀圖像,當一個GIF有很多幀的時候,也全部解碼出來,這樣會不會占用比較多的內(nèi)存?  回復  更多評論
  
簡歷下載
聯(lián)系我

<2025年11月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

常用鏈接

留言簿(66)

隨筆分類

隨筆檔案

相冊

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久影院午夜论| 亚洲精品中文字幕在线观看| 欧美+亚洲+精品+三区| 新狼窝色av性久久久久久| 免费在线亚洲| 免费欧美高清视频| 狠狠综合久久av一区二区小说 | 久久久噜噜噜久噜久久| 国产精品一区二区三区观看| 亚洲激情电影在线| av成人免费观看| 国产精品自拍网站| 欧美在线免费播放| 欧美黄色免费网站| 一区二区三区导航| 国产日韩精品久久久| 久久精品亚洲一区二区三区浴池| 久久女同精品一区二区| 亚洲第一中文字幕| 欧美精品18+| 欧美影片第一页| 亚洲美女视频| 噜噜噜躁狠狠躁狠狠精品视频| 欧美日韩一区三区| 久久色在线播放| 久久这里有精品视频| 欧美日本国产一区| 亚洲一区二区三区精品视频 | a91a精品视频在线观看| 亚洲欧美日韩在线播放| 精品福利免费观看| 国产精品超碰97尤物18| 美女爽到呻吟久久久久| 午夜精品成人在线| 亚洲经典自拍| 久久综合九色欧美综合狠狠| 亚洲午夜精品一区二区| 在线观看亚洲一区| 国产午夜精品一区二区三区欧美 | 欧美激情一区二区三区高清视频| 久久午夜羞羞影院免费观看| 欧美在线电影| 亚洲综合色丁香婷婷六月图片| 亚洲欧洲视频在线| 91久久在线| 99视频精品免费观看| 亚洲精品视频在线看| 韩日在线一区| 伊人久久亚洲影院| 亚洲黄网站黄| 亚洲美女视频在线免费观看| 亚洲人成7777| 中文久久精品| 久久精品99| 久久久久99精品国产片| 久久久久久午夜| 亚洲第一在线| 亚洲一级黄色片| 欧美在线观看网址综合| 久久女同互慰一区二区三区| 狼人社综合社区| 欧美国产日韩一区| 国产精品美女久久久免费| 黄色成人在线免费| 一本色道88久久加勒比精品| 日韩亚洲一区二区| 久久久综合网| 亚洲免费播放| 欧美一区二区三区四区高清| 久久久99国产精品免费| 欧美日韩一区二区三区在线视频| 欧美视频免费在线观看| 国产麻豆精品theporn| 亚洲黄色影片| 亚洲欧美韩国| 亚洲人妖在线| 久久久精品国产免费观看同学| 欧美日韩国产丝袜另类| 国产一区二区三区四区三区四| 亚洲精品乱码久久久久久按摩观| 亚洲午夜羞羞片| 亚洲日本aⅴ片在线观看香蕉| 久久综合色婷婷| 黄色成人av在线| 裸体丰满少妇做受久久99精品| 亚洲精品视频一区| 欧美国产一区二区在线观看| 国内精品久久久久久| 久久精品人人爽| 性欧美8khd高清极品| 亚洲一区二区久久| 亚洲免费视频观看| 亚洲一区二区三区精品动漫| 国产精品久99| 久久精品视频免费播放| 久久国产精彩视频| 亚洲国产欧美在线| 亚洲激情午夜| 国产美女精品免费电影| 久久手机精品视频| 99国产精品国产精品毛片| 亚洲日韩中文字幕在线播放| 欧美视频一区| 欧美剧在线观看| 欧美激情1区| 毛片av中文字幕一区二区| 国产精品久久亚洲7777| 亚洲国产mv| 极品尤物一区二区三区| 香蕉成人久久| 欧美亚洲视频| 国产精品蜜臀在线观看| 亚洲激情视频在线播放| 亚洲国产日韩欧美综合久久 | 国内精品模特av私拍在线观看| 亚洲电影免费在线| 亚洲日本黄色| 欧美精彩视频一区二区三区| 欧美国产日韩二区| 亚洲国产成人高清精品| 久久久久一区二区三区| 久久视频这里只有精品| 尤物精品在线| 猫咪成人在线观看| 亚洲精品日产精品乱码不卡| 亚洲精品乱码久久久久久| 欧美精品二区三区四区免费看视频| 欧美成人性生活| 中国av一区| 国产亚洲午夜| 欧美电影电视剧在线观看| 亚洲日本成人网| 亚洲午夜在线| 一区三区视频| 欧美日韩国产一区二区三区地区 | 日韩亚洲欧美一区二区三区| 欧美日韩国产综合视频在线| 欧美激情影院| 亚洲国产日韩欧美综合久久| 欧美精品久久一区| 亚洲一区高清| 亚洲七七久久综合桃花剧情介绍| 亚洲一区二区免费视频| 极品裸体白嫩激情啪啪国产精品| 美腿丝袜亚洲色图| 欧美一区二区观看视频| 亚洲国产女人aaa毛片在线| 亚洲欧美日本视频在线观看| 国产夜色精品一区二区av| 欧美精品成人在线| 久久蜜桃资源一区二区老牛| 亚洲午夜一二三区视频| 欧美高清成人| 欧美福利视频在线观看| 久久久综合香蕉尹人综合网| 亚洲免费影院| 亚洲素人一区二区| 99国产一区| 亚洲人成免费| 国产酒店精品激情| 亚洲欧美高清| 欧美精品aa| 欧美亚洲视频一区二区| 99精品视频免费观看| 亚洲高清网站| 亚洲缚视频在线观看| 欧美电影电视剧在线观看| 欧美一区在线视频| 久久久久久久久久久久久久一区 | 黑人巨大精品欧美黑白配亚洲| 国产精品一区在线观看你懂的| 国产精品欧美日韩一区| 国产深夜精品| 亚洲国产精品va在看黑人| 亚洲激情第一区| 一区二区三区视频在线| 亚洲制服少妇| 美女国内精品自产拍在线播放| 欧美粗暴jizz性欧美20| 亚洲人成在线免费观看| 亚洲一区二区免费视频| 久久久久综合一区二区三区| 欧美精品免费播放| 国产亚洲精品自拍| 一本色道久久综合亚洲精品小说 | 国产偷久久久精品专区| 亚洲日本理论电影| 亚洲欧美激情一区| 欧美黄在线观看| 性色av一区二区怡红| 欧美激情精品久久久久久大尺度| 国产精品久久一卡二卡| 亚洲免费观看高清完整版在线观看熊| 日韩手机在线导航| 欧美不卡三区| 久久精品免费看| 国产一区成人| 欧美一级二区| 亚洲欧美国产高清va在线播| 欧美精品日韩三级|