読者です 読者をやめる 読者になる 読者になる

透過色・アルファチャンネル付き PNG の減色・最適化・検証

pngquant で減色

pngquant はコマンドラインツールだ。

pngquant 16 src.png

上記コマンドで、src.png を 16 色に減色してくれる。

自動で最適な 16 色パレットが生成され、フロイド-スタインバーグ・ディザリングが施されるので、元画像との見栄えの変化が小さい画像が新たに作成される。

IrfanView の短所をカバーできる

また、透過色・アルファチャンネルは保持される。これは、現在の IrfanViewPNG 書き出し機能にはない素晴らしい特徴だ。

オプションがいくつかある

オプションは以下のように指定する。

pngquant --nofs 16 src.png

--nofs オプションは、フロイド-スタインバーグ・ディザリングを無効にする。すなわち、ポスタリゼーションを施したような画像となる。

--ext -2.png を指定すると、新たに作成される画像のファイル名を src-2.png にすることができる。

optipng でファイルサイズを小さく最適化

optipng もコマンドラインツールだ。

optipng --strip all src.png

上記コマンドには、--strip all オプションが付いている。これによって、メタデータを削除する。画像の品質には影響せず、PNG 最適化が行える。

TweakPNG で透過色・アルファチャンネルの保持を検証

TweakPNG は GUI ツールだ。

PNG 画像のバイナリは、チャンクという単位のビット列が集まってできている。それぞれのチャンクには名前があり、IHDR や PLTE などと名付けらている。TweakPNG で PNG 画像を開くと、どのようなチャンクがどのような順序で並んでいるかを確認することができる。

チャンクの 1 つに tRNS と名付けられているものがある。これは、透過色・アルファチャンネルの情報が詰まったチャンクであり、このチャンクが含まれている場合、その PNG 画像は部分的に透けているはずだ。(ただし、tRNS が含まれていなくとも透けていることはある)

pngquant による減色によって透過色・アルファチャンネルが本当に失われていないかを検証する手段のひとつとして TweakPNG で tRNS チャンクの有無を確認する、というやり方があるのだ。

広告を非表示にする

静止画+音声=動画(Twitter 投稿可能 MP4)作成方法

画像ファイル+音声ファイルで、静止画音声動画(Twitter に投稿可能な MP4)をつくる方法を記す。

必要なもの

  • 使用するソフト: FFmpeg
  • 画像ファイル: src.png
  • 音声ファイル: src.m4a

方法

src.pngsrc.m4a を同じディレクトリに置き、そこで以下のコマンドを実行する。

ffmpeg -y -loop 1 -i src.png -i src.m4a -shortest -tune stillimage src.mpg
ffmpeg -y -i src.mpg -an src2.mpg
ffmpeg -y -i src2.mpg -i src.m4a -acodec copy out.mp4

上記の通り、3 つのコマンドを上から順に実行していくと、どれかが失敗しない限り、目的の out.mp4 が生成される。

解説

3 つのコマンドを日本語で表現すると、

  1. 画像と音声から mpg を作成し、
  2. その mpg から音声を抜いた新 mpg を作成し、
  3. 新 mpg と音声から mp4 を作成せよ。

となる。

どうして、このような回りくどい方法なのだろうか。1 の段階でいきなり mp4 をつくればいいのではないか。これには理由がある。いきなり mp4 をつくってしまうと、VLC メディアプレイヤーでは一応再生できるものの、シークバーが効かなかったり、Twitter に投稿できなかったりと、不完全な mp4 が出来上がってしまうからだ。FFmpeg やファイルフォーマットの知識には疎い。原因不明である。

さて、以下に、コマンドの内容を一つ一つ解説する。

コマンド 1

ffmpeg -y -loop 1 -i src.png -i src.m4a -shortest -tune stillimage src.mpg

