我有一个客户想要在运行 ColdFusion 10 的 IIS 服务器上为他们的图像添加水印。我正在寻找任何方法来避免通过批量更新破坏所有图像,并且必须同时管理带水印的版本和原始版本。
是否可以使用 ColdFusion 即时为高分辨率图像添加水印,而不会使服务器过载?我在想,如果我使用 robots.txt 从搜索引擎流量中排除该文件夹,那么它不会超过访问者的流量,这是可能的。像这样的灵活解决方案将是理想的,允许客户端更新水印的外观而无需重新批处理。
你会怎么处理?
我有一个客户想要在运行 ColdFusion 10 的 IIS 服务器上为他们的图像添加水印。我正在寻找任何方法来避免通过批量更新破坏所有图像,并且必须同时管理带水印的版本和原始版本。
是否可以使用 ColdFusion 即时为高分辨率图像添加水印,而不会使服务器过载?我在想,如果我使用 robots.txt 从搜索引擎流量中排除该文件夹,那么它不会超过访问者的流量,这是可能的。像这样的灵活解决方案将是理想的,允许客户端更新水印的外观而无需重新批处理。
你会怎么处理?
这实际上包含在 Adobe ColdFusion 文档中。
首先是操纵 ColdFusion 图像- 页面底部附近有一个关于创建水印的部分(每个项目符号都在该页面上进行了更详细的讨论)
水印是叠加在另一幅图像上的半透明图像。水印的一种用途是保护受版权保护的图像。要在 ColdFusion 中创建水印,请使用 ImageSetDrawingTransparency 函数和 ImagePaste 函数。您可以通过以下三种方式之一创建水印图像:
- 从现有图像文件创建水印。例如,您可以使用公司徽标作为水印。
- 在 ColdFusion 中创建文本图像并将图像应用为水印。例如,您可以创建一个文本字符串,如版权或证明,并将其应用于照片库中的所有图像。
- 在 ColdFusion 中创建绘图图像并将其用作水印。例如,您可以使用绘图功能创建一个绿色复选标记并将其应用于已批准的图像。
然后是向浏览器写入图像- 讨论如何将图像直接写入浏览器而不将它们写入磁盘。
使用 cfimage 标记的 writeToBrowser 操作直接在浏览器中显示图像,而不将它们写入文件。此技术对于测试 ColdFusion 图像的外观很有用。
他们甚至在使用 ColdFusion 图像的应用程序示例下生成了一个水印图像库- 大约在该页面的一半处。
这些例子应该让你继续前进。
一个好的解决方案是为已加水印的图像创建一个新文件夹(例如 /images/watermarked/),然后添加一个 Web 服务器重写规则,检查该文件是否存在于文件夹中,如果不存在存在于文件夹中,则重定向规则通过 CF 运行请求,并允许您生成带水印的图像并将其存储在文件夹中以供将来使用。
您可以使用 IIS 重写模块来执行此操作,查看此链接以获取类似的解决方案:如果文件存在,则返回文件,如果文件不退出,则重写
该解决方案的好处是通过 Web 服务器提供图像并在大多数情况下避免涉及 CF。然后,如果你有一个新的水印,你只需清空 /images/watermarked/ 文件夹,它就会在请求进入时开始生成新的水印。
如果您有更复杂的需求,那么您可能需要查看 mod_xsendfile(来自 Helicon 的 Apache 模块或 IIS 模块)。
Ben Nadel 的博客系列很好地涵盖了这一点: http ://www.bennadel.com/blog/775-Learning-ColdFusion-8-CFImage-Part-III-Watermarks-And-Transparency.htm
这取决于图像对于服务器负载的实际大小,以及您的服务器有多丰富。
我所做的是通过 ajax 调用渲染图像(即放置一个微调器直到它被加载,然后用渲染/水印图像替换 HTML)。
您还可以轻松地拥有一个已加水印图像的缓存文件夹,然后脚本在缓存文件夹上执行 fileExists(),如果它已经存在,则提供该文件夹。
这是一个简单的逻辑,用于处理安装在我的 linux 服务器驱动器上的 IIS 服务器中的图像。从后者开始,我为每个图像添加水印并将它们分成由文件夹表示的每个组。我每天处理大约 800-1000 张非常高质量的图像(文件的最小大小为 10MB)。但是,如果 CF10 中的 ImgaWrite 函数,我使用质量参数降低质量。
<cfloop array="myArrayofStructs" index="carr">
<cfif len(carr.tempPath) GT 0>
<cfif !directoryexists(Dirdestn&carr.tempPath&"/")>
<cfset DirectoryCreate(Dirdestn&carr.tempPath&"/")>
<cfelse>
<!---Do Nothing--->
</cfif>
<cfset destn=Dirdestn&carr.tempPath&"/"&carr.photoid&".jpg">
<cfset source=Expandpath("/imagebank/"&carr.filename)>
<cfif fileexists(Expandpath("/imagebank/"&carr.filename)) AND IsImageFile(Expandpath("/imagebank/"&carr.filename))>
<cfif !fileexists(destn)>
<cfimage source="#source#" name="image_1">
<cfset imagepaste(image_1, watermark, 500, 0)> <cfset imageWrite(image_1, destn,0)>
</cfif>
</cfif>
与您的问题没有直接关系,但如果您的客户不希望通过网络直接访问无水印图像,我认为仅使用 robots.txt 从搜索引擎中排除该文件夹是不够的,因为您正在有效地指出任何查看 robots.txt 到该文件夹的人。您应该将您的原始图像放在一个不可通过网络访问的目录中。
这个答案(如何通过命令行向图像添加水印 - 希望使用 Irfanview)看起来像业务,只是提供一个临时文件,使用该方法动态生成。(它不使用 IrfanView)。我不熟悉 ColdFusion,所以这取决于你。