1

在 CF / Railo 中读取大量图像并检查它们的宽度和高度的最有效方法是什么?

在我的应用程序中,我通常需要阅读大约 20 张图片 +,目前这需要 14 秒才能完成。真的有点太长了。

theImageRead = ImageNew(theImageSrc);
if ( imageGetWidth(theImageRead) > 100 ) {
    writeOutput('<img src="' & theImageSrc & '" />');
}

图像是从绝对 URL 列表中读取的。我需要获取在某个维度上指定的图像。

如果对此有更快的解决方案,那么我很想得到您的见解。也许是底层的java方法?

如果有什么可以帮助的话,我也在使用 jSoup。

谢谢,迈克尔。

4

2 回答 2

5

我不相信有任何方法可以在不读取字节并创建图像对象的情况下确定图像的像素尺寸。这里的主要瓶颈将是 http 请求开销。

那就是说有几种方法可以加快您尝试做的事情。

  1. 使用线程并发请求图像,然后当所有线程完成处理后输出图像。

  2. 如果您多次显示相同的图像或图像集,请将其缓存。如果您不想缓存实际图像,您可以缓存元数据以避免必须为每个图像执行 http 请求。

  3. 决定是否需要立即将所有图像输出到页面,或者是否可以通过 ajax 请求延迟和加载其中的部分或全部

于 2012-08-13T09:15:04.160 回答
2

我很久以前就写过这个实用函数(它也可以在旧的 ColdFusion 版本上运行)。也许它有帮助。

请注意,这需要Java 高级成像图像 I/O 工具( 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)#" />');
}
于 2012-08-13T08:32:49.843 回答