如何理解《Windows程序設計》第5章中的一段文字

如何理解《Windows程序設計》第5章圖形設計中“設備的大小”中下面的一段文字:

------------------------------------------------------------------------------------------------
Windows系統字體-不考慮是大字體還是小字體,也不考慮所選擇的視頻圖素大小-固定假設爲10點字體和12點行距。這聽起來很奇怪,如果字體都是10點,爲什麼還把它們稱爲大字體和小字體呢?

解答是:當您在「控制檯」的「顯示」程序上選擇小字體或大字體時,實際上是選擇了一個假定的視訊顯示分辨率,單位是每英寸的點數 。當選擇小字體時,即要Windows假定視訊顯示分辨率爲每英寸96點。當選擇大字體時,即要Windows假定視訊顯示分辨率爲每英寸120點。

再看看圖5-2。那是小字體,它依據的顯示分辨率爲每英寸96點。我說過它是10點字體。10點即是10/72英寸,如果乘以96點,每英寸大概就爲13圖素。這即是tmHeight減去tmInternalLeading的值。行距是12點,或12/72英寸,它乘以96點,每英寸就爲16圖素。這即是tmHeight的值。

圖5-3顯示大字體。這是依據每英寸120點的分辨率。同樣,它是10點字體,10/72乘以120點,每英寸等於16圖素,即是tmHeight減tmInternalLeading的值。12點行距等於20圖素,即是tmHeight的值。(像第四章一樣,再次強調所顯示的是實際的度量大小,因此您可以理解
它工作的方式。不要在您的程序中對此寫作程序。)

在Windows程序中,您可以使用GetDeviceCaps函數取得使用者在「控制檯」的「顯示器」程序中選擇的以每英寸的點數爲單位的假定分辨率。

要得到這些值(如果視訊顯示器不具有正方形圖素,在理論上這些值是不同的),可以使用索引LOGPIXELSX和LOGPIXELSY。LOGPIXELS指邏輯圖素,它的基本意思是「以每英寸的圖素數爲單位的非實際分辨率」。
------------------------------------------------------------------------------------------------

首先我們必須指出,這其中有些錯誤的地方(不知道是翻譯錯誤還是印刷錯誤,這就不得而知了),更正後(逗號的位置不一樣了)的文字如下:

------------------------------------------------------------------------------------------------
Windows系統字體-不考慮是大字體還是小字體,也不考慮所選擇的視頻圖素大小-固定假設爲10點字體和12點行距。這聽起來很奇怪,如果字體都是10點,爲什麼還把它們稱爲大字體和小字體呢?

解答是:當您在「控制檯」的「顯示」程序上選擇小字體或大字體時,實際上是選擇了一個假定的視訊顯示分辨率,單位是每英寸的點數。當選擇小字體時,即要Windows假定視訊顯示分辨率爲每英寸96點。當選擇大字體時,即要Windows假定視訊顯示分辨率爲每英寸120點。

再看看圖5-2。那是小字體,它依據的顯示分辨率爲每英寸96點。我說過它是10點字體。10點即是10/72英寸,如果乘以96點,每英寸大概就爲13圖素。這即是tmHeight減去tmInternalLeading的值。行距是12點,或12/72英寸,它乘以96點每英寸就爲16圖素。這即是tmHeight的值。

圖5-3顯示大字體。這是依據每英寸120點的分辨率。同樣,它是10點字體,10/72乘以120點每英寸等於16圖素,即是tmHeight減tmInternalLeading的值。12點行距等於20圖素,即是tmHeight的值。(像第四章一樣,再次強調所顯示的是實際的度量大小,因此您可以理解
它工作的方式。不要在您的程序中對此寫作程序。)

在Windows程序中,您可以使用GetDeviceCaps函數取得使用者在「控制檯」的「顯示器」程序中選擇的以每英寸的點數爲單位的假定分辨率。

要得到這些值(如果視訊顯示器不具有正方形圖素,在理論上這些值是不同的),可以使用索引LOGPIXELSX和LOGPIXELSY。LOGPIXELS指邏輯圖素,它的基本意思是「以每英寸的圖素數爲單位的非實際分辨率」。
------------------------------------------------------------------------------------------------

可是上面的這段文字仍然令人費解啊,爲什麼呢?疑問如下:
"不考慮是大字體還是小字體,也不考慮所選擇的視頻圖素大小-固定假設爲10點字體", "10點即是10/72英寸"
通過上面兩句話,我們可以得出這樣的結論: 無論大字體還是小字體,都爲10點字體,即是10/72英寸.
既然物理尺寸都是10/72英寸,也就是說大小相同了,怎麼可以區分大小字體呢????????????????????

於是我們可以這樣反推回來想,既然分爲大小字體,也就是說他們是在同一分辨率下,字體的的像素值是不一樣大的,也就是物理尺寸肯定是不一樣大的.大字體比小字體要大(大字體>小字體).

同時我們看到作者得出來的最後結果是:
小字體: 13圖素
大字體: 16圖素
爲了符合我們上面反推出來的結論(大字體>小字體),那麼這裏的兩個像素值肯定是在同一分辨率的兩個像素值.
------------------------------------------------------------------------------------------------

