ColdFusion - чтение большого количества изображений

Каков наиболее эффективный способ чтения большого количества изображений в CF / Railo и проверки их ширины и высоты?

В моем приложении мне обычно нужно прочитать около 20 изображений +, и на данный момент это занимает до 14 секунд. Слишком долго, правда.

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

Изображения читаются из списка абсолютных URL. Мне нужно получить изображения, указанные в определенном измерении.

Если есть более быстрое решение, я бы хотел узнать ваше мнение. Возможно, лежащие в основе методы Java?

Я также использую jSoup, если есть что-то, что может помочь.

Спасибо, Майкл.

2 ответа

Я не верю, что есть какой-либо способ определить размеры изображения в пикселях без чтения байтов и создания объекта изображения. Основным узким местом здесь будут издержки http-запроса.

Тем не менее, есть несколько способов ускорить то, что вы пытаетесь сделать.

  1. используйте потоки для одновременного запроса изображений, затем, когда все потоки закончили обработку, выведите изображения.

  2. Если вы отображаете одно и то же изображение или набор изображений более одного раза, кэшируйте его. Если вы не хотите кэшировать собственно изображение, вы можете кэшировать метаданные, чтобы избежать необходимости выполнять http-запрос для каждого изображения.

  3. решить, нужно ли вам немедленно выводить все изображения на страницу, или некоторые или все из них могут быть отложены и загружены через ajax-запрос

Я написал эту функцию довольно давно (она работает и на более старых версиях ColdFusion). Может быть, это поможет.

Обратите внимание, что для этого требуются инструменты ввода / вывода Java Advanced Imaging Image ( 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)#" />');
}
Другие вопросы по тегам