3

可能重复:
如果文件大小没有减小并且图像质量受到影响,我为什么要在 Coldfusion 中调整图像大小?

我一定在这里做错了什么......使用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。

**EDIT'':
变量 Bildpfad 和 Bilddateiname 将类似于:

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

3 回答 3

2

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

调整大小和压缩是不同的东西。:)

请参阅:如果文件大小没有减小并且图像质量受到影响,为什么我应该在 Coldfusion 中调整图像大小?

更新

好消息,有一种无证的方法可以让它工作!请参阅: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"
    />
于 2012-07-13T16:44:50.227 回答
1

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

这是 CF 8 文档中的一句话:

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

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

调整大小的图像将位于“/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,但是在读取远程文件时,使用 cfimage 出现错误(JPG 处理中发生异常。段大小将超出文件流长度)。我的解决方案是使用 cfhttp 来读取图像。我还更新了代码以使用更好的命名变量“resizedImgDestination”。

于 2012-07-13T21:21:15.587 回答
1

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

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

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

于 2012-07-13T15:37:55.723 回答