爲了理解上面的說法,我們必須先搞清楚幾個概念.

1.什麼是像素?
(簡單的說,我們通常所說的像素,就是CCD/CMOS上光電感應元件的數量,一個感光元件經過感光,光電信號轉換,A/D轉換等步驟以後,在輸出的照片上就形成一個點,我們如果把影像放大數倍,會發現這些連續色調其實是由許多色彩相近的小方點所組成,這些小方點就是構成影像的最小單位“像素” (Pixel)。

像素分爲CCD像素和有效像素,現在市場上的數碼相機標示的大部分是CCD的像素而不是有效像素。 )

而我的理解無非也就這麼簡單, 像素本質上就是一個感光元件在顯示屏上的映射.反正在顯示屏上他就是一個小方點.

2. 分辨率又是什麼呢?
分辨率和像素是密不可分的.

分辨率就是在單位長度(顯示屏上通常指1英寸)中,所表達或擷取的像素數目.
顯示器分辨率,就是Windows桌面的大小。常見的設定有640x480、800x600、1024x768…等。

那麼我們可以得出這樣一個結論: 同一顯示器,分辨率設定得越高,像素的大小(指SIZE)就應該越小.(像素的個數肯定就越多,這裏指數量,比如說
多少多少萬像素,就是指數量)

舉個例子來說明:假設1英寸裏只有10個像素,那麼像素的大小就應該是1/10英寸(分辨率低的情況); 那麼如果1英寸裏有1000個像素,那麼像素的大小就應該是1/1000英寸(分辨率高
的情況). 上面的結論已經非常明顯了.
------------------------------------------------------------------------------------------------

那麼我們繼續討論作者的文字
關於小字體的描述:
"再看看圖5-2。那是小字體,它依據的顯示分辨率爲每英寸96點。我說過它是10點字體。10點即是10/72英寸,如果乘以96點,每英寸大概就爲13圖素。"

按照我的理解就是: 顯示分辨率爲每英寸96點,那麼一個像素的大小就應該爲1/96英寸,因爲1英寸裏面有96個像素點(這是根據分辨率的概念得出來的).

我們假設小字體有numSmall個像素點,那麼就有這樣的結論了: 1/96英寸*numSmall = 10/72英寸, 於是我們得出numSmall = 13.
也就是說,小字體由13個像素點(每個像素點的大小爲1/96英寸)組成.

可是關於大字體的描述:
"圖5-3顯示大字體。這是依據每英寸120點的分辨率。同樣,它是10點字體,10/72乘以120點每英寸,等於16圖素"

按照我的理解就是: 顯示分辨率爲每英寸120點,那麼一個像素的大小就應該爲1/120英寸,原因同上(因爲1英寸裏面有120個像素點).

我們假設大字體有numLarger個像素點,那麼就有這樣的結論了: 1/120英寸*numLarger= 10/72英寸, 於是我們得出numLarger = 16.
也就是說,大字體由16個像素點(每個像素點的大小爲1/120英寸)組成.
------------------------------------------------------------------------------------------------

根據上面所有的結論,我們可以肯定下面的觀點是正確的:
1.大字體和小字體顯示在顯示屏上的物理大小是不一樣的,大字體>小字體.(這是很正常的,這也是人的正常邏輯思維)
2.大字體和小字體是在同一分辨率下顯示在顯示屏上的.(因爲我們在切換大小字體的時候,並沒有去重新設定顯示器的分辨率,所以他是不變的)
3.大字體和小字體的"10點即是10/72英寸", 這並不是大小字體的真正大小.它只是一個衡量值.
(真正的大小是, 假設在顯示分辨率爲每英寸96點的時候, 小字體的大小爲1/96英寸*13=10/72英寸,而大字體的大小應該爲1/96英寸*16)

於是我們理解作者上面文字的意思是: 10點即是10/72英寸,只是一個參照值,用來計算真正的大小字體.
而大小字體的區分卻在於根據"10點即是10/72英寸",以及一個假設的分辨率,通常是大於小字體所用的分辨率(作者的例子是小字體用了每英寸96點的分辨率,大字體用了每英寸120點的分辨率),就可以計算出大字體在同一分辨率下的像素值(16).

小字體: 1/96英寸*numSmall = 10/72英寸
(每英寸96點的分辨率爲顯示器的實際分辨率,10/72英寸永遠都是固定不變的一個值.)
大字體: 1/120英寸*numLarger = 10/72英寸
(每英寸120點的分辨率只是一個假定的實際分辨率,用來計算出numLarger的大小,10/72英寸永遠都是固定不變的一個值.)

------------------------------------------------------------------------------------------------
當時在網上搜索了很多資料,都沒有找出滿意的解答,於是我經過自己的思考就得出了上面的結論。
其實我理解以後,這就是這麼一回事吧。請大家多多在此討論,發表自己的觀點和理解,共同進步。
如果我有什麼理解錯誤之處,還請大家多多賜教。 謝謝大家!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章