Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用CFImage调整大小并实际减小图像文件大小?_Image_Coldfusion_Resize_Cfimage - Fatal编程技术网

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

如何使用CFImage调整大小并实际减小图像文件大小?,image,coldfusion,resize,cfimage,Image,Coldfusion,Resize,Cfimage,可能重复: 我一定是做错了什么。。。使用Coldfuison8 我有一个产品搜索,它从外部服务器获取图像,所以我需要在运行时设置图像 假设我有一个jpg 500x500px 111kb,我正在从外部服务器获取它 现在我正在这样做: <cfimage name="myImage" source="#bildpfad##bilddateiname#" action="read" /> <cfif IsImage(myImage) is true> <cfscr

可能重复:

我一定是做错了什么。。。使用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>
例如,如果我使用IrfanView,只需减小文件大小并保存图像,我已经达到了65kb

问题: 如果调整图像大小,如何使CFIMAGE减小文件大小?如果大小保持在111kb,为什么要使用CFIMAGE,而不是简单地将图像添加为纯HTML

**编辑“”:
变量Bildpfad和Bilddateiname类似于:

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

调整图像大小的目的不是使文件大小以字节为单位变小。这是为了使它的高度和宽度更小。是的,通常图像文件的大小会变小。但尺寸的减小取决于源图像

您可能希望将格式声明为png,因为这可能有助于缩小文件


另外,为什么要用cfxml包装cfimage标记?这是一个无用的步骤,会导致额外的处理和膨胀。

中指定
质量属性。我不确定它是否适用于
action=“writeToBrowser”
,但它应该可以。否则,请提交错误报告

调整大小和压缩是不同的事情。:)

见:

更新

好消息,有一种未经证明的方法可以让它工作!见:


使用'action=“writetobrowser”'将使用源图像的副本。它将创建一个临时文件,该文件将被推送到浏览器并在以后销毁

以下是CF 8文档中的一个短语:

“使用writeToBrowser操作可将一个或多个ColdFusion图像直接显示到浏览器,而无需将其写入文件。”

我用CF8测试了你的代码,并在3.47MB的空间内拍摄了一张大照片(4608x3456)。我的浏览器上显示的图像大小已调整为400x300@247.47KB。我使用Firefox右键单击|查看图像信息来获取调整大小的图像信息。您还可以使用Firebug | Net选项卡获取传输的图像大小

调整大小的图像将位于“/CFFileServlet/\u cf\u image/”中

原始文件(#bildpfad###bilddatename#)的大小不会更改

不要依赖于设计为临时文件的存在。临时的意思就是这样。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>

源=[#bildpfad###bilddateiname#]
目标=[#扩展路径(resizedImgDestination)#]
通过将高度保留为空字符串,它将调整高度大小并按比例缩放高度以匹配宽度

您必须从网站的web根目录创建“/images/resized/”文件夹

ExpandPath()优于使用静态路径定义。如果你不得不将一个站点移动到不同的服务器或操作系统上,这将节省很多时间


注意:我更新了上面的代码,以便更好地适应问题中变量的使用。我还改变了图像的读取方式。我安装了带有CHF 4+修补程序的CF 8.01,但在读取远程文件时,我遇到了一个错误(JPG处理中发生异常。段大小将超出文件流长度)。我的解决方案是使用cfhttp来读取图像。我还更新了代码,使用了一个名称更好的变量“resizedImgDestination”。

您的数字是否正确为11.2kB<111kb,这样您就可以得到所需的结果。我认为,任何图像大小调整都不会修改图像,而只是修改图像的查看方式,因此您的文件大小将始终保持不变。@nosilleg:我希望。。。但是它是111.2kb:-(@Limey:在这种情况下,我真的可以跳过所有的CFIMAGE处理,不是吗?尽管我认为这是不对的。上面你说的是“400x400px 11.2kb”这不是111.2kb,因为我需要临时文件URL/路径,这样我就可以跳过使用CFimage调整大小的步骤,并通过CSS设置尺寸。这意味着我也可以跳过cfxml部分,因为没有临时文件。我仍然在这样做,因为有一些人使用该系统,为我设置5MB图像。所以我需要获取该图像并制作一个400px宽+800px宽的版本,以供我在系统中使用,而不是提供的5MB img,通过css设置尺寸是一个坏主意。这对图像大小没有任何影响。此外,在更改大小时,您在尝试保持纵横比时会遇到问题。您最好在s中调整大小服务器,即使图像大小略有差异。此外,我认为您可以使用cfsavecontent获取图像路径。这应该更快,因为没有xml开销。CSS是出于绝望……您所说的“在服务器中调整大小”是什么意思?我以为cfimage是“在服务器中调整大小”:-)jpeg(有损)可以压缩得比png(无损)多得多特别是照片。这只是使用
quality
属性在cfimage中启用压缩的问题,就像我在下面的回答中所说的那样。你发现了我的另一个问题:-)我还在为此奋斗……哦,不知道你还在为此奋斗。你为什么又问同样的问题?调整
quality
属性对您无效??无效。不确定是否是因为writeToBrowser,但图像大小没有任何变化。我仍然有一些客户为我设置了巨大的图像,以便我在产品搜索中显示,所以
<!--- Write out as a JPG at 20% (using "quality" attribute). --->
<cfimage
    action="writeToBrowser"
    source="#png#"
    format="jpg"
    quality=".2"
    />
<!---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>