【问题标题】:generating thumbnails using CF8 cfimage tag - large filesize caused by image metadata使用 CF8 cfimage 标签生成缩略图 - 由图像元数据引起的大文件
【发布时间】:2011-07-28 02:04:32
【问题描述】:

我正在构建一个小型网络应用程序,该应用程序将在上传图像后将其调整为不同的像素尺寸。

我正在尝试从 3mb jpg 图像创建 150px X 100px 缩略图,但无法获得小于 68kb 的文件(我希望根据压缩类型等生成 4kb 和 15kb 文件之间的文件)。

我使用了标签的 action="resize" 方法,还使用了 ImageResize() 和 imageScaleToFit() 函数,但所有这些方法都保持 exif 和 IPTC 元数据完整(我假设这是保持缩略图文件尽可能大)。

如果我使用没有任何元数据的图像,它会将缩略图调整为预期的小文件大小。

我是否可以使用任何 CF8 的内置图像功能从图像中去除 exif 和 IPTC 元数据以减小缩略图大小?

【问题讨论】:

  • 抱歉,在我的问题中没有澄清 - 这个应用程序将托管在共享主机上,所以我无权运行任何系统 cmds 或 标签。

标签: coldfusion thumbnails coldfusion-8 iptc


【解决方案1】:

您可以使用Sanselan Java 库来删除 EXIF 和 IPTC 元数据。下面是使用该库中的 removeExifMetadata 的代码示例:

<cfscript>
// setup and init the Sanselan library
SanselanPath = arrayNew(1);
arrayAppend(SanselanPath, expandPath("sanselan\sanselan-0.97-incubator.jar"));
javaloader = createObject("component", "javaloader.JavaLoader").init(SanselanPath);

// setup your source and destination image
pathToInFile = ExpandPath("myImage.jpg");
pathToOutFile = ExpandPath("MyImagewoEXIF.jpg");
inFile = javaloader.create("java.io.FileInputStream").init(pathToInFile);
outFile = javaloader.create("java.io.FileOutputStream").init(pathToOutFile);

// create the exifRewriter 
exifRewriter = javaloader.create("org.apache.sanselan.formats.jpeg.exifRewrite.ExifRewriter").init();

// call the method removeExifMetadata
exifRewriter.removeExifMetadata(inFile,outFile);
outFile.close();
</cfscript>

您可以使用 iptc.JpegIptcRewriterremoveIPTC 方法删除 IPTC 元数据。您可以使用 CF 函数 ImageGetEXIFMetaData 和 ImageGetIPTCMetadata 验证所有内容都已删除。

现在我不确定它是否真的会减小文件大小,请告诉我:-)

【讨论】:

    【解决方案2】:

    您可以创建与缩略图相同尺寸的新图像,然后使用ImagePaste 粘贴缩略图。 ColdFusion 不会通过粘贴操作保留 EXIF 数据。

    【讨论】:

    • 我在搜索答案时确实遇到了这种方法 - 问题是当我尝试这个时,它仍然保留元数据,无论我将带有元数据的图像设置为 image1(基本图像)还是图像2(顶部粘贴的图像)。
    【解决方案3】:

    如果您愿意,可以使用上面@Ciaran Archer 链接的帖子中链接的命令行工具,然后编写运行该命令的 bash 命令 (*nix/Mac) 或 bat 命令 (Windows)然后使用 CFExecute 运行该命令。我以前从未真正使用过 CFImage 或图像元数据,所以我无法给你正确的代码,但我所说的可能会有最好的性能,因为你将命令导出到文件系统是为了做(使用文件) .

    【讨论】:

      【解决方案4】:

      看看这个: 使用

      ImageWrite(imageObject,destination,0.9,true) returns small sized image (90% quality, overwrite="true")
      

      而不是

      ImageWrite(imageObject,destination,true,0.9) returns big sized image (quality="true" which is 1, overwrite="0.9" which is true)
      

      从 0 到 1 选择质量比以减小文件大小。

      【讨论】:

      • 不确定您的意思? imageWrite() 函数只接受 3 个参数
      • ImageWrite(name, destination, quality, overwrite) help.adobe.com/en_US/ColdFusion/9.0/CFMLRef/… 所以像我上面提到的那样使用它。
      • 哦,在 CF8 中没有最后一个(覆盖)参数。但无论如何,您可以像这样设置图像质量 ImageWrite(name, destination, 0.9)
      猜你喜欢
      • 2010-11-26
      • 2011-09-03
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      • 2014-07-11
      • 2016-11-16
      • 2011-07-16
      • 2012-08-18
      相关资源
      最近更新 更多