jpegで保存を繰り返す

新規保存で劣化していくJPEG形式の画像の様子をとらえたムービー - GIGAZINE
すでに追記があるけど、件のムービーは前回保存時よりQualityを落としながら読み込み保存を繰り返してるんだと思う。試しに似たようなことをやってみた。

use Imager;
use strict;
use warnings;
my $base = 'test';
my $ext = '.jpg';
my $file = 'test.jpg';
my $img = Imager->new;
for(0..99){
    $img->read(file=>$file);
    $file = $base . $_ . $ext;
    $img->write(file=>$file, jpegquality=>100-$_);    #前回保存時よりQualityを減らしていく
}

 test0.jpg
 test49.jpg
 test99.jpg
ムービーと似た画像ができたよ。


今度はQualityは落とさずに固定。読み込み〜保存を1000回繰り返す。

use Imager;
use strict;
use warnings;
my $base = 'test';
my $ext = '.jpg';
my $file = 'test.jpg';
my $img = Imager->new;
for(0..999){
    $img->read(file=>$file);
    $file = $base . $_ . $ext;
    $img->write(file=>$file, jpegquality=>80);    #qualityを固定
}

 test0.jpg
 test999.jpg
フォトライフは再圧縮しちゃうので比較画像のアップロード先としては適切じゃないけど、ムービーみたいな酷いことにはならないことは分かるかな。

Name         MD5                               Bytes
-----------  --------------------------------  -------
test0.jpg    505831637146568AFE85EC37C3949141   24,713
test1.jpg    8D4CFB1337F7F95F0EE21DD68A243BC3   24,715
test2.jpg    526D1EFBADDD81A6B1EAB6346F2E59BE   24,719
test3.jpg    D49CFDCE6ACAE9E22E15ED81B594D452   24,720
test4.jpg    DC667B9AEBD5424E53122E00C63F62BD   24,715
test5.jpg    25F0C995688B8042F8A4022B21BB9B35   24,715
test6.jpg    25F0C995688B8042F8A4022B21BB9B35   24,715
.
.
.
test999.jpg  25F0C995688B8042F8A4022B21BB9B35   24,715

md5とったら test5.jpg以降は完全に一致してた。(ただこれは同一エンコーダー同一設定で画像には一切手を触れずに保存を繰り返すというあまり現実的では無い実験なんで、これをもってjpegで保存を繰り返しても劣化は進まないと思ってはいけない)