新・OS X ハッキング! (130) 実は種類がある「PNG」の見分けかた

ニュース
トップ

【コラム】

新・OS X ハッキング!

130 実は種類がある「PNG」の見分けかた

海上忍  [2014/12/17]
  • >
  • >>

130/130

さて、今回は「PNG」について。OS Xではスクリーンショットに使用されるなど、事実上システム標準の画像フォーマットとしての地位にあるが、歴史的経緯を知らず漫然と利用しているユーザも多そうだ。

PNGの種類

かつてOS標準のラスター画像フォーマットといえば、MacはPICTでWindowsはBMPだったが、現在では"主役級"とは言えない。写真はJPEG、WEBページのボタンにはPNGといった具合に、OSとは関係なく用途別に使い分けるほうが多いからだ。

特にPNGは高い圧縮率のほか、最大48bitのフルカラー(約280兆色)をサポート、複数の透過色を指定できる、という特徴から汎用的なラスター画像フォーマットとして普及している。特許問題を抱え扱いにくかったGIFの代替フォーマットとして登場した経緯もあり、基本的にはWEB素材やアイコンといった用途に利用されるが、フルカラー表示が可能なため画質劣化を避けたい画像に好適だ。

そんなPNGには、いくつかの種類がある。拡張子は同じ「.PNG」だが、扱える色数の違いで「PNG-8」(最大256色)と「PNG-24」(1678万色)、「PNG-32」(280兆色)に分類できるのだ。実写画像で使用した場合、JPEGよりファイルサイズが肥大化しがちだが、スクリーンショットのようなビットマップ画像はDeflateの高い圧縮率により、他フォーマットに比べファイルサイズで有利になる。

PNGを抜きに語れないのがiOSアプリだ。アイコンやスプラッシュ画像は必ずPNG、標準と高精細(Retina)それぞれの解像度で収録されていなければならない。OS Xでもスクリーンショットのフォーマットに採用されるなど、なくてはならない存在となっているが、依存度という点ではiOSのほうが上だ。PNGの"よしあし"がアプリの完成度に影響する可能性を考慮すると、単なる画像フォーマットとしては片付けられない存在といえるだろう。

Finder上では区別されないが、カラーのPNGファイルは「PNG-8」と「PNG-24」、「PNG-32」の3種に分類できる

PNGとJPEG、GIFの比較
PNG JPEG GIF(GIF89a)
ビット深度 8/16/24/48 24 8
色数 256/1678万/280兆 1678万 256
圧縮 可逆圧縮 非可逆圧縮 可逆圧縮
透過処理 ×
アニメーション × ×
インターレース
主な用途 ラスター画像全般 写真 色数を必要としない透過画像やアニメーション

PNGの見分け方

上述のとおり、扱える色数などの違いで分類されるPNGフォーマットだが、Finderで見るかぎり区別できない。PNG-8なのかPNG-24なのか、はたまたPNG-32なのかは、ファイルサイズからある程度は推測できるが、実際のところしっかり判断できる機能を備えた画像編集ソフトは意外に少ない。

「file」や「sips」コマンドでPNGファイルの詳細情報を調べることもできるが、わかるのはビット深度など一部に過ぎず、種類を判定するには足りない。PNGファイルを見分けるには、先頭部分にある画像として最低限必要な情報(チャンク)を分析し、カラータイプの種類とαチャンネルを判定しなければならないのだ。

$ file shot.png
shot.png: PNG image data, 570 x 366, 8-bit/color RGBA, non-interlaced

$ sips --getProperty bitsPerSample IMG_9917.png 
/Users/shinobu/Desktop/IMG_9917.png
bitsPerSample: 16

「プレビュー」で表示したPNGファイルの情報画面。この情報だけでは、PNG-8(左)とPNG-24(右)を見分けることはできない

