如何使用CFImage调整大小并实际缩小图像文件大小?

问题描述:

可能重复:
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 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

指定<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

调整其大小不是为了使文件大小的字节数小的图像。它是通过高度和宽度使其变小。是的,通常图像文件的大小变得越来越小。但是尺寸的减少取决于源图像。

您可能希望将格式声明为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

的使用的行动=‘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