2012-07-13 163 views
3

可能重複:
Why should I resize an image in Coldfusion if the file size doen't decrease and the quality of the image suffers?如何使用CFImage調整大小並實際縮小圖像文件大小?

我必須在這裏做得不對...使用Coldfuison8

我有一個產品搜索它在圖片來自外部服務器拉動,所以我需要在運行時設置圖像。

說我有一個jpg 500x500px 111kb,我從外部服務器抓取。

現在我這樣做:

<cfimage name="myImage" source="#bildpfad##bilddateiname#" action="read" /> 
<cfif IsImage(myImage) is true> 
    <cfscript> 
    ImageSetAntialiasing(myImage,"on"); 
    variables.breite = 400; 
     ImageScaleToFit(myImage, variables.breite,"", "highestPerformance"); 
    </cfscript> 
<cfxml variable="imageXml"> 
    <cfimage action="writetobrowser" source="#myImage#" /> 
</cfxml> 
<cfoutput><div class="resultsImgWrap">#imageXml#</div></cfoutput> 

這還好吧顯示圖像,但是當我檢查文件大小,我有

400x400px 111.2kB 

如果我使用的IrfanView例如,只是減少文件大小和保存圖像,我已經在65kb。

問題: 如何讓CFIMAGE縮小文件大小(如果我調整圖像大小)?如果大小保持在111kb,爲什麼要使用CFIMAGE,而不是簡單地將圖像添加爲純HTML。

**編輯「」:
變量Bildpfad和Bilddateiname將是這樣的:

bildpfad (path to image):   http://www.some-server.com/images/ 
bilddateiname (filename):   some_image123.jpg 
+0

你的數字是否正確爲11.2kB <111kb,這樣你就可以得到你想要的結果。 – nosilleg 2012-07-13 12:14:17

+0

我想隨着任何調整圖像大小,你是不是修改圖像,只是如何查看,所以你的文件大小將永遠保持不變。 – Limey 2012-07-13 12:16:17

+0

@nosilleg:我希望...但是它是111.2kb :-( – frequent 2012-07-13 12:19:04

回答

2

指定<cfimage>中的quality屬性。我不確定它是否適用於action="writeToBrowser",但它應該。否則,請提交錯誤報告。

調整大小和壓縮是不同的事情。 :)

參見:Why should I resize an image in Coldfusion if the file size doen't decrease and the quality of the image suffers?

UPDATE

好消息,有得到它的工作的無證方式!參見:http://www.bennadel.com/blog/2405-Using-The-Quality-Attribute-With-The-CFImage-WriteToBrowser-Action.htm

<!--- Write out as a JPG at 20% (using "quality" attribute). ---> 
<cfimage 
    action="writeToBrowser" 
    source="#png#" 
    format="jpg" 
    quality=".2" 
    /> 
+0

你發現我的另一個問題:-)我仍然與這... – frequent 2012-07-13 16:54:18

+0

哦,不知道你還在掙扎着。你爲什麼又問同樣的問題?調整「品質」屬性對你不起作用? – Henry 2012-07-13 17:12:29

+0

沒有工作。不知道是否因爲writeToBrowser,但圖像大小沒有改變一點。我仍然有一些客戶爲我設置了巨大的圖像,以便在我的產品搜索中顯示,因此我需要一些將圖像縮小到縮略圖(寬度爲200像素)和細節視圖(寬度爲600像素)的方法。 – frequent 2012-07-13 17:21:06

1

調整其大小不是爲了使文件大小的字節數小的圖像。它是通過高度和寬度使其變小。是的,通常圖像文件的大小變得越來越小。但是尺寸的減少取決於源圖像。

您可能希望將格式聲明爲png,因爲這可能有助於使文件變小。

而且,你爲什麼包裝在cfxml的cfimage標籤?這是一個無用的步驟,導致額外的處理和膨脹。

+0

