Google PhotoにHEIC形式でアップロードして16MP制限を回避する

※このエントリを書いてるうちにHEIC形式のファイルが縮小されないのはバグだという記事がでてきました．そのうち修正されてこの回避方法は使えなくなるはずです．

Google aware of free original quality HEIC photo backups for iPhones, says it’s a ‘bug’

Google Photoの設定でアップロードサイズを「高画質」にしておくと16MPを超えるサイズの画像は16MPに縮小されますが容量を気にせず無制限でアップロードできます．
最近iPhoneの写真は16MPを越えていても無制限にアップロードできると話題になりました．これはiPhoneの写真はHEIF形式で保存され，これを16MPにするためにデコード&エンコードすると元の画像より大きくなるのでそのままにしているのではないかと言われたりしています．

TIL Because iPhones shoot photos in HEIC format and not JPG, you get free unlimited original quality backups to Google Photos due to HEIC being smaller and more efficient than JPG so Google doesn’t touch the files. : apple

この理由が正しいのであればiPhoneでなくともHEIF形式に変換してアップロードした画像はオリジナルサイズで保存されるではないかと試してみました．

matoken HEICでGooglePhotoに投げてみるとどうなるだろう?

先ず手持ちのカメラ(Pentax K-5)でRAW撮影して現像したファイルを確認してみます．

$ identify ./H-IIBF8_HTV8.TIFF
./H-IIBF8_HTV8.TIFF TIFF 4942x3276 4942x3276+0+0 16-bit sRGB 73.7626MiB 0.000u 0:00.000
$ echo $(($(identify -format "%w*%h" ./H-IIBF8_HTV8.TIFF)))
16189992

4942 x 3276 = 16189992ピクセルで制限の16MPを少し超えていそうです．
2**20*16 = 16777216 よりは小さい(MiP?)

この画像をアップロードしてみます．アップロードにはgpupを使いました．

$ gpup ./H-IIBF8_HTV8.TIFF

int128/gpup: A command to upload photos and movies to Google Photos Library using the official Google Photos Library API

アップロードしたファイルの情報を見るとこうなっていました．16.2MPで縮小されていないようです．

H-IIBF8_HTV8.TIFF
16.2 MP
4942 × 3276
77.3 MB

念の為設定を確認．

設定画面( https://photos.google.com/settings )にアクセスして，「高画質 （容量制限なし、無料）」にチェックが入っているのを確認します．

問題ないようです．

ちなみに，「元のサイズ」に設定した状態でアップロードした動画を「容量を解放」することで16MPに変換してGoogleドライブの容量を解放することも可能です．

Googleドライブの写真を高画質に変換して容量を開放するメモ – matoken’s meme

HEICとJPEGも同様にアップロードしてみます．

$ convert ./H-IIBF8_HTV8.TIFF ./H-IIBF8_HTV8.heic
$ convert ./H-IIBF8_HTV8.TIFF ./H-IIBF8_HTV8.jpg
$ ls -1HSs ./H-IIBF8_HTV8.*
75536 ./H-IIBF8_HTV8.TIFF
2632 ./H-IIBF8_HTV8.jpg
688 ./H-IIBF8_HTV8.heic
$ gpup ./H-IIBF8_HTV8.heic ./H-IIBF8_HTV8.jpg

これも縮小されませんでした．

この画像は16MPを少し超えている程度なので縮小されないのかもしれません．もっと大きな画像で試してみます．

といっても自分の手持ちのカメラではこれが最大なので，画像を結合して作成します．(ちなみに処理時間はHEIC:56s, JPEG:3s)

$ convert -append H-IIBF8_HTV8.heic H-IIBF8_HTV8.heic 32MP.heic
$ convert -append H-IIBF8_HTV8.heic H-IIBF8_HTV8.heic 32MP.jpg
$ ls -1Ss 32MP.*
3572 32MP.jpg
1260 32MP.heic
$ identify 32MP.*
32MP.heic HEIC 4942x6552 4942x6552+0+0 8-bit YCbCr 0.010u 0:00.000
32MP.jpg JPEG 4942x6552 4942x6552+0+0 8-bit sRGB 3.4858MiB 0.000u 0:00.000
$ gpup 32MP.heic 32MP.jpg

結果はHEICは約32MPのまま 未圧縮 ，JPEGは 16 MP 3473 × 4605 になっていました．

同様に倍を試してみると HEIC 64.8 MP(9884 × 6552) も 未圧縮 となりました．
convertでキャッシュリソースが足りなくて転けたりしつつ更に倍( 9884 x 13104 )を試してみるとgpupでは「Failed: There was an error while trying to create this media item. (code=3)」，Chromiumでは「アップロードできません」というエラーメッセージが表示されアップロードに失敗しました．
容量は4.3MBほどしかないのでそのあたりは問題ないはずで解像度のリミットがありそうです．

てことで，少なくとも HEIC 64.8 MP(9884 x 6552) までは未圧縮でアップロード可能でなようです．
64.8 MP〜129.6MP の間に最大値があると思いますが今の所手持ちの機材では関係がないので確認していません．

Imagemagickで画像変換時にキャッシュリソースが足りなくて転ける – matoken’s meme

関連URL

HEIF – High Efficiency Image File Format

nokiatech/heif: High Efficiency Image File Format

strukturag/libheif: libheif is a ISO/IEC 23008\-12:2017 HEIF file format decoder and encoder\.

環境

$ dpkg-query -W imagemagick chromium
chromium 76.0.3809.100-1
imagemagick 8:6.9.10.23+dfsg-2.1+b2
$ gpup -h 2>&1|grep Version
Version 1.x
$ git -C ~/go/src/github.com/int128/gpup/ log --oneline -1
fb48ce5 (HEAD -> master, origin/master, origin/HEAD) Merge pull request #27 from harupong/patch-1
$ lsb_release -dr
Description: Debian GNU/Linux bullseye/sid
Release: unstable
$ uname -m
x86_64