多機能な画像編集ソフトを利用すればPNGファイルの種類を判定することは可能だが、なにぶん当コラムのこと、できればOS標準の機能で賄いたい。そこで用意したのが、リスト1に挙げるRubyスクリプト。『テキストエディット』などのテキストエディタにコピー&ペーストし、エンコーディング形式をUTF-8として保存してほしい。「pnginfo.rb」として保存した場合には、以下の要領でPNGファイルを指定すれば、判定に必要な情報が出力されるはずだ。

前述したとおり、PNGファイルを見分けるポイントはカラータイプとαチャンネルの2つ。カラータイプ「3」がPNG-8、「2」がPNG-24、「6」がPNG-32だ。リスト1ではαチャンネルの有無だけを判定しているため、PNG-8の透過の種類(インデックス透明カラーまたはαチャンネル)はわからないが、これでとりあえずの目的は達成できる。

なお、OS Xのスクリーンショットは「PNG-32」であり、ファイルサイズを小さくする余地はありそう。興味があれば、「pngquant]などの最適化ユーティリティを利用してみよう。

$ ruby pnginfo.rb png32.png

PNGファイルのカラータイプとαチャンネルの有無を検証するスクリプトを実行したところ。手もとのPNGファイルで試してみよう

リスト1(エンコーディング形式をUTF-8で保存すること)

# -*- coding: utf-8 -*-
require "stringio"
pngname = ARGF.filename
image = open(pngname, "rb")

sign   = image.read(8)
length = image.read(4).unpack(">N")[0]
name  = image.read(4)
data  = image.read(length)

ihdr = StringIO.new(data)
width       = ihdr.read(4).unpack(">N")[0]
height      = ihdr.read(4).unpack(">N")[0]
bit_depth   = ihdr.read(1).unpack("h")[0].to_i
color_type  = ihdr.read(1).unpack("h")[0].to_i
alpha = `/usr/bin/sips --getProperty hasAlpha '#{pngname}' | sed -n '2,2p'`

puts "横幅          %4d" % width
puts "高さ          %4d" % height
puts "ビット深度    %4d" % bit_depth
puts "カラータイプ  %4d" % color_type
puts "αチャンネル  %4s" % alpha
  • >
  • >>

130/130

インデックス

