2014-11-16 34 views
2

我有一個500像素x 200像素的CSS容器。如何縮放圖像,直到它填充X和Y的尺寸

我需要做的是縮放我的圖像,以便它們填充容器,但我想使用ColdFusion圖像函數來減小/擴大直到它填充尺寸。例如,如果我有一個1920 x 1080像素的大圖像,那麼我希望ColdFusion將其大小縮小(同時保持寬高比),直到其大小足以填充500px x 200px的容器尺寸爲止。同樣,一個小圖像應該放大,直到它至少500px寬,200px寬。關鍵詞是至少,因爲如果超出這些尺寸,它並不重要。

我可以使用ImageScaleToFit(),但它會減少圖像,直到滿足其中一個尺寸(500px或200px)。因此,ImageScaleToFit會將圖像縮小至500px寬,但高度可能只有100px。而不是這個,我希望ColdFusion減少圖像,直到至少至少都是500px寬和200px高。

我也嘗試過使用ImageCrop()來簡單地從圖像中取出500像素x 200像素的圖像,這些圖像的尺寸大於這些尺寸,但是由於在大圖像上你沒有得到什麼剪裁圖像最初的意思是。

我該如何解決這個問題?我可以用來解釋我想要的最好的比喻是,如果您在Photoshop中創建500px x 200px的畫布,然後在該畫布上放置圖像,並使用變換工具展開/縮小它,直到該畫布被填充。顯然不是所有的圖像都會出現在畫布上,但沒關係,因爲大部分圖像都在那裏。

回答

3

你可以自己做數學,我循環了一些樣本數據,但只是作爲一個演示。

<cfset dimlist="1000|800,1000|1000,800|1000,1000|200,500|1000,600|1000,230|40,400|300,300|500,499|200,500|199,499|199"> 
<cfloop list="#dimlist#" index="dims"> 
    <Cfset dheight = listfirst(dims,"|")> 
    <cfset dwidth = listlast(dims,"|")> 

    <cfset hratio = dheight/500> 
    <cfset wratio = dwidth/200> 

    <cfif dwidth/hratio gte 200> 
    <cfset finalh = int(dheight/hratio)> 
    <cfset finalw = int(dwidth/hratio)> 
    <cfelse> 
    <cfset finalh = int(dheight/wratio)> 
    <cfset finalw = int(dwidth/wratio)> 
    </cfif> 

    <cfoutput> #dheight# x #dwidth# converts to #finalh# x #finalw#<br /></cfoutput> 
</cfloop> 

事實上,你可以把它變成一個功能很容易

<cfscript> 
    function CalcSz(numeric ih, numeric iw, numeric dh = 500, numeric dw = 200) { 
    var hratio = arguments.ih/arguments.dh; 
    var wratio = arguments.iw/arguments.dw; 

    if(arguments.iw/hratio > arguments.dw) { 
     var finalh = int(arguments.ih/hratio); 
     var finalw = int(arguments.iw/hratio); 
    } else { 
     var finalh = int(arguments.ih/wratio); 
     var finalw = int(arguments.iw/wratio); 
    } 
    return {height = finalh, width = finalw}; 
    } 
</cfscript> 
<cfset dimlist="1000|800,1000|1000,800|1000,1000|200,500|1000,600|1000,230|40,400|300,300|500,499|200,500|199,499|199"> 

<cfloop list="#dimlist#" index="dims"> 
    <Cfset dheight = listfirst(dims,"|")> 
    <cfset dwidth = listlast(dims,"|")> 

    <cfset dimstruct = CalcSz(dheight,dwidth)> 
    <cfoutput> #dheight# x #dwidth# converts to #dimstruct.height# x #dimstruct.width#<br /></cfoutput> 
</cfloop> 

這將返回一個包含.height和.WIDTH一個結構,你可以看到。正如你所看到的,它不存在轉換縮小規模,規模擴大或兩者非常接近(499或199)時的問題。

不用說,不要傳遞0作爲任何參數:)。

+1

這絕對是非常棒的,效果非常好。我調整我的代碼使用ceiling()而不是int(),因爲我將圖像縮放到499px而不是500px。 –

+1

@volumeone謝謝:)。感謝您嘗試編輯,你能給我一些轉換爲499的數字嗎?我想測試天花板是否可以作爲一個永久性修復程序。其他用戶拒絕了您的嘗試編輯,因爲通常您不允許更改作者的代碼。 Ceiling()使我的函數表現得稍微不同,所以他們拒絕了它。你的評論方法是正確的,讓我知道我可以改變的東西來改善它。 –