在CF / Railo中读取大量图像并检查其宽度和高度的最有效方法是什么?
在我的应用程序中,我通常需要读取大约20张图像+,目前这需要14秒才能完成。真的有点太长了。
theImageRead = ImageNew(theImageSrc);
if ( imageGetWidth(theImageRead) > 100 ) {
writeOutput('<img src="' & theImageSrc & '" />');
}
从绝对URL列表中读取图像。我需要在特定维度上指定图像。
如果有更快的解决方案,那么我很想获得您的见解。也许底层的java方法?
如果有任何可以提供帮助的东西,我也在使用jSoup。
谢谢, 迈克尔。
答案 0 :(得分:5)
我不相信有任何方法可以在不读取字节和创建图像对象的情况下确定图像的像素尺寸。这里的主要瓶颈是http请求开销。
说有几种方法可以加快你想要做的事情。
使用线程并发请求图像,然后当所有线程完成处理输出图像时。
如果您多次显示相同的图像或图像集进行缓存。如果您不想缓存实际图像,则可以缓存元数据,以避免必须为每个图像执行http请求。
决定是否需要立即将所有图像输出到页面,或者可以通过和ajax请求延迟和加载部分或全部图像
答案 1 :(得分:2)
我之前写过这个实用程序函数(它也运行在较旧的ColdFusion版本上)。也许有帮助。
请注意,这需要Java Advanced Imaging Image I/O Tools(Jai-imageio)。下载.jar并将其放在类路径中(需要重新启动CF)。
/**
* Reads basic properties of many types of images. Values are
* returned as a struct consisting of the following elements:
*
* Property names, their types and default values:
* ImgInfo.width = 0 (pixels)
* ImgInfo.height = 0 (pixels)
* ImgInfo.size = 0 (bytes)
* ImgInfo.isGrayscale = false (boolean)
* ImgInfo.isFile = false (boolean)
* ImgInfo.success = false (boolean)
* ImgInfo.error = "" (string)
*
* @param FilePath Physical path to image file.
* @return A struct, as described.
*/
function GetImageProperties(FilePath) {
var ImgInfo = StructNew();
var jImageIO = CreateObject("java", "javax.imageio.ImageIO");
var jFile = CreateObject("java", "java.io.File").init(FilePath);
var jBufferedImage = 0;
var jColorSpace = 0;
ImgInfo.width = "";
ImgInfo.height = "";
ImgInfo.fileSize = 0;
ImgInfo.isGrayscale = false;
ImgInfo.isFile = jFile.isFile();
ImgInfo.success = false;
ImgInfo.error = "";
try {
jBufferedImage = jImageIO.read(jFile);
ImgInfo.fileSize = jFile.length();
ImgInfo.width = jBufferedImage.getWidth();
ImgInfo.height = jBufferedImage.getHeight();
jColorSpace = jBufferedImage.getColorModel().getColorSpace();
ImgInfo.isGrayscale = (jColorSpace.getType() eq jColorSpace.TYPE_GRAY);
ImgInfo.success = true;
}
catch (any ex) {
ImgInfo.error = ToString(ex);
}
jImageIO = JavaCast("null", "");
jFile = JavaCast("null", "");
jBufferedImage = JavaCast("null", "");
jColorSpace = JavaCast("null", "");
return ImgInfo;
}
使用类似:
imageInfo = GetImageProperties(theImageSrc);
if (imageInfo.success and imageInfo.width > 100)
writeOutput('<img src="#HTMLEditFormat(theImageSrc)#" />');
}