2013/04/18 (Thu)
画像形式のWebPについてと、他の形式との変換に用いるコマンドについて(2013年4月時点)
WebP形式とlibwebpについて
概要
WebPは新しく作られた圧縮済み画像形式(仕様公表されたのが2010年)で
- 不可逆圧縮モードでJPEGよりも
- 可逆(ロスレス)圧縮モードでPNGよりも高い圧縮率が出る
とされる(公式によると同一画像の同等品質の圧縮後サイズで「前者が25-34%,後者が26%」の差)。
libwebp
プログラム内でWebP形式の画像を扱うにはlibwebpと呼ばれる公式提供のライブラリ(C言語向け)を用いると便利。
同ライブラリには、他形式の画像との間で変換が行えるツール(コマンド)が付属しており、GNU/Linuxでもディストリのパッケージとして収録されている場合がある。Debian/Ubuntuでは
- webp: 形式変換のコマンド群
- libwebp4: libwebpのライブラリ(libwebpを用いたプログラムから用いられる)
- libwebp-dev: libwebpを用いたプログラムをビルドするために必要な開発用ファイル群
としてパッケージが用意されている。
可逆圧縮と(lib)webpのバージョンについて: バージョン0.2系以上が必要
2013年4月時点の最新バージョンである0.3.0の時点では可逆(ロスレス)圧縮が可能となっているが、ディストリのパッケージとして提供されているパッケージのバージョンが古いときに可逆変換が行えないことがある。Ubuntu 13.04のバージョン(0.2.1)では問題ないが、12.10のバージョン(0.1.3)では扱えない。
libwebp付属ツール/他形式からWebP形式への変換コマンド
他の画像形式からWebP形式へ変換するためのコマンドはcwebpとなる。
対応する入力形式は、バージョン0.3.0時点では
- JPEG
- PNG
- TIFF
となっている。
出力ファイルは-oオプションで指定する。指定をしないと、内部で処理は行われるがその出力結果は破棄されるので注意。
不可逆圧縮
JPEGのように不可逆の圧縮を行う場合は-q [0から100の値]オプションを付ける。品質値は小数でも指定可。
$ cwebp -q [品質値(0-100)] [入力ファイルの場所].jpg -o [出力ファイルの場所].webp
可逆(ロスレス)圧縮
PNGのように可逆の圧縮(ロスレス)を行う場合は-losslessオプションを付ける。PNG画像から無劣化なままで変換する場合は下のようにする。
$ cwebp -lossless [入力ファイルの場所].png -o [出力ファイルの場所].webp
libwebp付属ツール/WebPから他形式への変換コマンド
WebP形式から他の画像形式へ変換するためのコマンドはdwebpとなる。
出力形式はPNG(既定値)の他、PAM,PPM,PGM,YUVに対応している(-pamなど、形式を指定するオプションを付ける)。
このコマンドも、出力ファイルは-oオプションで指定する。指定をしないと出力は行われない。
下はPNG形式の例。
$ dwebp [入力ファイルの場所].webp -o [出力ファイルの場所].png
使用したバージョン:
- libwebp 0.3.0
2013/03/06 (Wed)
p7zipを用いたファイルの分割と結合について
p7zip(7-Zipのコマンド版をGNU/Linuxなどへ移植したもの)では、7z形式で圧縮をする際にボリュームというものを指定すると圧縮後の出力ファイル(書庫)が分割でき、展開する際にはこれを自動的に結合することができる。これにより、1つのファイルを細かくして保存できる。
split/catによる分割/結合(単純分割/単純結合)との違い
「ファイルの分割(split)と結合(cat)」で扱ったsplitによる分割とcatによる結合(以下「単純分割/結合」とする)ではデータを単純に指定サイズで切って分割するもので、分割処理時に圧縮をかけることはできない。
分割7z書庫では複数のファイルをまとめたものを(複数ファイルに)分割保存することができるが、単純分割/結合では分割する対象は単一のファイルに限られる。
分割7z書庫は中身が正常に取り出せるか(書庫が破損していないか)を書庫自身を用いてテストすることができるが、splitでの分割では結合後のファイルについてMD5やSHA-1などのダイジェスト(ハッシュ・関連記事)を正常なものと比較しないと破損していないかが確認できず、確実に破損チェックがしたい場合は別途ダイジェストの内容を控えておく必要がある。
分割処理の実際について
分割を行う場合、「-v[分割サイズ][k,m,gなど]」のオプションを引数(入力ファイルの場所)よりも後ろに付ける。例えば書庫の各ファイルを10MiBにしたければ「-v10m」を指定する(最後のファイルはこれよりも小さくなる)。
元のデータが圧縮済みの形式で圧縮の余地がないような場合は無圧縮にして処理時間を短縮することもでき、その場合は「-mx=0」を指定する。7z形式における圧縮率の既定値(「-mx=」指定なしの場合の値)は「5」でこれよりも高い圧縮率が指定可能なので、最大限の圧縮をしたい場合は「-mx」(「-mx=9」と等価)を指定する。
(最大圧縮で各書庫を20MiBにする例) $ 7z a /path/to/out.7z [入力ファイルの場所...] -mx -v20m (無圧縮で各書庫を10MiBにする例) $ 7z a /path/to/out.7z [入力ファイルの場所...] -mx=0 -v10m
分割された書庫ファイルとその展開方法について
分割された書庫には「.001」「.002」「.003」のような連番の拡張子が付けられる。先頭のファイル(「.001」の拡張子のファイル)は7z書庫としての情報が先頭に含まれているが、2つ目のファイルからはそのような情報はない。
適当な3分割された書庫ファイルを作ってfileで調べると
$ file test.7z.* test.7z.001: 7-zip archive data, version 0.3 test.7z.002: data test.7z.003: data
となっている。
展開時には先頭のファイル(「.001」の拡張子のファイル)のみに対して展開を行うようにする。上記により、2番目以降のファイルを指定しても書庫としては処理されない。
$ 7z x /path/to/infile.7z.001
1番目のファイルを展開すると、続けて自動的に2番目以降のファイルが順に読み込まれて展開が行われる。
なお、分割された書庫は拡張子の順番でcatで結合してそれを単一の7z書庫(.7zファイル)として保存し、これを展開することもできる。
関連記事:
まとめドキュメント:
使用したバージョン:
- p7zip 9.20
- file 5.11
2012/05/06 (Sun)
Ubuntu 12.04における幾つかのメモ(C/Migemo,Wine,unzipについて)
Debian/Ubuntu, 日本語環境, Wine, x86_64, 圧縮, テキストエディタ, コマンド
GNU EmacsにおけるC/Migemoの設定
C/Migemo関係のパッケージが標準で利用可能になっていることは「Ubuntu向けに作成・公開していたパッケージの12.04への対応を完了」で書いているが、辞書のパッケージの関係で、正しく動作させるために記述する設定が下のようになった。
[一部]ファイル名: ~/.emacs.el
; C/Migemo (load "migemo") (setq migemo-command "cmigemo") (setq migemo-options '("-q" "--emacs" "-i" "\a")) (setq migemo-dictionary "/usr/share/cmigemo/utf-8/migemo-dict")
x86_64版ディストリにおけるWineの64bit/32bit同時対応(サポートパッケージの共存)について
「x86_64版のDebian/Ubuntuにおける「:i386」付きの名前のパッケージについて(Ubuntu 11.10時点)」で扱っているMultiarchの対応が更に進んだことで、x86_64版のUbuntuでWineのx86_64対応が改善され、x86_64版ディストリでは「wine[バージョン]-i386」パッケージが32bitアプリケーションのサポートを,「wine[バージョン]-amd64」パッケージが64bitアプリケーションのサポートをそれぞれ提供するようになり、64bit用のWindowsアプリケーションを動かすためのWine(実行コマンドはwine64)と32bit用のWindowsアプリケーションを動かすためのWineとを共存できるようになっている。
Wine環境(WINEPREFIX)については、最初に64bitアプリケーションを動かした64bit版Wineを使用したWine環境は32bit/64bit両対応になるようになっており、最初に32bitアプリケーションを動かしたWine環境は32bitアプリケーション専用となる。この種類はWine環境の作成時に決められ、後から変更することはできない。
(2012/5/9)最初に動かしたのが32bitのWindowsアプリケーションでも、Ubuntuの「wine[バージョン]」の名前のパッケージがamd64版であればWine環境は32bit/64bit両対応になる。「wine[バージョン]」の名前のパッケージがamd64版だと
- widl
- wine64
- wine64-preloader
- winebuild
- winedump
- winegcc
- wineserver
- wmc
- wrc
の実行ファイルがx86_64向け(fileコマンドで「ELF 64-bit LSB executable, x86-64, [以下略]」と表示される)となる。なお、64bitアプリケーションはwine64ではなくwineコマンドで起動することもできる。
64bit対応(32bit/64bit両対応)のWine環境における仮想Cドライブはディレクトリ構成が一部32bit専用のものと異なり、下のようになる。
[drive_c]-+-[Program Files] 64bitアプリケーション向けのProgram Files
+-[Program Files (x86)] 32bitアプリケーション向けのProgram Files
+-[windows]-+-[system32] 64bit環境向けのシステムファイル群
| +-[syswow64] 32bit環境向けのシステムファイル群
| |
このProgram Files (x86)やsyswow64といった名前の32bit版プログラム用ディレクトリは、x86_64(x64)版のWindowsにおいても同様に存在する(Wineがこれに合わせている)。「system32」の中身が64bit向けで「syswow64」の中身が32bit向けなのは紛らわしいかもしれないが、Windowsではこのようになっている。
unzipのエンコーディング指定オプションについて
unzipのバージョン6.0-4ubuntu1(以上)では-Oというオプションが追加され、これに「cp932」を指定することで、エンコーディングにCP932が用いられた(ASCII範囲外の)ファイル名のファイル/ディレクトリを含む書庫が扱えるようになっている(Windowsなどで日本語ファイル名のファイル/フォルダを含んだ書庫を作成したものが文字化けせずに展開できるようになっている)。
$ unzip -O cp932 [Windowsなどで作成した.zipファイルの場所] (ここで処理中に流れるファイル/ディレクトリ名は一部「?」に化けるが実際に出力される名前は正常)
ただ、これは本家版unzipの機能ではなく、04-unzip60-alt-iconv-utf8(元のファイル名はunzip60-alt-iconv-utf8.patch)というパッチにより提供されており、全てのディストリで使えるわけではない(例えば、Debianの「6.0-6」のバージョンではこのパッチは含まれないため、この時点ではDebianでは-Oというオプションは使えない)。また、書庫のエンコーディングを自動判別するわけではないため、「文字化けするような書庫があったときに指定する」という形で使うことになる。また、File Roller(アーカイブマネージャー)などのGUIツールでもエンコーディングは自動的に判別されないため、文字化けせずに正しく扱うということはできない状況。
(2012/5/7)GUIアプリケーションで上のような書庫を扱いたい場合、Wineで7-ZipのGUI版(7-Zip File Manager・ファイル名は7zFM.exe)などを動かすとよい。
関連記事:
- x86_64版のDebian/Ubuntuにおける「:i386」付きの名前のパッケージについて(Ubuntu 11.10時点)
- Ubuntu向けに作成・公開していたパッケージの12.04への対応を完了
使用したバージョン:
- GNU Emacs 23.3
- C/Migemo 20110227
- Wine 1.4, 1.5.3

