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 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)#" />');
}
于 2012-08-13T08:32:49.843 に答える