連載目次
第130回 実は種類がある「PNG」の見分けかた
第129回 Yosemite使いは知っておくべき「Core Storage対策」
第128回 「lsappinfo」で知るCoreApplicationServices
第127回 知られざるツール「Widget Simulator」
第126回 Yosemiteでついに消えた「あのファイルたち」
第125回 「Sublime Text」奮闘記 ~実践編~
第124回 「Sublime Text」奮闘記 ~導入編~
第123回 MacとiPhoneですぐに試せる「iBeacon」
第122回 OS XのTTSフロントエンド「say」が歌う!
第121回 BSDレイヤー温故知新(5)「固有コマンド:textutil」
第120回 BSDレイヤー温故知新(4)「Spotlight」
第119回 BSDレイヤー温故知新(3)「スーパーサーバ」
第118回 BSDレイヤー温故知新(2)「KEXT」
第117回 BSDレイヤー温故知新(1)「iノード」
第116回 インタラクティブになった「say」と戯れる
第115回 意外に奥深い? 「字数カウント」のテク
第114回 Kindle本発売記念、defaultsコマンドのYet Anotherな使い方
第113回 あのファイルシステムをOS Xでラクに読み書き(1)
第112回 知っているとファイル検索が変わる「mdfind」
第111回 Yet Anotherなファイアウォール「PF」をラクに使う
第110回 MavericksにしたらNASがおかしい、そんなときの対策
第109回 FinderとTerminalの連携を考える
第108回 『Mavericksの新コマンド(2)』
第107回 『Mavericksの新コマンド(1)』
第106回 Mavericks目前だから「添付ファイル」を整理!
第105回 iOS 7公開直前! iOSデバイスのバックアップを整理する
第104回 OS Xの音声入力、知られざるワザ
第103回 Mavericksに備えてホームディレクトリをお引っ越し
第102回 Mavericksの新規インストールは「キーチェーン」のコピーで快適!
第101回 OS Xのデスクトップに「シェル由来の機能」を見る
第100回 いま敢えて「お約束のシェルの機能」を知る
第99回 Mavericks以降なくなる(はずの)アレコレ
第98回 ここにSVGファイルがあるじゃろ?
第97回 Mountain Lionの知名度は低いが有用なコマンドたち
第96回 スパイも安心? なファイル削除コマンド「srm」
第95回 あのデバイスのIPアドレスを調べるには
第94回 pkgutilでインストーラパッケージを削除する
第93回 いまや必須の「SDカード」と付き合う方法(後編)
第92回 いまや必須の「SDカード」と付き合う方法(前編)
第91回 OS X標準の機能でも、PDFはここまでできる
第90回 S Xを快適に使う「5つの心がけ」~ プロセス管理編
第89回 OS Xを快適に使う「5つの心がけ」~ 無線LAN編
第88回 OS Xを快適に使う「5つの心がけ」~ Safari編
第87回 OS Xを快適に使う「5つの心がけ」~ メモリ領域の管理編
第86回 OS Xを快適に使う「5つの心がけ」~ Launchpad編
第85回 ふと気がつけば4GB目前! 肥大化するログファイルに備えよう
第84回 話題の「File:///」とURLスキーム
第83回 Mountain Lionで消えた「enviroment.plist」
第82回 「QuickTime」に見るOS Xとの関係の変化
第81回 OS Xの「マルウェア」対策を知る
第80回 CS2騒動で思い出した「Rosetta」、そして「X11」
第79回 【新春特別企画】どうなる? 2013年のMacを考える
第78回 印刷をもっと楽しく! オリジナルの「表紙」をつくる
第77回 「Python」でGUIスクリプトを記述する
第76回 Web共有を復活させ「Wii U」の動画再生能力をチェック
第75回 毎年恒例の宛名印刷に「連絡先」のデータを生かす
第74回 いまも現役「WebObjects」との付き合い方
第73回 OS XでAndroid生活(MOVERIO BT-100編)
第72回 日本語ロケールと「Kyokoさん」の関係
第71回 Terminalから「共有」機能にアクセスすれば、画像添付ツイートもOK!
第70回 iPhone 5の「テザリング」とOS Xが共存共栄するには
第69回 意外? TerminalとTwitterは相性良好!
第68回 iPhone 5テザリング日記 ~au編~
第67回 DRMフリーで320kbps! 「Mora」の曲をiPhoneで聴こう
第66回 Terminalの制御コードに親しもう
第65回 特別編:iPod touch化したiPhone 4、自分はこう使う
第64回 ネイティブ化された「GIMP」を再びリスペクト
第63回 Bluetoothスピーカーの音質改善策、その意外な結末
第62回 知らなかった? ちょっと便利なMountain Lionの新機能(2)
第61回 知らなかった? ちょっと便利なMountain Lionの新機能(1)
第60回 「通知センター」の舞台裏を知る
第59回 iOSを超えた? Mountain LionのAirPlayサポート
第58回 続:iCloudは汎用ストレージとして使えるか?
第57回 iCloudは汎用ストレージとして使えるか?
第56回 新世代のOS Xユーザへ(4):情報の宝庫「/var」
第55回 SDHCカードをLionの起動ディスクとして使う
第54回 新世代のOS Xユーザへ(3):Terminalの暗黒面
第53回 新世代のOS Xユーザへ(2):知っておきたいコマンドたち
第52回 新世代のOS Xユーザへ(1):CUIのススメ
第51回 OS XがAirPlayの受け手になる「AirServer」を試す
第50回 iTunesで「ミドルレゾ音源」を楽しもう
第49回 軽い! 「フォトストリーム」を無手勝流検索
第48回 画像だけじゃない? OS Xに「高精細時代」が到来する
第47回 いま話題のリモートシェル「Mosh」を試す
第46回 外付けHDDをCore Storage形式に変換する
第45回 書類フォルダとして使える? 話題の「Google Drive」をテスト
第44回 知らなきゃ損する「tmutil」の便利機能
第43回 Emacsの「Dired」で拡張子を積極活用
第42回 フォトストリームに新iPad、RAW画像はどうする?
第41回 OS Xでも便利に使える「URLスキーム」
第40回 iPhoneの写真をOS Xで楽しむもうひとつの方法
第39回 実は大きく変わった「Safari 5.1.4」
第38回 Siriがなんだ! いまこそKyokoさんの魅力を再認識
第37回 これから必須のセキュリティモデル「サンドボックス」
第36回 DRMフリーになった「M4Aファイル」を解析する
第35回 番外編:夏登場の「Mountain Lion」、ココに注目
第34回 オープンソースの「Apple Lossless」を念入りに検証する
第33回 意外に知らない「画面共有」
第32回 OS Xで「Blu-ray」を読み書き(2)
第31回 OS Xで「Blu-ray」を読み書き(1)
第30回 「__MACOSX」の意味は? いま敢えて「zip」を見直す
第29回 enscriptでソースコードをカラー印刷
第28回 年末特別企画:ホームフォルダを大掃除
第27回 アスキーアートで描く「賀正」
第26回 手軽にOS Xを「AirPlayサーバ」として使う
第25回 高圧縮率画像フォーマット「WebP」をLionで使う
第24回 OS XのSafariから直接「AirPlay」する
第23回 Mailの「アドレス自動補完機能」をあれこれイジる
第22回 launchctlで読み解くLionとiCloudの関係
第21回 OS XでAndroid生活(スクリーンショット対策編)
第20回 あなたの知らない「Dock」の横顔
第19回 いま敢えて「Quick Look」をリスペクト
第18回 Safariの「リーディングリスト」を勝手に編集
第17回 Lionに見つけたSteveの面影
第16回 Kyokoさんに「OS X」を「オーエステン」と発音させる
第15回 Lion備忘録(8) ~タイムマシンにおねがい~
第14回 Lion備忘録(7) ~これ知ってる? なTIPS~
第13回 Lion備忘録(7) ~フルスクリーンと賢く付き合う~
第12回 Lion備忘録(5) ~キーボード愛好者へ捧ぐ~
第11回 Lion備忘録(4) ~Lionの「おせっかい」対策~
第10回 Lion備忘録(3) ~LaunchPadの謎を解く~
第9回 Lion備忘録(2) ~「Mission Control」に慣れる~
第8回 話題のクラウド「Nドライブエクスプローラー」を試す
第7回 Lion備忘録(1) ~「avconvert」で知るCoreMedia~
第6回 Lionへアップグレードするその前に~インストールDVDをつくろう~
第5回 強力無比のターミナルエミュレータ「iTerm2」
第4回 MacBook Proのスーパードライブにさようなら
第3回 万能ナイフ的メディアプレイヤー「VLC」の知られざる機能
第2回 Lion直前だからこそ、スマートにHDDを健康診断する
第1回 ひと足お先に「iTunes in the Cloud」で音楽の同期を試す

もっと見る

関連したタグ

関連記事

関連サイト

新着記事

特別企画

一覧

    人気記事

    一覧

    新着記事

    エレコム、MHL 3.0に対応したMHLケーブルとMHL変換ケーブル
    [00:02 12/18] パソコン
    DMM.comがデータ通信SIMサービス参入、1GB容量で660円/月のプランなど開始
    [00:00 12/18] パソコン
    マスタードシード、SFX-L規格を採用したSilverStone製500W電源ユニット
    [23:13 12/17] パソコン
    池田夏希、"原点回帰"の新作で「着たことのない変形水着」など過激露出
    [23:00 12/17] エンタメ
    Eカップ横山あみ、浴衣のシーンで雨に濡れて「大人っぽくなっています」
    [23:00 12/17] エンタメ

    特別企画

    一覧