16

jpeg ファイルが破損しているかどうかを検出する効率的な方法はありますか?

背景情報:
  ソリューションは php スクリプト内から動作する必要があり
  ます jpeg ファイルはディスク上に
  あります 手動チェックはオプションではありません (ユーザーがアップロードしたデータ)

私はそれimagecreatefromjpeg(string $filename);ができることを知っています。しかし、そうするのはかなり遅いです。

より高速で効率的なソリューションを知っている人はいますか?

4

8 に答える 8

18

コマンドラインから jpeginfo を使用して、jpeg ファイルに問題がないかどうかを調べることができます。

$ jpeginfo -c test.jpeg

test.jpeg 260 x 264 24bit JFIF N 15332 [OK]

php から jpeginfo を呼び出すのは簡単です。

于 2008-10-13T18:19:47.403 に答える
9

私の最も簡単な(そして最速の)解決策:


function jpeg_file_is_complete($path) {
    if (!is_resource($file = fopen($path, 'rb'))) {
        return FALSE;
    }
    // check for the existence of the EOI segment header at the end of the file
    if (0 !== fseek($file, -2, SEEK_END) || "\xFF\xD9" !== fread($file, 2)) {
        fclose($file);
        return FALSE;
    }
    fclose($file);
    return TRUE;
}

function jpeg_file_is_corrupted($path) {
    return !jpeg_file_is_complete($path);
}

注: これは破損したファイル構造を検出するだけで、破損した画像データは検出しません。

于 2009-10-25T23:55:25.193 に答える
6

参考までに --上記の方法 ( jpeg_file_is_complete)を使用して、破損していることがわかっている JPEG をテストしました (たとえば、ブラウザーに読み込むと、下部が灰色になります。つまり、画像が「切り取られています」)。とにかく、そのイメージで上記のテストを実行したところ、破損しているとは検出されませんでした。

これまでのところ、使用imagecreatefromjpeg()は機能しますが、それほど高速ではありません。を使用jpeginfoすると、これらのタイプの破損した画像を検出することもでき、よりも高速であることがわかりましたimagecreatefromjpeg(PHP で を使用してベンチマークを実行しましたmicrotime())。

于 2010-05-03T20:33:27.003 に答える
-1

MD5 に基づいてファイル ハッシュを生成し、それをチェックサムとして使用して、さまざまな手順で JPEG データを検証することもできます。たとえば、ファイルからの読み取り後、転送後などです。

于 2010-01-22T18:15:38.433 に答える
-3

単純な getimagesize() を使用した別のソリューションがあります

if(!getimagesize($image_url)) echo 'Image is corrupt or not readable';
于 2014-03-28T20:25:05.023 に答える