新規保存で劣化していくJPEG形式の画像の様子をとらえたムービーという記事を読んだのだけれど、そこまで劣化するかなと疑問。
元の記事であるGENERATION LOSSを見ると動画と一緒にソースが添えてあって、Processingで記述してありました。名前は知ってるけど使った事はありません。私もプログラマの端くれですから、ざっと読むくらいはできるのでソースを見ていくと・・・
float q = map(i,0,numberOfFrames,1,0); p.setQuality(q,true);
ここ、なんか妙ですよね。map()関数がよくわからないのですけど、setQuality()はjpeg保存時の画質を決めてるところだと思うのですが、ここをこんな風に0~numberOfFrames(600-1)の間で変化させたら、画像を保存するたびに画質が変わってしまいます。
いい機会なのでとProcessingをダウンロードしてきて試し
てみました。
まず最初の画像ですが、元記事の動画の最初フレームをキャプチャして使いました。
Processingに元のソースコードを流し込んで実行してしばらくすると、599枚の画像ファイルが完成するのですが、この時点ですでにファイルサイズが怪しく、徐々に小さくなっています。
保存を繰り返すたびにどのように劣化するのかを確かめるのであれば、ファイル保存時の品質は一定にした方がいいでしょうから、
//float q = map(i,0,numberOfFrames,1,0); p.setQuality(1.0 ,true);
このように固定値(ここでは1.0の最高値/PhotoShopだと画質10以上?)を設定した方がいいと思うのですね。この場合、600回保存した画像は
ぱっと見た感じでは劣化してません。もちろん、PhotoShopなどでヒストグラムをみると変化していますし、瞬間的に画像を切り替えると色の差異がみてとれますが。
いやまて、もしかして、これはsetQuality()のパラメータと保存される画像の変化を確認しているのか?と思ったのですが、だとしたら、
//PImage reference = loadImage("sky"+(i-1)+".jpg"); PImage reference = loadImage("sky"+(1-1)+".jpg");
このように、最初の画像を常に固定しないと意味がないのではないかなと。ちなみに、map()関数がなにをしているのかわからないのですが、最初の画像をいきなりmap(numberOfFrames-1,0,numberOfFrames,1,0)として保存した画像はこちら。
なんらかの画像処理ソフトで低画質保存したのと同じ結果になります、というだけの話でした。