質問: **一番知りたいこと** 画像ソフトウェアで、アンドゥ機能を繰り返すと、画像は劣化しますか? 画像ソフトウェアごとに(の実装によって)異なりますか? --- **できれば知りたいこと** 画像ソフトウェアのアンドゥ機能はどうやって実装しているのですか?(具体的にではなくざっくりとした考え方を知りたいです)。 基本的な考え方としては、「読込直後」と「処理する度」にその時点の画像を保存しておき、アンドゥするたびにその画像を読み込んでいるのですか? もしそうだとすると、例えば jpeg画像の場合、ある時点の画像を保存した時点で画像は劣化するので、完全にもとへ戻すことはできないと思うのですが......。
回答: 「画像処理ソフトウェアの実装による」が普遍的な回答になりますが、一般論で言うと、アンドゥ機能を持つ画像処理ソフトウェアは、(アンドゥ・リドゥを含む)ユーザー操作が発生するたびにいちいちファイル保存やファイル読み込みをしているわけではなく、いったんメモリ上に非圧縮の生のピクセルデータを展開・保持しておき、そのデータを使って画面表示やユーザーインタラクションを行なっています。 内部的なピクセルデータの形式はそれこそソフトウェアによってまちまちで、RGBAの各チャンネルごとに8bit (合計32bit) の整数形式で保持しているものもあれば、各チャンネルごとに16bit (合計64bit) の整数形式で保持しているものもあります。HDR画像処理をする場合は、FP16やFP32などの浮動小数点数形式で保持することもあります。カラーではなくグレースケールで処理する場合は、輝度情報だけを保持することもあります。 これらのピクセルデータは、ファイル保存時の形式によっては不可逆変換により情報が欠損してしまいますが、仮にユーザーの操作によってピクセルデータを何らかのファイル形式で保存したとしても、プロセスがまだ起動している間は生のピクセルデータ(マスターデータ)のほうをメモリ上に保持する実装になっていれば、ファイル保存操作によってメモリ上のピクセルデータが変化することはありません。 JPEGの場合は離散コサイン変換された波形データとしてファイルに保存され、これは不可逆変換ですが、一般的な画像処理では波形データではなくピクセルデータを利用するので、最初にファイルから読み込んでメモリ上にピクセルデータとして展開されたものに対して処理を加えていくことになります。入力の際や、最終的な画像処理の結果を保存する際にJPEG形式を用いることはありますが、画像処理のための中間表現としてJPEG形式を用いることはありません。 単純なアンドゥ・リドゥ実装では、ユーザー操作のたびに古いデータの完全コピーを履歴として(メモリ上の)アンドゥバッファに保存していきます。アンドゥ操作では新しいデータをリドゥバッファに保存して、古いデータをアンドゥバッファから取り出すだけです。コンピュータ資源(特にメモリ)は有限なので、操作履歴として保持される回数には上限があり、上限を超えると古いものから順に捨てられていきます。これは画像処理ソフトウェアに限らず、テキストエディターや音声処理ソフトウェアなどでも原理は同じです。画像処理ソフトウェアでは、非圧縮の生のピクセルデータが履歴としてメモリ上に保持されます。ただし、毎回データの完全コピーを履歴として保持すると、メモリ消費が激しくなるので、変更のあったレイヤーなどに限定した差分のみを保持することでメモリ使用量を低減し、アンドゥの回数上限を増やす工夫がされていることがほとんどです。