如何使用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
指定<cfimage>
中的quality
属性。我不确定它是否适用于action="writeToBrowser"
,但它应该。否则,请提交错误报告。
调整大小和压缩是不同的事情。 :)
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"
/>
调整其大小不是为了使文件大小的字节数小的图像。它是通过高度和宽度使其变小。是的,通常图像文件的大小变得越来越小。但是尺寸的减少取决于源图像。
您可能希望将格式声明为png,因为这可能有助于使文件变小。
而且,你为什么包装在cfxml的cfimage标签?这是一个无用的步骤,导致额外的处理和膨胀。
因为我需要临时文件的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
因此,然后我可以跳过使用CFimage调整大小,只是通过CSS设置尺寸,这意味着我也可以跳过cfxml部分,因为没有临时文件,我仍然这样做,因为有些人使用系统,它为我设置了5MB图像。所以我需要一些方法来抓取该图像,并制作一个400像素宽,800像素宽的版本供我在系统中使用,而不是提供的5MB图像 – frequent 2012-07-13 15:51:51
通过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”。
首先。感谢您的信息。我想我喜欢缓存的想法。我很高兴我的脚本使用了临时url /路径,但也认为这不是最好的解决方案。因此,您正在检查目标文件夹中是否存在图像,如果不存在,您是否拍摄图像并调整大小到目标文件夹?如果图像来自另一台服务器,这也会起作用吗?假设我在www.foo.com上,图片位于www.bar.com/img/ – frequent 2012-07-13 21:45:26
刚刚尝试过这个真正的快速。尝试写入目标文件时遇到错误。无法真正说出原因,因为它通过AJAX运行,我无法在远程位置设置CFAdmin中的AJAX调试。我会继续玩它 – frequent 2012-07-14 06:52:30
是的,它应该工作,因为你只会检查服务器上存在调整大小的文件。通常,“无法写入目标文件”的错误意味着目标路径不正确。由于它被用作AJAX调用,所以你不会看到我放在那里的调试输出。我建议直接在URL上调用AJAX模块来查看输出变量是什么。一旦你可以看到目的地= []的值,你会很快找出错误的位置。 – 2012-07-14 08:38:52
你的数字是否正确为11.2kB nosilleg 2012-07-13 12:14:17
我想随着任何调整图像大小,你是不是修改图像,只是如何查看,所以你的文件大小将永远保持不变。 – Limey 2012-07-13 12:16:17
@nosilleg:我希望...但是它是111.2kb :-( – frequent 2012-07-13 12:19:04