• <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>
            隨筆-341  評論-2670  文章-0  trackbacks-0
                前天在博客上說希望開發一個盡量獨立于GDI的圖形庫。這個圖形庫將不使用其他圖形庫例如GDI+、OpenGL以及DirectX等。圖形庫使用GDI的原因如下:
                1:字體的邊框比較難獲得。直接讀TTF文件暫時還不想做,因此想借助GDI的API獲取文字的Bezier輪廓。
                2:不使用GDI無法把圖片刷上窗口。
                因此這個圖形庫使用的GDI的功能也僅限于此。當然,開發出來的結果必然是GDI所不能達到的。GDI+的結構也稍微有一點點不理想。

                為什么GDI和GDI+的速度都不太理想呢?下面的分析將會給出一個可能的解釋。

                今天早上考了軟件配置管理,也就是讓我們了解一下為什么需要Subversion這樣的軟件來幫助我們開發軟件。考完試回來的路上就構思了這個圖形庫的結構。讓我們考慮一下圖形庫所需的功能,也就是需求分析了。我們用慣的圖形庫都有繪制圖形、文字以及圖像的功能。圖形有畫刷和邊框,其中邊框是具有形狀的。

                首先考慮一下文字。我們知道現在絕大多數的文字都是由Bezier邊框構成的,雖然這種圖形是鑲嵌圖形(也就是有孔),不過孔不是什么大問題。我們拿到了文字的Bezier邊框之后,就可以將文字轉換為幾何圖形了。于是實際上只需要繪制圖形和圖像就夠了,外加一個獲取邊框的程序

                其次,繪制圖像實際上也是使用一個跟邊框有關系的畫刷去繪制一個矩形而已。所以,繪制圖像的時候,我們需要創建一個幾何圖形以及相匹配的設置的畫刷

                再者,讓我們考慮以下圖形。我們知道,圖形由邊框和內部構成,這兩個部分都是可選的。邊框有填充物、有線條類型(實線虛線等)、有線條的邊界形狀以及寬度等設置。那么,圖形的邊框通過這些設置就可以轉化為一個或多個幾何形狀和填充物。于是,我們只需要一個將邊框轉換為幾何圖形的程序就可以將邊框也去掉了,剩下的就是使用畫刷填充幾何圖形。

                那么,幾何圖形就是由直線、弧線、Bezier曲線以及其他線條方程組成了。這個就跟架構無關了,只需要解決相應的數學問題就行了。剩下的就是畫刷的問題。我們知道畫刷有若干類型,譬如單調顏色、漸變以及圖像等。漸變分兩種,一種是跟繪制的幾何圖形有關的,另一種是跟繪制的幾何圖形無關的。于是我們在使用跟繪制的幾何圖形有關的畫刷的時候,我們可以創建一個根據某種幾何圖形漸變的畫刷,并且讓這個幾何圖形跟被繪制的幾何圖形相同,從而可以去掉『跟繪制的幾何圖形有關的畫刷』了。

                于是畫刷就只有一種屬性了,也就是通過坐標來獲取顏色。因為這個時候畫刷已經跟被繪制的幾何圖形無關了。于是到了這里,我們很容易聯想到多態。使用一個接口包含『坐標返回顏色』的函數,就可以填充幾何圖形了。但是這樣做是不好的,因為一個幾何圖形有成千上萬個點,調用這么多次虛函數是會嚴重影響效率的。所以填充幾何圖形這種工作應該完全由畫刷負責。那么我們如何多態呢?實際上可以這樣。我們定義一個接口,給出幾何圖形然后繪制。然后繼承一個類出來,這個類是模板類。模板類傳入一個參數用于決定如何通過坐標返回顏色。因為畫刷跟被繪制的幾何圖形無關,所以可以這么做。這個時候,我們就可以把填充跟獲取顏色分開了,但是編譯的時候仍然會讓他們結合在一起。所以無論幾何圖形有多大,調用的虛函數也就是一次。

                好了,到了這里,一個圖形庫實際上就是由通過一定模式填充幾何圖形的函數,加上構造幾何圖形以及畫刷的各種各樣功能強大的周邊函數組成。

                那么考慮到這里,我們如何根據一個點獲取顏色呢?單調顏色非常好處理,無論如何都返回這個顏色。漸變的話,根據復雜的幾何圖形漸變仍需考慮一下好用的算法,根據直線、方框以及橢圓等凸多邊形漸變實際上是相當簡單的。剩下的就是根據圖像來獲取顏色了。根據圖像獲取顏色有幾個需要考慮的問題。第一個是超出圖像的部分如何處理,這個比較好辦,要么就返回一個顏色,要么就不填充,要么就讓圖像堆砌起來。第二個問題就是根據被繪制的點經過變換到圖像上的點的時候,這個點可能不是整數。這個時候我們可以尋找臨近的點的顏色,或者根據縮放尺度來計算若干點的顏色的加權平均值。當然第二種是比較逼真同時也比較慢的。

                剩下的一個問題就是反鋸齒效果了。這個不用過多解釋,實際上也有非常多的辦法來解決,在框架沒有定下來之前討論這個是沒有意義的。因為圖形庫實際上是支持Alpha通道的,所以并沒有什么技術上過于困難的地方。

                圖形我們就完全解決了,現在開始圖像的問題。我們仍然可以通過修改通過點獲取顏色的程序來實現調整一個圖像的對比度啊、亮度啊、甚至執行一些模糊銳化邊緣化等處理。我們甚至可以借用OpenGL的Color Matrix這種概念來執行一些比較簡單的線性顏色變換。這些效果實際上只需要慢慢添加進去就可以了,不過如何將多態的損耗減至最小仍然需要考慮。

                如果以上的討論所涉及到的問題全部解決的話,我們可以得到一個跟GDI+一樣,甚至是更加強大的圖形庫。好了,現在討論一下為什么GDI和GDI+的速度都比較慢。我們可能經常會重復繪制一些沒有任何變化的、具有復雜畫筆的幾何圖形。通過畫筆構造邊框的輪廓是一件復雜的工作,我們使用GDI和GDI+就會在每一次繪制的時候重復計算這些東西了。不過由于GDI和GDI+的接口過于友好,我們無法干預這件事情。所以效率下降就是必然的了。而且繪制文字等價于填充幾何圖形,因此也是如此。GDI+唯一一個比較快的就是圖像處理了,因為它的圖像處理并不是通過本文講述的轉嫁到畫刷的辦法來實現的。當然,如何打開和保存各種格式的圖片文件的事情就暫緩處理了,這根圖形庫本身是無關的。至于到時候這個圖形庫所展現出來的接口是如何的?我想仍然會有畫筆啊畫刷啊這種概念的,只不過會復雜一點,為了解決上面所說的問題也會繁瑣一點。

                圖形庫,僅僅是數學問題而已。
            posted on 2008-06-10 19:13 陳梓瀚(vczh) 閱讀(4392) 評論(13)  編輯 收藏 引用 所屬分類: 其他

            評論:
            # re: 圖形庫的概要設計 2008-06-10 20:57 | 空明流轉
            圖形庫,僅僅是數學問題而已。
            ---------這句話很贊同。很明顯我在思路上不如你清晰。  回復  更多評論
              
            # re: 圖形庫的概要設計 2008-06-10 23:16 | Touchsoft
            圖形庫,僅僅是數學問題而已。
            我最近為了圖形,不得不學習數學了 :)  回復  更多評論
              
            # re: 圖形庫的概要設計 2008-06-11 00:26 | 陳梓瀚(vczh)
            樓上做的是……?  回復  更多評論
              
            # re: 圖形庫的概要設計 2008-06-11 01:03 | Touchsoft
            亂做呢,就學習3D方面的,數學在這方面用的蠻多。  回復  更多評論
              
            # re: 圖形庫的概要設計 2008-06-11 01:55 | 看你是頭腦發昏
            去研究一下AGG,別一頭腦發昏就長篇大論  回復  更多評論
              
            # re: 圖形庫的概要設計 2008-06-11 02:12 | 看你是頭腦發昏
            所謂的二維圖形運算實質上都是用CPU進行矢量的光柵化運算,別以為M$設計GDI+的人是白癡,你還能設計出比GDIPlus更快更強大?

            看你這所謂分析實際上你完全就不了解2D圖形學,你那個所謂的模板思想,去查查AGG多少年前就出來了?AGG功能強大沒錯,但是它有性能優勢嗎?

            近年來興起OpenVG這樣的2D圖形接口,如果不借助硬加速,照樣完全沒有性能優勢!

            數學問題?博主你甚至連二維圖形學具體涉及哪些算法都沒搞清楚。給你個忠告,做學問就踏實一些,別動不動就指點江山,簡直貽笑大方。
              回復  更多評論
              
            # re: 圖形庫的概要設計 2008-06-11 02:42 | foxtail
            @看你是頭腦發昏
            他也是自己思考過的,很不錯了。  回復  更多評論
              
            # re: 圖形庫的概要設計 2008-06-11 04:03 | Kaja
            喜歡攻擊人的人可能需要去心理咨詢  回復  更多評論
              
            # re: 圖形庫的概要設計 2008-06-11 04:08 | 知道你很牛
            @看你是頭腦發昏
            被你貽笑大方,那你又被誰貽笑大方阿?
            張嘴閉嘴都是別人設計的庫,你又拿出什么殺手锏了沒?靠,最討厭就是你這種人,真正的沒多少本事,指手畫腳到很在行。

            要是你真牛逼,就拿出你的真本事來,讓大家對你頂禮膜拜。  回復  更多評論
              
            # re: 圖形庫的概要設計 2008-06-11 07:33 | 陳梓瀚(vczh)
            呃呃,多謝樓上三位兄弟替我說話。還是不要在我的地盤上大家的好。不過『看你是頭腦發昏』兄弟,胡亂猜測別人的水平是不好的。

            如果你有更好的見解請拿出來,知道點什么更先進的東西也行,指出我的設計的缺點也行,不要跟混混一樣光留下這么點話就走。而且,如果真的想只留下這么點話的話,麻煩留下聯系方式或者你自己的blog,方便日后討教。  回復  更多評論
              
            # re: 圖形庫的概要設計 2008-06-11 12:20 | 看你是頭腦發昏
            看來這位小朋友非常之不謙虛經不得人說以外,甚至沒有論壇掐架的經驗。

            要先進的東西嗎?去研究一下如何實現2D硬加速,不要用軟加速的掃描線算法,除了重復造個輪子之外沒有任何意義,或許,連個輪子都造不圓。

            看不出你上門那篇文章除了自以為是GDIPLUS不行以外,還有任何技術含量,跟你談設計不是扯談?

            需要猜測你的水平么?這不明擺著的事,捫心自問你的2D圖形學水平有多少斤兩再出來胡說。

            小朋友,你要是用馬甲幫自己說話的話,最好把時間隔長些,別在幾分鐘之內,這種行為很幼稚,別又要讓人說你貽笑大方喲~  回復  更多評論
              
            # re: 圖形庫的概要設計 2008-06-11 21:34 | Kaja
            小朋友,你要是用馬甲幫自己說話的話,最好把時間隔長些,別在幾分鐘之內,這種行為很幼稚,別又要讓人說你貽笑大方喲

            555可悲可悲啊。。。以小人之心度君子之腹還自以為得意,看來Ls真的老混昏了!嗤嗤嗤,強烈鄙視之!這種人當他透明好了  回復  更多評論
              
            # re: 圖形庫的概要設計 2008-06-11 23:41 | 陳梓瀚(vczh)
            禁止互相吵架,本帖想繼續吵請注冊帳號。省得被無中生有說用馬甲。  回復  更多評論
              
            久久国产福利免费| 久久精品成人免费网站| 久久婷婷色香五月综合激情| 久久久久九国产精品| 中文字幕精品无码久久久久久3D日动漫 | 国产免费久久精品99re丫y| 亚洲欧美日韩久久精品第一区| 日本免费一区二区久久人人澡| 久久久久亚洲AV综合波多野结衣| 亚洲精品乱码久久久久久按摩 | 一本大道久久a久久精品综合| 综合久久精品色| 国产精品久久久久久| 久久只有这里有精品4| 久久噜噜电影你懂的| 亚洲人成网亚洲欧洲无码久久| 国产精品久久久久一区二区三区 | 久久国产精品偷99| 亚洲国产精品无码久久久蜜芽| 久久国产成人午夜aⅴ影院| av无码久久久久不卡免费网站| 一级a性色生活片久久无| 99精品伊人久久久大香线蕉| 人妻久久久一区二区三区| 蜜桃麻豆WWW久久囤产精品| 久久精品国产精品亚洲| 91精品国产91久久久久久| 久久ZYZ资源站无码中文动漫| 亚洲人成无码网站久久99热国产| 国内精品伊人久久久久| 成人久久综合网| 国产欧美久久久精品| 97超级碰碰碰久久久久| 久久精品无码一区二区无码 | 久久精品国产一区二区电影| 女人香蕉久久**毛片精品| 久久国产精品久久国产精品| 蜜臀av性久久久久蜜臀aⅴ麻豆| 日韩精品久久久久久免费| 久久一日本道色综合久久| 久久夜色精品国产噜噜亚洲AV|