首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用CFImage调整大小,并实际减少图像文件的大小?

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

Stack Overflow用户
提问于 2012-07-13 11:53:34
回答 3查看 6.3K关注 0票数 3

可能重复: Why should I resize an image in Coldfusion if the file size doen't decrease and the quality of the image suffers?

我一定是在做错事..。使用Coldfuison8

我有一个产品搜索,它从外部服务器获取图像,所以我需要在运行时设置图像。

假设我有一个jpg 500x500px111kb,它是我从外部服务器获取的。

现在我要做的是:

代码语言:javascript
复制
<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>

这可以显示图像,但是当我检查文件大小时,我有

代码语言:javascript
复制
400x400px 111.2kB

例如,如果我使用IrfanView,并且只是缩小文件大小并保存图像,我已经在65 at。

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

**编辑‘’:

变量Bildpfad和Bilddateiname如下所示:

代码语言:javascript
复制
bildpfad (path to image):         http://www.some-server.com/images/
bilddateiname (filename):         some_image123.jpg
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-07-13 16:44:50

quality中指定<cfimage>属性。我不确定它是否适用于action="writeToBrowser",但应该这样做。否则,提交错误报告。

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

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

更新

好消息,有一种没有文件记录的方法可以让它正常工作!请参阅:http://www.bennadel.com/blog/2405-Using-The-Quality-Attribute-With-The-CFImage-WriteToBrowser-Action.htm

代码语言:javascript
复制
<!--- Write out as a JPG at 20% (using "quality" attribute). --->
<cfimage
    action="writeToBrowser"
    source="#png#"
    format="jpg"
    quality=".2"
    />
票数 2
EN

Stack Overflow用户

发布于 2012-07-13 15:37:55

调整图像大小并不是为了使文件大小变小(以字节为单位)。它是为了使它的高度和宽度变小。是的,通常情况下,图像文件的大小确实会变小。但这种尺寸的缩小取决于源图像。

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

另外,为什么要在cfxml中包装cfimage标记?这是一个无用的步骤,正在造成额外的处理和膨胀。

票数 1
EN

Stack Overflow用户

发布于 2012-07-13 21:21:15

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

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

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

我用一个大照片(4608x3456) @ 3.47MB测试了您的代码。显示在我的浏览器上的图像被调整为400x300 @ 247.47KB。我使用Firefox右键单击“查看图像信息”以获取调整大小的图像信息。您还可以使用Firebug扣网选项卡来获取传输的图像大小。

调整大小的图像将位于"/CFFileServlet/_cf_ image /“中。

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

不要依赖于设计为临时文件的存在。暂时的意思就是那个。一个调整大小的文件名在10分钟后调整大小时可能不是相同的文件名,即使它是相同的源图像。临时文件也可以在不同版本的CF之间进行不同的处理。

如果需要保留大小调整的图像的副本,请使用带有目标属性的action=“写”或action=“调整大小”,并在CF服务器上保存调整大小图像的副本。

下面是它如何工作的示例:

代码语言:javascript
复制
<!---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>

通过将高度保留为空字符串,它将调整高度的大小和比例,使其与宽度成比例地匹配。

你必须从你的网站根目录创建‘/图像/调整大小/’文件夹。

ExpandPath()比使用静态路径定义更好。如果你必须移动一个站点到不同的服务器或操作系统,这将节省大量的时间。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11469988

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档