因爲我需要臨時文件的URL /路徑[看到這裏](http://www.bennadel.com/blog/1890-Getting-The-Image-SRC-Of-ColdFusion-s-CFImage-WriteToBrowser-Temporary-Image-With-CFXML.htm) – frequent 2012-07-13 15:47:16

+0

因此,然後我可以跳過使用CFimage調整大小,只是通過CSS設置尺寸,這意味着我也可以跳過cfxml部分,因爲沒有臨時文件,我仍然這樣做,因爲有些人使用系統,它爲我設置了5MB圖像。所以我需要一些方法來抓取該圖像,並製作一個400像素寬,800像素寬的版本供我在系統中使用,而不是提供的5MB圖像 – frequent 2012-07-13 15:51:51

+0

通過css設置尺寸是一個壞主意。這完全不會影響圖像大小。此外,在更改尺寸時,嘗試維持寬高比時會遇到問題。即使圖像大小存在細微差異,也最好在服務器中調整大小。另外,我認爲你可以使用cfsavecontent來獲取圖像路徑。這應該會更快,因爲沒有xml開銷。 – 2012-07-13 16:00:20

1

的使用的行動=‘writetobrowser’'將使用源圖像的副本。它會創建一個臨時文件,將其推送到瀏覽器並在以後銷燬。

下面是從CF 8文檔的一句話:

「使用writeToBrowser動作,而不將它們寫入文件直接顯示一個或多個圖像的ColdFusion的瀏覽器。」

我測試了你的代碼與CF8與一張大照片(4608x3456)@ 3.47MB。我的瀏覽器上顯示的圖像被調整爲400x300 @ 247.47KB。我使用Firefox右鍵單擊|查看圖像信息以獲取調整大小的圖像信息。您也可以使用Firebug |淨選項卡以獲取傳輸的圖像大小。

調整大小的圖像將位於「/ CFFileServlet/_cf_image /」中。

原始文件(#bildpfad ## bilddateiname#)的大小不會更改。

不要依賴於設計爲臨時文件的存在。暫時就是這個意思。即使它是相同的源圖像,在10分鐘後調整大小的文件名也可能不是相同的文件名。臨時文件也可以在不同版本的CF之間進行不同的處理。

如果您需要保留調整大小的圖像的副本,請使用action =「write」或action =「resize」作爲目標屬性,並將大小調整的圖像的副本保存到CF服務器上。

這裏是它如何可以工作的例子:

<!---assume that bildpfad can be different domains/folders---> 
<!---RegEx = remove protocol, replace '/' with '!', replace '.' with '~'---> 
<cfset slashReplacement = "!"> 
<cfset periodReplacement = "~"> 
<cfset imageFilename = REReplace(REReplace(REReplaceNoCase(bildpfad, "https?://", "", "one"), "\/", slashReplacement, "all"), "\.", periodReplacement, "all") & bilddateiname> 
<!---resizedImgDestination is a web path---> 
<cfset resizedImgDestination = "/images/resized/rs_#imageFilename#"> 
<!---debug info, can comment out when working---> 
<cfoutput>source = [#bildpfad##bilddateiname#]<br />destination = [#ExpandPath(resizedImgDestination)#]<br /></cfoutput> 
<!---/debug info, can comment out when working---> 
<cfif NOT FileExists(ExpandPath(resizedImgDestination))> 
    <cfhttp url="#bildpfad##bilddateiname#" result="stGetImg" resolveurl="no" useragent="Mozilla/5.0 (Windows NT 6.1; WOW64; rv:13.0) Gecko/20100101 Firefox/13.0.1" timeout="45" getasbinary="yes" throwonerror="no" /> 
    <cfset myImage = ImageNew(stGetImg.FileContent)> 
    <cfif IsImage(myImage)> 
     <cfimage action="resize" destination="#ExpandPath(resizedImgDestination)#" height="" isbase64="false" overwrite="true" source="#myImage#" width="400" /> 
    </cfif> 
</cfif> 
<cfoutput><img src="#resizedImgDestination#" /></cfoutput> 

通過保留高度爲空字符串,它會調整大小和縮放高度按比例匹配的寬度。

您將不得不從您的網站web根目錄創建'/ images/resized /'文件夾。

ExpandPath()比使用靜態路徑定義更好。如果您不得不將網站移動到不同的服務器或操作系統,它將節省大量時間。

注:我更新了上面的代碼以更好地適應問題中變量的使用。我也改變了圖像的閱讀方式。我安裝了裝有CHF 4 +修補程序的CF 8.01,但在讀取遠程文件時,出現錯誤(在JPG處理中發生異常,段大小超出文件流長度)與cfimage。我的解決方案是使用cfhttp來讀取圖像。我還更新了代碼以使用更好的命名變量「resizedImgDestination」。

+0

首先。感謝您的信息。我想我喜歡緩存的想法。我很高興我的腳本使用了臨時url /路徑,但也認爲這不是最好的解決方案。因此,您正在檢查目標文件夾中是否存在圖像,如果不存在,您是否拍攝圖像並調整大小到目標文件夾?如果圖像來自另一臺服務器,這也會起作用嗎?假設我在www.foo.com上,圖片位於www.bar.com/img/ – frequent 2012-07-13 21:45:26

+0

剛剛嘗試過這個真正的快速。嘗試寫入目標文件時遇到錯誤。無法真正說出原因,因爲它通過AJAX運行,我無法在遠程位置設置CFAdmin中的AJAX調試。我會繼續玩它 – frequent 2012-07-14 06:52:30

+0

是的,它應該工作,因爲你只會檢查服務器上存在調整大小的文件。通常,「無法寫入目標文件」的錯誤意味着目標路徑不正確。由於它被用作AJAX調用,所以你不會看到我放在那裏的調試輸出。我建議直接在URL上調用AJAX模塊來查看輸出變量是什麼。一旦你可以看到目的地= []的值,你會很快找出錯誤的位置。 – 2012-07-14 08:38:52