使用CF8 CFIMAGE标签生成缩略图 - 图像元数据引起的大文件

发布于 2024-10-28 20:06:53 字数 396 浏览 1 评论 0原文

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

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

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

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

无论如何我可以去掉 exif &使用 CF8 的任何内置图像功能从图像中获取 IPTC 元数据来减小缩略图大小?

i'm building a small web app that will resize images to different pixel dimensions after they have been uploaded.

I am attempting to create 150px X 100px thumbnail from a 3mb jpg image, but am unable to get the filesize smaller than 68kb ( I would expect to generate a file between 4kb & 15kb file depending on compression type etc).

I have used the action="resize" method of the tag & also used the ImageResize() & imageScaleToFit() functions but all these methods keep the exif & IPTC meta data intact (I am assuming this is what is keeping the thumbnail file as large as it is).

If I use an image without any metadata it resizes the thumbnail to a small filesize as expected.

Is there anyway I can strip the exif & IPTC metadata from the image to reduce the thumbnail size using any of CF8's built in image functions?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

不甘平庸 2024-11-04 20:06:53

您可以使用 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 验证所有内容是否已删除。

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

you can use the Sanselan Java library to remove EXIF and IPTC metadata. Here is a code sample using the removeExifMetadata from this library:

<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>

You can do the same to remove IPTC meta data using iptc.JpegIptcRewriter and the removeIPTC method. You can verify using the CF functions ImageGetEXIFMetaData and ImageGetIPTCMetadata that everything has been removed.

Now I'm not sure that it will really reduce the file size, let me know :-)

抚笙 2024-11-04 20:06:53

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

You can create a new image the same dimensions as the thumbnail and use ImagePaste to paste in the thumbnail. ColdFusion does not preserve EXIF data with the paste operation.

薄凉少年不暖心 2024-11-04 20:06:53

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

If you wanted to, you could use the command line tool that is linked in the post that @Ciaran Archer linked above, and then write a bash command (*nix/Mac) or bat command (Windows) that runs the command and then use CFExecute to run that command. I have never really worked with CFImage before or image metadata so I couldn't give you the proper code, but what I said will probably have the best performance, because you are exporting commands to the filesystem is made to do (work with files).

硪扪都還晓 2024-11-04 20:06:53

看看这个:
使用

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 的质量比来减小文件大小。

Check this out:
Use

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

instead of

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

Select quality ratio from 0 to 1 to reduce the file size.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文