このコマンドにより、src.pngsrc.m4a から src.mpg を作成する。src.mpg は静止画+音声=動画である。

  • -y: 出力ファイル強制上書き(必ずしも必要ではないオプション)
  • -loop: 静止画を動画にする際に必要らしい?
  • -i src.png: 画像を入力
  • -i src.m4a: 音声を入力
  • -shortest: 音声の尺と同じ尺の動画を作成?
  • -tune stillimage: 静止画を動画にする際に必要らしい?
  • src.mpg: 動画を出力

コマンド 2

ffmpeg -y -i src.mpg -an src2.mpg

このコマンドにより、src.mpg から src2.mpg を作成する。src2.mpg は静止画だけの動画であり、音声はない。

  • -an: 音声を無効にする

コマンド 3

ffmpeg -y -i src2.mpg -i src.m4a -acodec copy out.mp4

このコマンドにより、src2.mpgsrc.m4a から out.mp4 を作成する。完成だ。

  • -acodec copy: 音声をエンコードせず、そのまま動画の音声として使用する。(音質が劣化してもいいなら不要なオプション)

Visual Studio 2013 で msvcrt.dll にリンクする

Visual Studio Community 2013 の cl.exe によるビルドにおいて、生成される実行ファイルが msvcr120.dll ではなく msvcrt.dll をリンクするようにする方法・更にはどちらにもリンクさせない方法をメモしておく。

Visual Studio Community 2013 ダウンロードサイト

Microsoft が個人開発者や小規模組織等向けに公開している Visual Studio 無償版の名称は、Visual Studio Community である。

f:id:ray0mg:20150827213445p:plain

Visual Studio Community 2013 with Update 5 (ISO)
go.microsoft.com/fwlink/?LinkId=532496
Visual Studio 2013 Language Pack (日本語)
go.microsoft.com/fwlink/?LinkID=320680

情報源を元にやってみる

タイトルの方法については以下のサイトに全て書かれている。

すなわち、Windows Driver Kit の中に、良い msvcrt.lib がある。

Download Windows Driver Kit Version 7.1.0 from Official Microsoft Download Center
download.microsoft.com/download/4/A/2/4A25C7D5-EFBE-4182-B6A9-AE6850409A78/GRMWDK_EN_7600_1.ISO

なんとかして msvcrt.lib を取り出す

F(ISO):\WDK から以下のファイルを例えば C:\wdk\ に置く。

  • libs_x86fre.msi
  • libs_x86fre_cab001.cab

C:\wdk\ にてコマンドプロンプトで以下を実行する。

msiexec /a libs_x86fre.msi /qb targetdir=C:\wdk\temp\

これで CAB 圧縮ファイルがうまい具合に展開されて、目当ての msvcrt.lib が以下のパスに出現している。

  • C:\wdk\temp\WinDDK\7600.16385.win7_wdk.100208-1538\lib\Crt\i386\msvcrt.lib

この msvcrt.lib を C:\wdk\lib\ にでも入れておく。

使用例

以下のコードは、cl.exe でうまくビルドできるよう環境変数を整えるためのバッチファイルである。

@echo off
setlocal
set path=%path%;"C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin"
set include="C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\crt\src";"C:\Program Files (x86)\Windows Kits\8.1\Include\shared";"C:\Program Files (x86)\Windows Kits\8.1\Include\um";
set lib="C:\wdk\lib";"C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\lib";"C:\Program Files (x86)\Windows Kits\8.1\Lib\winv6.3\um\x86"
if "%*" GTR "" (cmd /c %*) else (cmd /k prompt[VS]$P$G)
endlocal

このように、環境変数 lib に C:\wdk\libなるべく先頭に入れておく。

これで、ビルドする際には良い msvcrt.lib が使用され、msvcrt.dll にリンクされるようになる。

あるいは、C言語ソースコード中に標準ライブラリの関数等を使っておらず、リンカオプションで独自にエントリポイントを指定 /ENTRY:__start__ した場合は、msvcrt.dll へのリンクもされなくなる。

広告を非表示にする