ColdFusion - чтение большого количества изображений
Каков наиболее эффективный способ чтения большого количества изображений в CF / Railo и проверки их ширины и высоты?
В моем приложении мне обычно нужно прочитать около 20 изображений +, и на данный момент это занимает до 14 секунд. Слишком долго, правда.
theImageRead = ImageNew(theImageSrc);
if ( imageGetWidth(theImageRead) > 100 ) {
writeOutput('<img src="' & theImageSrc & '" />');
}
Изображения читаются из списка абсолютных URL. Мне нужно получить изображения, указанные в определенном измерении.
Если есть более быстрое решение, я бы хотел узнать ваше мнение. Возможно, лежащие в основе методы Java?
Я также использую jSoup, если есть что-то, что может помочь.
Спасибо, Майкл.
2 ответа
Я не верю, что есть какой-либо способ определить размеры изображения в пикселях без чтения байтов и создания объекта изображения. Основным узким местом здесь будут издержки http-запроса.
Тем не менее, есть несколько способов ускорить то, что вы пытаетесь сделать.
используйте потоки для одновременного запроса изображений, затем, когда все потоки закончили обработку, выведите изображения.
Если вы отображаете одно и то же изображение или набор изображений более одного раза, кэшируйте его. Если вы не хотите кэшировать собственно изображение, вы можете кэшировать метаданные, чтобы избежать необходимости выполнять http-запрос для каждого изображения.
решить, нужно ли вам немедленно выводить все изображения на страницу, или некоторые или все из них могут быть отложены и загружены через 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)#" />');
}