2009-11-03 44 views
1

我是不是想要系統試圖縮放我的繪圖,我想完全依靠自己來完成,因爲任何嘗試擠壓/拉伸圖形都會產生難看的結果。問題是,隨着圖像變大,我想添加更多的細節,而不是簡單地放大。如何在C中精確定位直線#

現在我正在看兩組條紋。一個是黑/白,另一個是黑/白/白。筆寬設置爲1.

當該線被水平繪製時,它是正確的。同樣的邏輯繪製垂直線似乎正在做一些抗鋸齒,將黑色滲透到附近的白色。黑色/白色/白色看起來不像橫向,黑色/白色看起來更像中等++灰色/中等灰色。

相同的代碼是在所有情況下生成座標,轉換邏輯只是選擇什麼偏移量應用在哪裏,因爲我只支持紅雀方向。由於沒有涉及浮點數,所以我無法查看精度問題。

我該如何讓系統離開我的圖形?

(是的,我意識到這將不會在非常高的分辨率下工作,最終我將不得不放大線條在任何合理的屏幕縮放因素,這無關緊要,打印機使用我會必須與它玩,看到我需要擴展的基本問題是,我試圖鞋拔子東西放進太少像素,而不只是讓斑點)

編輯:。沒有脫屑回事。我正在生成一個位圖目標窗口的確切大小。所有線條均以整數座標繪製。將SmoothingMode設置爲None的建議會改變情況:現在,黑/白/白繪製爲非常清晰的灰色/灰色/白色,黑色/白色繪製爲純灰色框。現在,這是清理,我可以看到一些應該是黑色的單獨的垂直線實際上是作爲繪製2像素灰色條相同的東西。就像我所有的垂直線都以1/2像素爲單位 - 但每個繪圖命令只能獲得整數。

再次編輯:我已經瞭解了更多關於這個問題。圖像正在正確繪製,但在顯示到屏幕時被丟棄。 (將其保存到磁盤並在相同的顯示器上查看它可以正確繪製。)

回答

1

看看System.Drawing.Drawing2d.SmoothingMode。將其設置爲「默認」或「無」應該在執行線條繪製時關閉消除鋸齒。如果您在討論如何縮放圖像而沒有消除鋸齒效果,請參閱InterpolationMode。具體而言,您可能希望將其設置爲「最近鄰居」,這將使您的矩形塊保持完美清晰。請注意,如果您使用除整數之外的任何值來縮放圖像,則將顯示的一些奇怪效果。

1

你真的應該讓系統爲你管理它。您已經描述了特定於您正在使用的硬件的特定行爲。考慮到不同的硬件,問題可能不存在的,或垂直它可水平,但不存在,或者可以在更小或更大的分辨率只存在,等等,等等你所描述聽起來像垂直

的基本問題線正在「垂直」像素堆棧之間繪製,這會導致系統繪製一條反鋸齒線。反走樣線的替代方案是改變它。與該問題是線將「抖動」或「反射」如果圖像被四處移動,動畫,或縮放或以任何其他方式轉化。一般來說,混亂比消除鋸齒更不理想,因爲它更讓人分心。

您應該能夠使用SmoothingMode枚舉關閉消除鋸齒,或者您可以嘗試自己處理定位。無論哪種方式,您都會在任何移動或轉換過程中進行抗鋸齒處理,以免出現抖動,抖動渲染。

+0

讓你的系統爲我處理它意味着什麼?我認爲沒有辦法 - 我想在圖片變大時添加更多細節。當瓦片很小時,圖紙非常粗糙,但是試圖做更詳細的任何事情只會造成一團糟。 – 2009-11-04 14:48:32

+0

我假設你在.NET中使用GDI +。使用GDI +(如果您願意使用更現代化的框架,則使用WPF),您可以使用Transforms。您可以像繪製矢量圖像一樣繪製圖像,然後使用變形進行縮放,旋轉,傾斜和移動。系統將從這一點爲您處理所有事情,您只需應用適當的轉換即可在視口中顯示您要繪製的圖像或其中的一部分圖像。 – jrista 2009-11-04 17:18:15

0

聽起來像你需要改變你的應用程序,告訴系統它是DPI的意識,所以不會發生縮放。這裏有一篇關於這樣做的文章:http://msdn.microsoft.com/en-us/library/ms701681%28VS.85%29.aspx

+0

導入user32.dll,因此是不可移植的。不完全是一個好方法。 – 2009-12-13 20:06:57

+0

自動擴展問題特定於Windows,因此非便攜式解決方案應該可以接受。 – 2009-12-13 20:39:08