前幾天突然想起了以前做的乙個答題器,原理是擷取以後用ocr識別出題目,然後再過題庫。但是一直有個bug沒法解決,就是win7/10有系統縮放(dpi),如果dpi不是100%,就會導致截圖區域不對,無法識別。
在網上查閱了很多資料,主要都是通過windows的getdevicecaps加上ogpixelsx引數(或者ogpixelsy也行)來獲得系統dpi的。這個函式查詢出來結果需要換算成縮放百分比。
但是自己試了很長時間,發現無論縮放比例設定成什麼樣子,這個函式查出來的永遠都是96(就是沒有縮放的時候的結果)。過了幾天,又突然發現能正常的查出120了(也就是125%的縮放)。絞盡腦汁想了很久,才想出來是為什麼。
第二種獲得dpi的方法則是用可視桌面的畫素(desktophorzres)除以真實畫素(horzres)來獲得比例。這兩種方法有什麼區別後面會著重說,我們先來講win10的坑爹設定。
在win10裡有兩種設定縮放的方法,一種是在「更改文字、應用等專案的大小」裡選擇,只有幾種預設好的比例可以選擇(100%、125%什麼的),預設是125%。第二種是在這個選項下面的「高階縮放設定」裡填寫自定義縮放。
然而這兩種方法居然不是相同的!甚至一丁點關係都沒有!
你可以腦補有兩個系統變數,用第一種設定方式的時候變數a的值會改變,而變數b則變回預設的值(100%);用第二種設定方式的時候變數a會變回預設(96 也就是100%),而變數b則會按照設定的值變化。
這也是為什麼之前我測試的那麼多次有的時候可以有的時候不可以,因為可以的時候我是用高階模式裡的自定義縮放設定的,這樣可以查詢到正確的dpi,但是用桌面畫素除以真實畫素的方法不可以!你會發現真實畫素居然紋絲不動!然而如果你是用預設方法(更改文字、應用等專案的大小),那麼dpi是查詢不到的,查詢到的永遠是96,但是真實畫素變了,從1920變成1536了,剛好是125%,程式設計師都感動哭了。
綜上所述
這兩種查詢方法還有一種內在邏輯關係,某一種方法能查詢出正確的值的時候,另外一種方法的結果一定是100%。因為100%是「預設的值」。
所以:
dpia = getdevicecaps(hdc, desktophorzres)/getdevicecaps(hdc, horzres)
dpib = getdevicecaps(hdc, logpixelsx)/0.96/100
if dpia == 1:
return dpib
elif dpib == 1:
return dpia
elif dpia == dpib:
return dpia
else:
return none
邏輯就是,兩種dpi中肯定至少有乙個是1(預設值),如果兩個都是,那就是1,如果只有乙個是1,那另外乙個一定是真實值。如果兩個都不是並且相等,那可能是其他設定方式,反正值都一樣,那說明可信度比較高,直接返回即可。如果都不是1,又不相等,那可能是某種未知的情況,返回none表示資料不對,再進行排查。
折騰了半天,終於把win10的迷醉dpi設定搞好了。
delphi 設定win10 dpi 縮放規則
一 dpi介紹 dpi是 dots per inch 的縮寫,表示每英吋的畫素點個數,也就是畫素點的密集度。dpi 總畫素點 總面積 比如乙個32寸的顯示,但解析度只有1920 1440,而乙個24寸的顯示器,解析度卻達到3840 2160,很明顯後面這個顯示器的每英吋的畫素點的個數多,顯示的畫面更...
win10下Linux雙系統
首先給乙個安裝教材鏈結 點我 等安裝成功後,我的ubuntu是有不少小毛病的。例如電腦都不顯示wifi,這就比較尷尬啦。主要是ubuntu16.4系統預設wifi這個驅動器不存在導致wifi功能不能顯示。首先用用網線連線電腦讓電腦可以上網 或者用安卓手機usb線連線電腦,再開啟手機的 設定 更多 流...
win10 系統修復
在執行系統檔案檢查器之前,請先執行收件箱部署映像服務和管理 dism 工具。dism.exe online cleanup image restorehealth然後執行 sfc scannow流程結束後,你可能收到以下訊息之一 windows 資源保護找不到任何完整性衝突。這表示您沒有任何丟失或損...