2011-01-31 1 views
5

私はコミュニティのウェブサイトを構築しました。そこではユーザーが写真をアップロードし、サムネイルをクリアすることができます。PHP:jpegが完全に黒(画像なし)かどうかを検出するにはどうすればいいですか?

しかし、何らかの理由でそれらの一部が空白(実際には黒いjpegサムネイル)を生成します。

私は別のソリューションを試しましたが、これは大きな画像やJSが有効になっていないコンピュータで発生しているようですが、私は知らない...

ボトムライン、これは非常に小さいので、私はパッチを作成することを考えていた:ユーザーが空のjpegを生成すると検出する。それら。

あなたはそれを行う方法を知っていますか?

答えて

1

あなたはそのに有効な黒画像をしたと仮定すると:

長い道のり - 黒

短い道のピクセルによってスキャンピクセル(あれば常に同じ黒画像) - (バイトで、ファイルのバイトを比較またはMD5ハッシュ)サンプル黒画像

+0

2番目のオプションは機能しません。幅、高さ、圧縮率、コーデックの組み合わせごとに別々のコピーが必要です... – Joe

+0

ID3ヘッダーや他のメタデータが激しく違うので、私は短い方法ではうまくいかないと思っています...しかし、私はできます –

+0

が間違っていても、ファイルサイズに基づいてバイト数/内容が異なりますか? – reuscam

3

に私はこれが起こる理由としてimagecolorat().

を使用して、各ピクセルかかわらず、歩くよりもより高速な方法がありませんだと思う、それは共同uldはGDが消化できないJPGファイルCMYKのためです。わからない - 試してみる必要があります。その理由がある場合は、getimagesize()とそのchannels情報を使用してCMYKを検出できます。

0

すべて黒であれば、圧縮されているのでファイルサイズは小さくなります。私はJPGがRLEではなく知覚を使用することを知っていますが、それはまだ小さくなります。 20k未満のJPGを禁止するのはなぜですか?いくつか例を挙げて、サイズを比較し、しきい値を設定します。

+0

これは悪い考えです。グレーのミストをアップロードしたいのですが? –

+0

それからポスターはおそらくあなたのウェブサイトであなたを望んでいないでしょう! – Joe

+0

または青い空...? – zaf

4

1x1 PXイメージにリサイズします。次に、1つのピクセルが黒かどうかを確認します。完璧ではありませんが、オリジナルに多量の黒がない場合、その1ピクセルは黒ではありません。利点は、それが速くなるということです。

+0

興味深い考えですが、1x1ではあまりにも粗すぎると思います。それは偽陰性を生成することに拘束されている。チェッカーボードや白黒の幾何学的形状である。しかし、これは、例えば、10x10ピクセルの画像で動作するかもしれません。 –

+1

@pekka true、10x10はおそらくより正確で、かなり速いでしょう。まともな妥協 – profitphp

2

私は画像の80%が黒であっても、それが成功するために99%を持っているこのランダムそのアルゴリズム、

function check_if_black($src){ 

    $img = imagecreatefromjpeg($src); 
    list($width_orig, $height_orig)=getimagesize($src); 
    for($i=0;$i<20;$i++){ 
     $rand_width=rand (0 , $width_orig); 
     $rand_height=rand (0 , $height_orig); 
     $rgb = imagecolorat($img, $rand_width, $rand_height); 
     if($rgb!=0){ 
      return "not black"; 
     } 
    } 
    return "black"; 
} 

が好きです。より良いパーセンテージのためにループを増やすこともできます。

関連する問題