JPEGファイルの構造を解析するためのクラス
パース時およびセグメントの要素の変更時に各セグメントに対応する特異メソッドが動的に生成される。 (例:APP1セグメントが存在する場合,app1が生成される)
Class
Enumerable
JPEGファイルのパースエラー
StanderdError
各セグメントを解析するためのクラスを格納するためのハッシュテーブル
dataを省略した場合,空のオブジェクトが作成される。
dataにIOオブジェクトを指定した場合にはファイルの読み込みを行い解析を開始する。文字列を指定した場合には,与えられた文字列を読み込み済みのファイルイメージとして扱う。
parse_header_onlyにPARSE_HEADER_ONLYを指定した場合には,SOSセグメント以降の解析を行わない。PARSE_FULL_IMAGEの場合には全ファイルの解析を行う。
ブロックが与えられた場合には,各セグメントの解析が終了した段階で,各セグメントを格納したJpeg::Segmentオブジェクトがブロックに渡され,ブロックの実行結果がセグメントの値として保存される。
fileにファイル名を指定する他はJpeg.newと同じ。
各セグメントを解析するクラスを登録する。
segmentにはJpeg::Segmentクラスの各セグメントを表す定数を指定し,data_classには各セグメント解析用のクラス名を指定する。data_classに登録するクラスはJpeg::Segmentクラスを継承したもので無ければならない。
クラスを登録されたセグメント以外の解析にはJpeg::Segmentクラスが用いられる。
Enumerableモジュールで提供されるメソッドのうち,以下のメソッドは未定義にされている。
JPEGファイルの解析を開始する。引数はJpeg.newと同じ。
ブロックが与えられた場合には,各セグメントの解析が終了した段階で,各セグメントを格納したJpeg::Segmentオブジェクトがブロックに渡され,ブロックの実行結果がセグメントの値として保存される。
解析に失敗した場合Jpeg::ParseErrorが発生する。
JPEGイメージデータ部。PARSE_HEADER_ONLYでJpegオブジェクトを生成した場合にはnil。
EOIセグメント以降に存在しているデータ。EOI以降にデータが存在しない場合はnil。
オブジェクトが保持するJPEGイメージをバイト列として出力する。
すべてのセグメントに対しブロックを実行する。
すべてのセグメントの配列を返す
引数が文字列の場合にはセグメントのマーカと,その他の場合には引数そのものと一致するセグメントのインデックスを返す。 なければnil。
引数にマッチするセグメントが存在する場合trueを返す。引数はindexと同じ。
引数に正規表現を指定した場合,正規表現にマッチするマーカ名をもつセグメントの配列を返す。文字列を指定した場合は,それと一致するマーカまたはマーカ名をもつセグメントを返す。数値を指定した場合は引数の位置にあるセグメントを返す。
引数に一致するセグメントが無い場合,引数が正規表現のときには[],それ以外ではnilを返す。
セグメントの部分配列を返す。引数に文字列の範囲を指定した場合には,範囲の最初(range.first)に一致するセグメントから範囲の最後(range.last)に一致するセグメントまでの配列を返す。
セグメントの配列要素を変更する。配列要素指定には文字列,文字列の範囲,数値,数値の範囲を指定可能。 dataにJpeg::Segmentオブジェクト以外を指定した場合には,IMGマーカを持つJpeg::Segmentオブジェクトに変換して格納される。
posの位置にdataを挿入する。posには数値または文字列を指定可能。 dataにJpeg::Segmentオブジェクト以外を指定した場合には,IMGマーカを持つJpeg::Segmentオブジェクトに変換して格納される。
[pos,0]=dataと等価
SOIセグメントの後ろにdataを挿入する。
SOSセグメントの前にdataを挿入する。
EOIセグメントの後ろにdataを挿入する。
引数と一致するすべてのセグメントを削除する。引数には正規表現,文字列,Jpeg::Segmentオブジェクトを指定可能。正規表現,文字列を指定した場合には引数に一致するマーカ名またはマーカを持つセグメントが削除される。
ブロックを与ええられていれば,削除する要素が無かった場合に実行される。
pos番目の位置にあるセグメントを削除する。
ブロックの実行結果がtrueであるセグメントを削除する。
nilおよびデータ長が0のIMGマーカを持つJpeg::Segmentオブジェクトを削除する。
EOIセグメント以降に存在しているデータを削除する。
生成済みJpegオブジェクトに対して各セグメント解析用のクラスを指定する。 force_replaceをtrueにした場合は,指定したセグメントが解析であっても,指定されたクラスで再解析し,結果を置き換える。
セグメントにアクセスするためのメソッド。Jpeg::Segmentが返る。
セグメント解析にデフォルトで用いられるクラス。 Jpegオブジェクト内で解析に用いる独自のセグメント解析クラスを作成する場合にはこのクラスの派生クラスとしなければならない。
Class
セグメントの解析結果を保持するクラスを生成する。 markerにはセグメント識別子(マーカ)の定数を指定する。
dataがnilでなく,かつreadメソッドをもたないオブジェクトを与えた場合には,バイト列が与えられたものと解釈し,Jpeg::StringIOクラスに変換され,解析が開始される。
read_sizeにはdata.readで読みこむべきセグメントのサイズを指定する。
セグメントの識別子(マーカ)を返す。
セグメントのデータ部をバイト表現で返す。
セグメントマーカを示す名前を返す。
markerまたはmarker_nameと文字列が一致すればtrue。
marker_nameと正規表現が一致すればtrue。
マーカ,バイトサイズ,データ部を含めたバイトサイズを返す
データ部にバイト表現のデータをセットする。 FORMAT Iグループのセグメント(SOI, RSTn, EOI)の場合,TypeErrorが発生する。
セグメントのバイト表現を以下のフォーマットで返す。
"\xff"|マーカ|ビッグエンディアンで表現したセグメントのbyte数(ushort)|データ部
セグメントのbyte数にはself.sizeの戻り値を,データ部にはself.byte_dataの戻り値をそれぞれ用いる。
セグメントの解析を開始する。 Jpeg::Segmentクラスでは与えられたデータをオブジェクト変数byte_dataにコピーするだけ。 独自の解析クラスを作成する場合には,このメソッドをオーバーライドすること。
JPEGセグメントマーカ開始
イメージデータ(非マーカ)。 rjpegではイメージを格納するセグメントの識別子に用いられる。
セグメント識別子,セグメント名変換用ハッシュテーブル。
Format Iセグメント(データ部を持たないセグメント)のセグメント識別子を格納した配列
文字列をIOの様に扱うクラス。 Stringクラスにread, rewind, seekのメソッドが追加される。
String
xに文字列を指定してオブジェクトを生成する。
オブジェクト内に格納された文字列を現カーソルポインタからx byte読み出し,カーソルポインタをx byte分移動する。 xが省略された場合には文字列を最後まで読み出す。
カーソルポインタを格納された文字列の先頭に戻す。
カーソルポインタをx byte移動する。whenceは移動の始点を意味し,IO::SEEK_SET (文字列の先頭),IO::SEEK_CUR(現在位置),IO::SEEK_END(文字列の末尾)のいずれかを指定する。
SOFnセグメントを解析するクラス(サンプル)
JPEG画像の幅。
JPEG画像の高さ。
EXIFデータを解析するクラス
EXIFヘッダのパースエラー
引数はJpeg::Segment.newと同じ。
ブロックが与えられた場合には,ディレクトリの解析結果がExif::Ifd::Directoryオブジェクトとしてブロックに渡され,ブロックの実行結果がディレクトリの値として保存される。
直下のIFDを格納した配列
解析を開始する。
引数,ブロックに与えられる値はExif.newに同じ。
ブロックが与えられた場合には,ディレクトリの解析結果がExif::Ifd::Directoryオブジェクトとしてブロックに渡され,ブロックの実行結果がディレクトリの値として保存される。
EXIFフォーマット以外のデータをあたえた場合,および解析に失敗した場合にはExif::ParseErrorが発生する。
解析に成功した場合,解析前の生データは破棄される。
解析に成功した場合trueが返る。
解析後のデータから再構築したセグメントのバイトサイズ。 rexifではデータのパディングを行わないので,データによっては解析前のサイズより30byte程小さくなることがある。
解析後のデータからセグメントのデータ部を再構築して返す。 parseに失敗している場合には生データをそのまま返す。
すべてのIFD(ブロックが与えられた場合にはブロック内の評価結果が真になったIFD)の配列を返す。
IFDの階層構造に対応するため,各IFDは例のように配列として返される。
例:[[IFD0[ExifIFD[InteroperabilityIFD]]][IFD1]]
引数を省略した場合にはifdsの結果を一元配列に変換したものが返される。 引数が文字列または正規表現の場合には,識別名が一致したIFDがひとつ返される。整数を指定した場合には,ifdsの結果を一元配列に変換した中からx番目のIFDが返される。
すべてのIFDに対しブロックの内容を実行する。
IFD0を格納したExif::Ifdオブジェクトを返す。 存在しない場合にはnilを返す。
IFD1を格納したExif::Ifdオブジェクトを返す。 存在しない場合にはnilを返す。
ExifIFDを格納したExif::Ifdオブジェクトを返す。 存在しない場合にはnilを返す。
InteroperabilityIFDを格納したExif::Ifdオブジェクトを返す。 存在しない場合にはnilを返す。
すべてのディレクトリ(ブロックが与えられた場合にはブロック内の評価結果が真になったディレクトリ)の配列を返す。
引数に文字列,正規表現を指定した場合にはそれにマッチするタグ名を持ったディレクトリの配列を返す。整数が指定された場合には,その数値をID(タグ)と見なし,一致するタグを持ったディレクトリの配列を返す。
すべてのディレクトリに対しブロックの内容を実行する。
サムネール画像を返す。 サムネール画像がTIFF形式の場合,またはサムネール画像が無い場合はnil。(ToDo)
サムネール画像がある場合true。
サムネール画像がJPEGの場合true。
EXIFヘッダ文字列
EXIF TIFFマーカ定義
分数を表現するためのクラス。
Rational
[分子,分母]の形式で配列に変換する。
エンディアン情報を持ったバイトデータを表現するクラス
Class
dataにバイトデータ,endianに:le(リトルエンディアンの場合)もしくは:be(ビッグエンディアンの場合)を指定してオブジェクトを生成する。
xに数値,文字列またはExif::Rational型の値を指定し,endianに:le(リトルエンディアン)または:be(ビッグエンディアン)を指定してExif::Dataオブジェクトを生成する。
このオブジェクトのエンディアン。:le(リトルエンディアン)または:be(ビッグエンディアン)が返る。
現在のエンディアンでバイト表現を読みとる。 offsetを指定した場合,格納されているデータの先頭から指定したbyte数をスキップして読み取りを開始する。
現在のエンディアンでバイト表現をn個読みとり,結果を配列として返す。 offsetを指定した場合,格納されているデータの先頭から指定したbyte数をスキップして読み取りを開始する。
現在のエンディアンでのバイト表現を返す。
バイト表現でのサイズを返す。
それぞれのエンディアンでのpack,unpack用文字列を収めたのハッシュテーブル
IFDクラス。
パース時に,オブジェクト内に格納するディレクトリおよびIFDにアクセスするための特異メソッドが以下のルールで動的に生成される。
EXIF2.1で規定されたIFD名の小文字->大文字切替ポイントで'_'を挿入の上,全て小文字に変換。
例) ExifIFD -> exif_ifd()
戻り値はそのIFDを指すExif::Ifdオブジェクト。
タグIDを16進表記し,先頭にxをつける。EXIF2.1で規定されたタグ名がある場合には,小文字->大文字切替ポイントで'_'を挿入の上,全て小文字に変換。
例) タグID 0x0100(ImageWidth) -> x0100()およびimage_width()
戻り値はそのディレクトリを指すExif::Ifd::Directoryオブジェクト。
また,IFD1(ThumbnailIFD)の場合でサムネールイメージを発見した場合には,特異メソッドthumbnailおよびthumbnail_imageが動的に生成される。
Array
ifd_nameにこのIFDの名前を,xにExif::Dataクラスでラップされたデータを,offsetに読みこみ開始位置を指定してオブジェクトを生成する。
xを指定した場合はデータの解析が開始される。
ブロックが与えられた場合には,ディレクトリの解析結果がExif::Ifd::Directoryオブジェクトとしてブロックに渡され,ブロックの実行結果がディレクトリの値として保存される。
このIFDのIFD名。
xにExif::Dataクラスでラップされたデータを,offsetに読みこみ開始位置を指定して解析を開始する。
ブロックが与えられた場合には,ディレクトリの解析結果がExif::Ifd::Directoryオブジェクトとしてブロックに渡され,ブロックの実行結果がディレクトリの値として保存される。
解析に成功した場合は次のIFDへのオフセット値が戻る。 解析に失敗した場合はExif::ParseErrorが発生する。
自分自身も含めたこのIFD以下に含まれるすべてのIFD(ブロックが与えられた場合にはブロック内の評価結果が真になったIFD)の配列を返す。
IFDの階層構造に対応するため,各IFDは例のように配列として返される。
例:[[IFD0[ExifIFD[InteroperabilityIFD]]][IFD1]]
引数を省略した場合にはifdsの結果を一元配列に変換したものが返される。 引数が文字列または正規表現の場合には,識別名が一致したIFDがひとつ返される。整数を指定した場合には,ifdsの結果を一元配列に変換した中からx番目のIFDが返される。
自分自身も含めたこのIFD以下に含まれるすべてのIFDに対しブロックの内容を実行する。
このIFDに含まれるすべてのディレクトリ(ブロックが与えられた場合にはブロック内の評価結果が真になったディレクトリ)の配列を返す。
recursivelにfalseを指定すると,このIFDに含まれるIFD以下のディレクトリは検索しない。
引数に文字列,正規表現を指定した場合にはそれにマッチするタグ名を持ったディレクトリのうち最初に見つかったものを返す。 整数が指定された場合には,その数値をID(タグ)と見なし,一致するタグを持ったディレクトリのうち最初に見つかったものを返す。
recursivelにtrueを指定すると,このIFDに含まれるIFD以下のディレクトリも再帰的に検索する。
このIFDに含まれるすべてのディレクトリに対しブロックの内容を実行する。
recursivelにfalseを指定すると,このIFDに含まれるIFD以下のディレクトリは検索しない。
このIFDのバイト数を返す。
このIFDのバイト表現を返す。
offsetにはIFDのEXIF TIFFヘッダ先頭からの位置,endianにはエンディアンを指定する。 次のIFDへのリンクを埋め込む場合にはhas_next_lfdにtrueを指定する。 has_next_lfd=falseの場合には,次のIFDが無いものとみなし,"\x00\x00\x00\x00\x00\x00\x00\x00"が埋め込まれる。
直下にあるIFDにアクセスするためのメソッド。Exif::Ifdオブジェクトを返す。
直下にあるディレクトリにアクセスするためのメソッド。Exif::Ifd::Directoryオブジェクトを返す。
ifd_nameがIFD1でサムネールイメージを発見した場合に生成され,サムネールのフォーマットタイプを示すシンボル(:jpegもしくは:tiff)を返す。
ifd_nameがIFD1でサムネールイメージを発見した場合に生成され,サムネールのバイト表現を返す。
IFD0のIFD名定義
IFD1のIFD名定義
ExifIFDのIFD名定義 (IFD0.ExifIFD)
InteroperabilityIFDのIFD名定義 (IFD0.ExifIFD.InteroperabilityIFD)
EXIFディレクトリを格納するクラス
Class
valueメソッドでデータを出力する際に使用するプロシージャを格納したハッシュテーブル。
ifd_nameにこのディレクトリを格納するIFD名を,xにExif::Dataクラスでラップされたデータを,offsetに読みこみ開始位置を指定してオブジェクトを生成する。
xを指定した場合はデータの解析が開始される。
タグIDがtagの際にvalueメソッドで使用するプロシージャprocを登録する。 タグIDはExif::Ifd::DirectoryのタグID定数,もしくはushortな整数で指定する。
デフォルトではTAG IDがDateTime, DateTimeOriginal, DateTimeDigitizedについて,Exif::Ifd::Directory::TIME_PARSE_PROCが登録されている。
このディレクトリのタグIDを整数で返す。
このディレクトリのデータフォーマットを以下の整数で返す。
1: ubyte, 2: ascii, 3: ushort, 4: ulong, 5: urational, 6: byte, 7: undefined, 8: short, 9: long, 10: rational, 11: float, 12: double
このディレクトリのタグ名をIFD名を付加して返す。 タグ名がEXIF2.1で定義されていない場合にはタグIDをフォーマット文字列"0x%04x"でフォーマットして返す。
このディレクトリのデータフォーマットを文字列で返す。
xにExif::Dataクラスでラップされたデータを,offsetに読みこみ開始位置を指 定して解析を開始する。
解析に失敗した場合はExif::ParseErrorが発生する。
ディレクトリに格納されたデータの値を返す。 Directory.use_proc_forでパーザプロシージャを指定した場合にはパーザの戻り値を返す。
EXIFでは一つのディレクトリに複数の同一の型の値を格納することが認められているため,デフォルトではformatが2(ascii), 7(undefined),あるいはEXIF2.1でデータ個数の上限が1個と定義されているディレクトリについては直値,それ以外の場合には複数の値を格納した配列を返す。 また,formatが7(undefined)の場合,戻り値はExif::Dataクラスのインスタンスとなる。
ディレクトリに格納するデータの値をセットする。
TAG_NAME定数に格納されるテーブルにフォーマットおよびサイズが定義されている場合には,それに反した値を指定するとTypeErrorが発生する。
このディレクトリに格納されている値がExif::Ifdオブジェクトの場合true。
このディレクトリに格納されている値がArrayクラスおよびその派生クラス(Exif::Ifdクラスを除く)の場合true。
このディレクトリに格納されている値を配列にして返す。
このディレクトリに格納されている値を整数にして返す。 変換に失敗した場合は0を返す。
このディレクトリに格納されている値を浮動小数点数にして返す。 変換に失敗した場合は0.0を返す。
このディレクトリに格納されている値を文字列にして返す。
このディレクトリに格納されている値を時刻値にして返す。 変換に失敗した場合はTime.at(0)を返す。
このディレクトリに格納されているデータの個数(EXIF表現)。
Exif::Ifdを除くArrayオブジェクト,およびformatが7(undefined)の場合にはそのオブジェクトのsizeメソッドの戻り値,formatが2(ascii)の場合にはsizeメソッドの戻り値+1("\x00"),,その他の場合には1が返る。
このディレクトリに格納されているデータの総byte数(EXIF表現)。
このディレクトリの総byte数(EXIF表現)。
data_sizeが4以下の場合DIRENT_SIZE(=12),data_sizeが5以上の場合DIRENT_SIZE+data_sizeが返る。
ディレクトリのバイト表現を[ディレクトリエントリ部,データ部]のフォーマットで返す。data_sizeが4以下の場合にはデータ部はnilになる。
offsetにはディレクトリのEXIF TIFFヘッダ先頭からの位置,endianにはエンディアンを指定する。
ディレクトリエントリ部のバイト表現を返す。
offsetにはディレクトリのEXIF TIFFマーカからの位置,endianにはディレクトリのエンディアンを指定する。
データ部のバイト表現を返す。
offsetにはディレクトリのEXIF TIFFマーカからの位置,endianにはディレクトリのエンディアンを指定する。
force_dumpにfalseを指定し,data_sizeが4以下の場合にはnilが返る。
ディレクトリエントリ部バイト数
EXIFで定義されるフォーマット数値を文字列に変換するための配列
EXIFで定義されるフォーマット毎のデータ1個あたりのバイト数を格納した配列
フォーマット毎のデータ読込プロシージャを格納した配列
フォーマット毎のデータ書出プロシージャを格納した配列
EXIFの時刻表現文字列からTimeオブジェクトを生成するためのプロシージャ
タグIDとExif::Ifd::Directory::TagInfoオブジェクトを対応付けるハッシュテーブル。
TAG_NAME[タグID].nameでタグ名,TAG_NAME[タグID].formatで許容されるデータフォーマット数値の配列,TAG_NAME[タグID].limitでデータ個数の上限(0の場合上限無し)をそれぞれ取得できる。
タグID定義
EXIF2.1によるタグ毎の定義を記述するためのクラス
Class
nameにタグ名,formatにEXIFで定義されたフォーマット数値,limitにデータ個数の上限を指定してオブジェクトを生成する。
複数のフォーマットを指定する場合にはformatに配列を指定する。
データ個数に制限が無い場合にはlimitに0を指定する。
タグ名を返す。
フォーマット数値を配列で返す。
データ個数の上限を返す。 データ個数に制限が無い場合は0が返る。