Open10

Windows 標準のツールで画像を加工していると、加工前の画像を復元できるという情報の検証

hankei6kmhankei6km

https://internet.watch.impress.co.jp/docs/yajiuma/1487728.html

https://pc.watch.impress.co.jp/docs/news/yajiuma/1487526.html

自分が Zenn などで使う画像を作成する場合。

Windows の場合は、切り取り&スケッチツールで一旦ファイルに保存して paint で編集と保存という流れが多い。

が、最近は切り取り&スケッチツールでトリミングしたりもしていた。ちょっと怖いのでどのくらい影響ありそうかの検証。

hankei6kmhankei6km

不具合を踏んでいるから判定ぽいことができるようになったので、Zenn 記事に使っている画像[1]を調べてみたところ、思っていたより数があり古いファイルもヒットした。

「切り取り&スケッチツールでトリミングとか使うようになったのは最近だと思ったのだが」としばらく考えてみたところ、下記のパターンでも問題があることに気が付く。

  1. Win + Shift + S でスクリーンショットを採取し、切り取り&スケッチツールから PNG ファイルを保存
  2. しばらく記事を書き進めたところで「やっぱりスクリーンショットを取りなおそう」となる
  3. 再度、Win + Shift + S でスクリーンショットを採取し、切り取り&スケッチツールから PNG へファイルを保存
    • ただし、このときの保存は前にとったスクリーンショットのファイルに上書きする

これで新しいスクリーンショットのサイズが小さければ不具合を踏んでしまうことになる。

原理的には「加工している」or「加工していない」は関係ないので、この問題について考えるときは「加工」「復元」という単語は忘れた方が良いかもしれない。

脚注
  1. 画像ファイルはすべて外部メディアにアップロードしているけど、基本的にはローカルにも残してある。 ↩︎

hankei6kmhankei6km

検証環境

Windows 10 Home 32bit 21H2(いまとなってはあまり一般的のはないが、とりあえず)

hankei6kmhankei6km

64bit 版でも同じようになる。OS バージョンやエディションは関係なさそうかな。

hankei6kmhankei6km

比較画像

切り取り&スケッチツールでフルスクリーンのスクリーンショットを取得しファイルとして保存。

ファイルサイズは 273K になる。

hankei6kmhankei6km

どのようなときに復元できる?

  1. 上記と同じスクリーンショットを採取
  2. 一度も保存せず、切り取り&スケッチツール上でトリミングし png 画像として保存
  3. このときのファイルサイズは 3KB

これはファイルサイズ小さくなる。よって、おおらく余分な情報は含まれていない。

一方で下記のようにするとファイルサイズが大きくなる。

  1. 上記をスクリーンショットを採取
  2. 一旦 png 画像として保存する
  3. 切り取り&スケッチツール上でトリミングし png 画像として同じファイルへ上書き保存
  4. このときのファイルサイズは 274KB

復元の検証はできていないが、あきらかにファイルサイズがおかしい

hankei6kmhankei6km

Zenn スクラップの場合

上記で使っているこの画像ファイルは、アップロード前のサイズは 274KB である。が、どこかの時点で余分な情報が落とされているもよう。

と、いうことで少し安心かな?

ただし、Zenn記事は仕組みが違うはず&GitHub のパブリックリポジトリを連携させていたらリポジトリにオリジナルが残っているので、そうはいかないかな(未検証)。

hankei6kmhankei6km

paint で編集と保存

paint を使っている場合。

  1. 上記と同じスクリーンショットを取得し png 画像として保存
  2. ペイントで開く(エクスプローラーでファイルを右クリック、「編集(E)」を選択)
  3. 範囲選択しトリミング
  4. そのまま上書き保存

これはファイルサイズも小さくなる。また、元の画像が含まれているファイルを編集して上書き保存してもファイルサイズは小さくなる。

ただし、まったく加工しないで上書き保存した場合は、ファイルサイズは変わらない

hankei6kmhankei6km

ファイルを上書き保存したとき、はみでている元ファイルのデータが危ない?

https://www.techno-edge.net/article/2023/03/22/1048.html

そちらの原因は、Markup ツールが画像を切り取ったり加工して上書き保存する際、画像データを単純に書き込むのみで、ファイルサイズを新たに切り詰めない挙動から

これが復元できる根拠のひとつ。検証した内容も同じような結果になる。

簡単にまとめるとこんな感じ?

  1. 保存済のファイルサイズが100Kだったとする
  2. トリミングして上書き保存すると10Kになるとする
  3. このとき本来なら 10K に切りつめられる(後ろの 90K は消える)

今回の不具合では 90K が消えないで残ることが問題ということらしい。

というととで、元が画像が復元できるというのは少し正確ではない。

たとえば、1M のファイルに対して、切り取り&スケッチからまったく関係のない100K のスクリーンショットを上書きしても、900K の余分なデータが含まれる可能性はある。

(「Undo 用のデータが残っていることが原因」的な記述を見かけたので少し追記)
この挙動に PNG の画像フォーマットなどは関係なさそう。極端な話、上書きされるファイルが動画などであってもサイズは切り詰められれない。

とりあえず、公式の見解(と、できれば検証ツール)が出るまで待ちかな。

hankei6kmhankei6km

確認する方法は?

「このファイルはマズいデータが含まれているかも」と心配になったとき用のメモ。

exiftool で情報を表示したとき、 Warning[minor] Trailer data after PNG IEND chunk が含まれているとあやしい(たまたま EXIF の操作をしていたから exiftool を使っているだけで、他にも調べるツールはあるかと思う)。

なお、どのようなデータが含まれてしまっているか確認する方法は調べていない。

$ exiftool  スクリーンショット\ 2023-03-23\ 152955.png
ExifTool Version Number         : 12.50
File Name                       : スクリーンショット 2023-03-23 152955.png
Directory                       : .
File Size                       : 280 kB
File Modification Date/Time     : 2023:03:23 15:30:45+09:00
File Access Date/Time           : 2023:03:23 19:33:30+09:00
File Inode Change Date/Time     : 2023:03:23 19:23:20+09:00
File Permissions                : -rw-r--r--
File Type                       : PNG
File Type Extension             : png
MIME Type                       : image/png
Image Width                     : 84
Image Height                    : 52
Bit Depth                       : 8
Color Type                      : RGB with Alpha
Compression                     : Deflate/Inflate
Filter                          : Adaptive
Interlace                       : Noninterlaced
SRGB Rendering                  : Perceptual
Gamma                           : 2.2
Pixels Per Unit X               : 3779
Pixels Per Unit Y               : 3779
Pixel Units                     : meters
Warning                         : [minor] Trailer data after PNG IEND chunk
Image Size                      : 84x52
Megapixels                      : 0.004