2011-11-07 103 views
3

我允許用戶在嘗試保持圖像的原始高寬比時調整圖像大小。調整大小,同時保持縱橫比和舍入爲整數

對於每個調整大小操作,我有一個「偏移」變量,它指示寬度和高度的變化。這是基於鼠標移動的,所以它可以是任意值的組合,這取決於它們在調整大小時移動鼠標的次數。

我現在正在做的是取兩個值中較大的一個(x和y變化),並用它來計算相同縱橫比的另一個值。這裏是我的代碼:

if (Math.Abs(offset.X) > Math.Abs(offset.Y)) 
{ 
    offset.Y = (int)(offset.X/AspectRatio); 
} 
else 
{ 
    offset.X = (int)(offset.Y * AspectRatio); 
} 

高寬比是標準的寬度/高度值。

我的代碼的問題是,它使用整數值,所以它是四捨五入的,並導致縱橫比翹曲。

我假設我需要做的是捕捉到可以被縱橫比平分的整數值,或者是爲了達到這個目的。但我不知道如何通過修改這些x和y「偏移」值來實現。

回答

1

我假設我需要做的是捕捉到可以被縱橫比均勻分割的整數值,或者爲此目的。但我不知道如何通過修改這些x和y「偏移」值來實現。

要麼你會有一個不完美的高寬比舍入,裁剪或大塊調整大小。想想這個:

縱橫比爲3:4時,您可以水平縮放的最小尺寸是多少,並且仍然與原始比例完美匹配?

四個像素。

現在改變你的寬高比爲兩個大素數,你會看到問題。

取而代之,您既可以在一個維度上裁剪圖像,也可以使用圖像濾鏡進行插值,並且可以採用不太完美的寬高比改變。

請確保您的計算是正確的,壽。計算縱橫比作爲浮點值,並僅在最終計算時截斷爲整數。否則,你會有兩次舍入錯誤。

+1

你說得對,使用整數是不可行的。爲了存儲寬度/高度並繪製圖像,我可以將它轉換爲浮點。 –

+0

Svarog對'Math.Round'提出了一個很好的觀點,給你更準確的答案。沒有給出任何理由,但他們確實在你最終應該做的事情上做得很好 - 所以請確保你也輪到:) –

+0

回覆:「Svarog對Math.Round提供了一個很好的觀點,可以給你更準確的答案。沒有給出任何理由「 - 這是理由 - @ svarog的答案是」PS使用數學「。而不是簡單地轉換爲int,這會讓你獲得一些額外的精度。「 - 當拋出移動到最接近的整數時,拋出拋出非整數部分。例如,轉換爲int將轉爲1.234和1.987進入整數1,而Math.Round對於同樣的情況會產生1和2 – codingoutloud

2

使offset.X,.Y和AspectRatio浮動/雙打,做任何你需要的計算,並且只有一次新的大小被計算爲整數。
這樣你可以獲得最大的精度。

P.S. 使用Math.Round而不是簡單地轉換爲int,這將爲您帶來一些額外的精度。

+0

+1;這是做最後尺寸計算的正確方法,至於「超精度」,這是不完全正確的。你沒有更高的精確度,但肯定不會讓你的四捨五入錯誤 –

+0

@ MerlynMorgan-Graham更精確=更少錯誤;) – Svarog

相關問題