• 検索結果がありません。

ICONファイルフォーマット

N/A
N/A
Protected

Academic year: 2021

シェア "ICONファイルフォーマット"

Copied!
17
0
0

読み込み中.... (全文を見る)

全文

(1)

■ エンコーダパラメータを指定した画像の保存 ■ ■ 概要 Image クラスの Save メソッドには、イメージコーデック情報とエンコーダパラメータを指定して画像 を保存するオーバーロードが有る。此れを利用すると、様々な画像形式で色々のオプションを指定して 画像を保存する事が出来る。 Visual Basic Public Sub Save ( _ filename As String, _

encoder As ImageCodecInfo, _

encoderParams As EncoderParameters _ )

C#

public void Save ( string filename, ImageCodecInfo encoder, EncoderParameters encoderParams ) パラメータは、下記の通りで有る。 パラメータ 意味 filename 此のImage の保存先ファイルの名前を格納して居る文字列

encoder 此のImage の ImageCodecInfo

encoderParams 此のImage に使用する EncoderParameters

※ 元画像に上書き保存した場合、イメージの作成元と同じファイルにイメージを保存する事は許可さ れない為、ExternalException 例外がスローされる。 ■ ImageCodecInfo クラス ImageCodecInfo クラスには、インストールされたイメージコーデックに関する総ての関連情報を検索 する為の必要なストレージメンバとメソッドが用意されて居る。 必要なイメージコーデック情報を取得する方法は、MSDN に有用なメソッド(ファンクション)が記 載されて居るので、此れを下記に示す。 Visual Basic ' MimeType で指定された ImageCodecInfo を探して返すメソッド(MSDN より) Private Shared Function GetEncoderInfo(ByVal MineType As String) _

As System.Drawing.Imaging.ImageCodecInfo

(2)

' GDI+に組み込まれたイメージエンコーダに関する情報を総て取得 Dim Encs( ) As System.Drawing.Imaging.ImageCodecInfo = _ System.Drawing.Imaging.ImageCodecInfo.GetImageEncoders( ) ' 指定された MimeType を探して見付かれば返す

Dim Enc As System.Drawing.Imaging.ImageCodecInfo For Each Enc In Encs

If Enc.MimeType = MineType Then Return Enc End If Next Return Nothing End Function C# // MimeType で指定された ImageCodecInfo を探して返すメソッド(MSDN より) private static ImageCodecInfo GetEncoderInfo(String mimeType)

{

// GDI+に組み込まれたイメージエンコーダに関する情報を総て取得 ImageCodecInfo[] encoders;

encoders = ImageCodecInfo.GetImageEncoders(); // 指定された MimeType を探して見付かれば返す for(int i = 0; i < encoders.Length; ++i)

{ if(encoders[i].MimeType == mimeType) return encoders[i]; } return null; }

Image クラスの Save メソッドの第 2 引数 encoder に指定するイメージコーデック情報を取得するコー ドは、下記の通りで有る。

Visual Basic

Dim Ici As System.Drawing.Imaging.ImageCodecInfo Ici = GetEncoderInfo("image/png") C# System.Drawing.Imaging.ImageCodecInfo ici; ici = GetEncoderInfo("image/png"); 猶、上記では、PNG 形式のイメージコーデック情報を指定して居る。使用して居るコンピュータで使 用する事の出来る画像形式の一覧は、下記のコードで確認する事が出来る(下記では、lstMIME と謂 う名前のListBox コントロールに出力して居る)。 Visual Basic ' MIME 一覧の表示

Dim Encs() As System.Drawing.Imaging.ImageCodecInfo = _ System.Drawing.Imaging.ImageCodecInfo.GetImageEncoders() Dim Enc As System.Drawing.Imaging.ImageCodecInfo

(3)

For Each Enc In Encs lstMIME.Items.Add(Enc.MimeType) Next C# ImageCodecInfo[] encoders; encoders = ImageCodecInfo.GetImageEncoders(); for(int i = 0; i < encoders.Length; ++i)

{ lstMIME.Items.Add(encoders[i].MimeType); } ■ Encoder クラス Encoder オブジェクトは、System.Drawing.Imaging 名前空間に属し、画像を保存する際に、イメージ コーデック情報と組み合わせて、様々なオプションを指定する為のエンコーダパラメータを生成するク ラスで有る。 イメージエンコーダにパラメータを渡すと、其のパラメータは、EncoderParameter オブジェクト内で カプセル化される。EncoderParameter オブジェクトのプライベートフィールドに、パラメータカテゴ リを指定するGUID が有る。イメージエンコーダが設定されて居る GDI+は、下記のカテゴリに属する パラメータを受け取る。 カテゴリ 意味 ChrominanceTable 彩度テーブル(64Bit データ?) ColorDepth 色深度 Compression 圧縮 LuminanceTable 輝度テーブル(64Bit データ?) Quality 品質 RenderMethod レンダリングメソッド SaveFlag フラグ保存 ScanMethod スキャンメソッド Transformation 変換 Version バージョン 下記に、色深度用のエンコーダを生成するコードを示す。猶、品質用のエンコーダを生成する場合は、 下記の ColorDepth を Quality とすれば良い。此れは、Image クラスの Save メソッドの第 3 引数 encoderParams に指定するエンコーダパラメータを生成するのに必要で有る。

Visual Basic

' 色深度用のエンコーダの生成

Dim Enc As System.Drawing.Imaging.Encoder Enc = System.Drawing.Imaging.Encoder.ColorDepth C#

// 色深度用のエンコーダの生成

System.Drawing.Imaging.Encoder enc;

(4)

■ EncoderParameters クラス EncoderParameters クラスは、EncoderParameter オブジェクトの配列をカプセル化(保持)するク ラスで有る。 EncoderParameters クラスのインスタンスは、格納する EncoderParameter オブジェクトの数丈の要 素を確保する必要が有る。例えば、色深度丈を指定する場合は1 個の要素、色深度と品質を指定する場 合は2 個の要素が必要と成る。 下記に、1 個の要素を持つ EncoderParameters クラスのインスタンスを生成するコードを示す。 Visual Basic ' エンコーダパラメータの生成

Dim Eps As System.Drawing.Imaging.EncoderParameters Eps = New System.Drawing.Imaging.EncoderParameters(1) C#

// エンコーダパラメータの生成

System.Drawing.Imaging.EncoderParameters eps;

eps = new System.Drawing.Imaging.EncoderParameters(1); ■ EncoderParameter クラス EncoderParameter クラスは、値の配列をイメージエンコーダに渡す為のクラスで有る。猶、 EncoderParameter オブジェクトを使用して、特定のイメージエンコーダの特定のパラメータがサポー トする値のリストを受け取る事も出来る。 色深度 下記に、色深度を指定するパラメータを生成するコードを示す。コンストラクタの第2 引数は、1 ピク セル当りのビット数で有る。 Visual Basic ' 色深度を指定するパラメータの生成(エンコーダは ColorDepth) Dim Ep As System.Drawing.Imaging.EncoderParameter Ep = New System.Drawing.Imaging.EncoderParameter(Enc, 24) C# // 色深度を指定するパラメータの生成(エンコーダは ColorDepth) System.Drawing.Imaging.EncoderParameter ep; ep = new System.Drawing.Imaging.EncoderParameter(Enc, 24); 有効な値は、1(モノクロ)、8(256 色)、16(ハイカラー)、24(フルカラー)、32(ツルーカラー)で 有る。此等は、TIFF エンコーダに対して有効で有る。 ※ 此のパラメータは、image/tiff に対して有効で有り、他の形式(image/bmp、image/giff、image/jpeg、 image/png)に対しては、エラーは発生しないが、無効で有る。 ※ 実際には、TIFF で、1(モノクロ)、8(256 色)、16(ハイカラー)では、エラーが発生する。

(5)

圧縮 下記に、圧縮方法を指定するパラメータを生成するコードを示す。コンストラクタの第 2 引数は、 System.Drawing.Imaging.EncoderValue 列挙体の値で有る。 Visual Basic ' 圧縮方法を指定するパラメータの生成(エンコーダは Compression) Dim Ep As System.Drawing.Imaging.EncoderParameter Ep = New System.Drawing.Imaging.EncoderParameter(Enc, _ System.Drawing.Imaging.EncoderValue.CompressionLZW) C# //圧縮方法を指定するパラメータの生成(エンコーダは Compression) System.Drawing.Imaging.EncoderParameter ep; ep = new System.Drawing.Imaging.EncoderParameter(Enc, System.Drawing.Imaging.EncoderValue.CompressionLZW)); 圧縮カテゴリに関する System.Drawing.Imaging.EncoderValue 列挙体の値を、下記に示す。此等は、 TIFF エンコーダに対して有効で有る。 メンバ名 説明 CompressionCCITT3 CCITT3 圧縮スキームを指定 CompressionCCITT4 CCITT4 圧縮スキームを指定 CompressionLZW LZW 圧縮スキームを指定 CompressionNone 無圧縮を指定 CompressionRle RLE 圧縮スキームを指定 ※ 此のパラメータは、image/tiff に対して有効で有り、他の形式(image/bmp、image/giff、image/jpeg、 image/png)に対しては、エラーは発生しないが(下記参照)、無効で有る。 フルカラー(24 ビット色深度)の BMP 画像(120,054 バイト)を、色々な画像形式に圧縮を施した結 果を、下記の表に示す(×はエラーが発生)。

画像形式 LZW CCITT3 CCITT4 Rle None

bmp 120,054 × 120,054 120,054 120,054 jpeg 4,398 4,398 4,398 4,398 4,398 gif 3,264 3,264 3,264 3,264 3,264 tiff 9,176 × × × 120,284 png 5,671 5,671 5,671 5,671 5,671 上表からも解る様に、実際には、TIFF 形式で LZW 圧縮の場合丈が有効で有る様で有る。 品質 下記に、品質を指定するパラメータを生成するコードを示す。コンストラクタの第2 引数は、品質を表 す0 ~ 100 の範囲の値で有る。低い数値を指定する程、圧縮率が高く成り、イメージの品質は低下す る。品質は、0 で最低、100 で最高に成る。此等は、JPEG エンコーダに対して有効で有る。 Visual Basic ' 品質を指定するパラメータの生成(エンコーダは Quality)

(6)

Dim Ep As System.Drawing.Imaging.EncoderParameter Ep = New System.Drawing.Imaging.EncoderParameter(Enc, 50) C# // 品質を指定するパラメータの生成(エンコーダは Quality) System.Drawing.Imaging.EncoderParameter ep; ep = new System.Drawing.Imaging.EncoderParameter(Enc, 50); ※ 此のパラメータは、image/jpeg に対して有効で有り、他の形式(image/bmp、image/giff、image/tiff、 image/png)に対しては、エラーは発生しないが、無効で有る。 変換 下記に、変換方法を指定するパラメータを生成するコードを示す。コンストラクタの第 2 引数は、 System.Drawing.Imaging.EncoderValue 列挙体の値で有る。 Visual Basic ' 変換方法を指定するパラメータの生成(エンコーダは Transformation) Dim Ep As System.Drawing.Imaging.EncoderParameter Ep = New System.Drawing.Imaging.EncoderParameter(Enc, _ System.Drawing.Imaging.EncoderValue. TransformRotate90) C# // 変換方法を指定するパラメータの生成(エンコーダは Transformation) System.Drawing.Imaging.EncoderParameter ep; ep = new System.Drawing.Imaging.EncoderParameter(Enc, System.Drawing.Imaging.EncoderValue. TransformRotate90)); 変換カテゴリに関する System.Drawing.Imaging.EncoderValue 列挙体の値を、下記に示す。此等は、 JPEG エンコーダに対して有効で有る。 メンバ名 説明 TransformFlipHorizontal イメージが(垂直軸の周りで)水平方向に反転される TransformFlipVertical イメージが(水平軸の周りで)垂直方向に反転される TransformRotate180 イメージが其の中心を軸に180 度回転する TransformRotate270 イメージが其の中心を軸に、時計回りに270 度回転する TransformRotate90 イメージが其の中心を軸に、時計回りに90 度回転する ※ 此のパラメータは、image/jpeg に対して有効で有り、他の形式(image/bmp、image/giff、image/tiff、 image/png)に対しては、エラーは発生しないが、無効で有る。 ※ 亦、変換元と成る画像は、JPEG 形式で無ければ成らない。更に、一度変換して保存すると、元画 像にも何等かの変更が加えられる様で、続けて変換保存するとエラーが発生する。此の場合は、元 画像の再読込が必要で有る。 クロミナンス・ルミナンス 下記に、クロミナンスとルミナンスを指定するパラメータを生成するコードを示す。コンストラクタの 第2 引数は、Short 型の 64 個の要素を持つ配列で有る。

(7)

Visual Basic

' クロミナンスを指定するパラメータの生成(エンコーダ Enc1 は ChrominanceTable) ' ルミナンスを指定するパラメータの生成(エンコーダ Enc2 は LuminanceTable) Dim D1(63) As Short : D1(0) = Short.Parse(txtChrominance.Text)

Dim D2(63) As Short : D2(0) = Short.Parse(txtLuminance.Text) For I As Integer = 1 To (D1.Length - 1) : D1(I) = D1(0) : Next For I As Integer = 1 To (D1.Length - 1) : D2(I) = D2(0) : Next Dim Ep1 As System.Drawing.Imaging.EncoderParameter

Ep1 = New System.Drawing.Imaging.EncoderParameter(Enc1, D1) Dim Ep2 As System.Drawing.Imaging.EncoderParameter

Ep2 = New System.Drawing.Imaging.EncoderParameter(Enc2, D2) C#

// クロミナンスを指定するパラメータの生成(エンコーダ enc1 は ChrominanceTable) // ルミナンスを指定するパラメータの生成(エンコーダ enc2 は LuminanceTable) short[] d1 = new short[64]; d1[0] = Short.Parse(txtChrominance.Text);

short[] d2 = new short[64]; d2[0] = Short.Parse(txtLuminance.Text); for(int i = 1; i < d1.Length; i++) d1[i] = d1[0];

for(int i = 1; i < d2.Length; i++) d2[i] = d2[0]; System.Drawing.Imaging.EncoderParameter ep1;

ep1 = new System.Drawing.Imaging.EncoderParameter(enc1, d1); System.Drawing.Imaging.EncoderParameter ep2;

ep2 = New System.Drawing.Imaging.EncoderParameter(enc2, d2)

実際には、クロミナンスとルミナンスのテーブルデータは、下記の様なデータで有る LuminanceTable 14 10 9 14 22 36 46 55 11 11 13 17 23 52 54 50 13 12 14 22 36 51 62 50 13 15 20 26 46 78 72 56 16 20 33 50 61 98 93 69 22 32 50 58 73 94 102 83 44 58 70 78 93 109 108 91 65 83 86 88 101 90 93 89 ChrominanceTable 15 16 22 42 89 89 89 89 16 19 23 59 89 89 89 89 22 23 50 89 89 89 89 89 42 59 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 ※ 此のパラメータは、image/jpegf に対して有効で有り、他の形式(image/bmp、image/giff、image/tiff、 image/png)に対しては、エラーは発生しないが、無効で有る。 ※ 亦、画像がクロミナンスかルミナンスの孰れかのテーブルを持つ場合、両方のテーブルを設定する 必要が有る。 ※ 猶、変換元と成る画像は、JPEG 形式で無くても良いが、一度変換して保存すると、元画像にも何 等かの変更が加えられる様で、続けて変換保存するとエラーが発生する。此の場合は、元画像の再 読込が必要で有る。

(8)

フラグ保存 此のパラメータを使用すると、複数の形式の異なる画像を単一の画像に保存する事が出来る。 フラグ保存カテゴリに関するSystem.Drawing.Imaging.EncoderValue 列挙体の値を、下記に示す。此 等は、TIFF エンコーダに対して有効で有る。 メンバ名 説明 Flush 複数フレームのファイルやストリームを閉じる FrameDimensionPage フレームをイメージのページディメンションに追加する FrameDimensionResolution GDI+バージョン 1.0 では使用されない。 FrameDimensionTime GDI+バージョン 1.0 では使用されない。 LastFrame 複数フレームイメージ内の最後のフレーム MultiFrame イメージに複数のフレーム(ページ)が有る ※ 此の使用法に付いては、MSDN の Encoder.SaveFlag フィールドの項に、BMP ファイル、JPEG フ ァイル、PNG ファイルから Bitmap オブジェクトを作成し、総てのイメージを、複数フレームを持 つ単一のTIFF ファイルに保存するコード例が、記載されて居る。 ■ エンコーダパラメータへの追加 個々に設定したEncoderParameter オブジェクトをエンコーダパラメータに追加するコードを、下記に 示す。 Visual Basic ' EncoderParameter オブジェクトを最初の要素に追加 Eps.Param(0) = Ep C# // EncoderParameter オブジェクトを最初の要素に追加 eps.Param[0] = ep; ■ 画像の保存 下記に、イメージコーデック情報とエンコーダパラメータを指定して画像を保存するコードを示す。 Visual Basic

Dim Bm As Bitmap = New Bitmap("c:¥img¥sample.bmp") Bm.Save("c:¥img¥sample.tiff" Ici, Eps)

C#

Bitmap bm = new Bitmap(@"c:¥img¥sample.bmp"); bm.Save(@"c:¥img¥sample.tiff" ici, eps);

(9)

■ System.Drawing.Imaging.EncoderValue 列挙体

総てのSystem.Drawing.Imaging.EncoderValue 列挙体の値を、下記に示す。

メンバ名 説明

ColorTypeCMYK GDI+バージョン 1.0 では使用されない。 ColorTypeYCCK GDI+バージョン 1.0 では使用されない。

CompressionCCITT3 CCITT3 圧縮スキーム(圧縮カテゴリ、TIFF エンコーダ) CompressionCCITT4 CCITT4 圧縮スキーム(圧縮カテゴリ、TIFF エンコーダ) CompressionLZW LZW 圧縮スキーム(圧縮カテゴリ、TIFF エンコーダ) CompressionNone 無圧縮(圧縮カテゴリ、TIFF エンコーダ)

CompressionRle RLE 圧縮スキーム(圧縮カテゴリ、TIFF エンコーダ)

Flush 複数フレームのファイルやストリームを閉じる(フラグ保存カテゴリ、 TIFF エンコーダ) FrameDimensionPage フレームをイメージのページディメンションに追加する(フラグ保存 カテゴリ、TIFF エンコーダ) FrameDimensionResolution GDI+バージョン 1.0 では使用されない。 FrameDimensionTime GDI+バージョン 1.0 では使用されない。 LastFrame 複数フレームイメージ内の最後のフレーム(フラグ保存カテゴリ、 TIFF エンコーダ MultiFrame イメージに複数のフレーム(ページ)が有る(フラグ保存カテゴリ、 TIFF エンコーダ) RenderNonProgressive GDI+バージョン 1.0 では使用されない。 RenderProgressive GDI+バージョン 1.0 では使用されない。 ScanMethodInterlaced GDI+バージョン 1.0 では使用されない。 ScanMethodNonInterlaced GDI+バージョン 1.0 では使用されない。 TransformFlipHorizontal イメージが(垂直軸の周りで)水平方向に反転される(変換カテゴリ、 JPEG エンコーダ) TransformFlipVertical イメージが(水平軸の周りで)垂直方向に反転される(変換カテゴリ、 JPEG エンコーダ) TransformRotate180 イメージが其の中心を軸に180 度回転する(変換カテゴリ、JPEG エ ンコーダ) TransformRotate270 イメージが其の中心を軸に、時計回りに270 度回転する(変換カテゴ リ、JPEG エンコーダ) TransformRotate90 イメージが其の中心を軸に、時計回りに90 度回転する(変換カテゴ リ、JPEG エンコーダ) VersionGif87 GDI+バージョン 1.0 では使用されない。 VersionGif89 GDI+バージョン 1.0 では使用されない。

(10)

■ メタデータの取得 ■ ■ 概要 イメージファイルの中には、メタデータが含まれて居る物が有り、此のデータを読み取る事に依り、其 のイメージの特徴を確認する事が出来る。デジタルカメラで撮影したイメージファイルには、此の様な メタデータが含まれて居る事が有り、撮影に使用したカメラのメーカーやモデル、撮影日時等を知る事 が出来る。亦、クロミナンスやルミナンスのテーブルの取得も可能で有る。

GDI+は、個々のメタデータを PropertyItem オブジェクトに格納する。Image オブジェクトの PropertyItems プロパティを取得する事で、ファイルから総てのメタデータを取得する事が出来る。 PropertyItems プロパティは、PropertyItem オブジェクトの配列を返すコレクションで有る。 PropertyItem オブジェクトには、Id、Value、Len、Type と謂う 4 個のプロパティが有る。 ■ Id(識別子) メタデータ項目を識別するタグで有る。Id に割り当てる事の出来る値の一部を、下表に示す。 ID(16 進値) 説明 010F 機器のメーカー 0110 機器のモデル 0131 機器の名称 0132 撮影日時 0320 イメージのタイトル 5090 輝度テーブル 5091 クロミナンステーブル 829A Exif 露光時間 9003 撮影日時 9004 撮影日時 ■ Type(型) 格納されて居る値のデータ型で有る。Type プロパティの値で示される形式を、下表に示す。 数値 説明 1 Byte 2 ASCII 形式でエンコードされた Byte 配列 3 16 ビット整数(Int16) 4 32 ビット整数(Int32) 5 有理数を表す2 つの Byte 配列 6 未使用 7 未定義 8 未使用 9 SLong 10 SRational

(11)

■ Len(バイト数)

格納されて居る値の長さ(バイト単位)で有る。 ■ Value(値)

格納されて居る値のByte 配列で有る。値の形式は、Type プロパティに依り決定される。例えば、Type が3(Int32)で有れば、Byte 配列 2 要素で 1 個のデータと成る。 ■ コード例 指定した画像ファイルからメタデータを取得して、表示するコード例を、下記に示す。 ボタン(btnGetInfomation)をクリックすると、ファイルを開くダイアログ(dlgOpen)が表示される ので、画像ファイルを指定すると、メタデータの項目がリストボックス(lstInfo)に一覧表示される。 亦、リストボックスの項目を選択すると、テキストボックス(txtInfo)に、其の詳細が表示される。 Visual Basic

Public Class EncoderInfomation Private Msg() As String

' ボタン(取得)がクリックされた時の処理

Private Sub btnGetInfomation_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnGetInfomation.Click

If dlgOpen.ShowDialog() = Windows.Forms.DialogResult.OK Then Dim Fn As String = dlgOpen.FileName

Dim Bm As Bitmap = New Bitmap(Fn)

Dim P() As System.Drawing.Imaging.PropertyItem = Bm.PropertyItems Dim D() As Byte

Dim S As String = "" Dim L As Integer

ReDim Msg(P.Length - 1)

For I As Integer = 0 To (P.Length - 1) L = P(I).Len

S = "Property Item " & I.ToString().PadLeft(2) & ", " S &= " ID : " & P(I).Id.ToString("X").PadLeft(4) & "H, " Select Case P(I).Type

Case 1 : S &= " TYPE : 1.Byte, " : Msg(I) = GetOther(P(I)) Case 2 : S &= " TYPE : 2.Byte 配列, " : Msg(I) = GetText(P(I)) Case 3 : S &= " TYPE : 3.Int16, " : Msg(I) = GetInt16(P(I)) Case 4 : S &= " TYPE : 4.Int32, " : Msg(I) = GetInt32(P(I)) Case 5 : S &= " TYPE : 5.Byte 配列, " : Msg(I) = GetOther(P(I)) Case 6 : S &= " TYPE : 6.未使用, " : Msg(I) = GetOther(P(I)) Case 7 : S &= " TYPE : 7.未定義, " : Msg(I) = GetOther(P(I)) Case 8 : S &= " TYPE : 8.未使用, " : Msg(I) = GetOther(P(I)) Case 9 : S &= " TYPE : 9.SLong, " : Msg(I) = GetOther(P(I))

(12)

Case 10 : S &= " TYPE : 10.SRational, " : Msg(I) = GetOther(P(I)) End Select

S &= " LENGTH : " & L.ToString().PadLeft(5) & " bytes" lstInfo.Items.Add(S) Next End If End Sub ' リストボックス(情報)の選択項目が変化した時の処理

Private Sub lstInfo_SelectedIndexChanged(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles lstInfo.SelectedIndexChanged

txtInfo.Text = Msg(lstInfo.SelectedIndex) End Sub

' Byte 配列(ASCII エンコーディング)の値を文字列に変換するジェネラルプロシージャ Private Function GetText(ByVal P As System.Drawing.Imaging.PropertyItem) As String Dim D() As Byte = P.Value

Return System.Text.Encoding.ASCII.GetString(D) End Function

' Int16 の値を文字列に変換するジェネラルプロシージャ

Private Function GetInt16(ByVal P As System.Drawing.Imaging.PropertyItem) As String Dim D() As Byte = P.Value

Dim N As Integer = 0 Dim S As String = ""

For I As Integer = 0 To (D.Length - 1) Step 2 N = D(I) + D(I + 1) * 256

S &= (N.ToString() & " ") Next

Return S.Trim() End Function

' Int32 の値を文字列に変換するジェネラルプロシージャ

Private Function GetInt32(ByVal P As System.Drawing.Imaging.PropertyItem) As String Dim D() As Byte = P.Value

Dim N As Integer = 0 Dim S As String = ""

For I As Integer = 0 To (D.Length - 1) Step 4

N = D(I) + D(I + 1) * 256 + D(I + 2) * 65536 + D(I + 3) * 16777216 S &= (N.ToString() & " ")

Next

Return S.Trim() End Function

' 其他の値を文字列に変換するジェネラルプロシージャ

(13)

Dim N As Integer = 0 Dim S As String = ""

For I As Integer = 0 To (D.Length - 1) Step 2 N = D(I)

S &= (N.ToString("X").PadLeft(2, "0") & " ") Next Return S.Trim() End Function End Class C# using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace EncoderInfomation {

public partial class EncoderInfomation : Form { private string[] msg; public EncoderInfomation() { InitializeComponent(); } // ボタン(取得)がクリックされた時の処理

private void btnGetInfomation_Click(object sender, EventArgs e) {

if (dlgOpen.ShowDialog() == DialogResult.OK) {

string fn = dlgOpen.FileName; Bitmap bm = new Bitmap(fn); System.Drawing.Imaging.PropertyItem[] p = bm.PropertyItems; string s = ""; int l; msg = new string[p.Length]; lstInfo.Items.Clear();

for (int i = 0; i < p.Length; i++) {

l = p[i].Len;

s = "Property Item " + i.ToString().PadLeft(2) + ", "; s += " ID : " + p[i].Id.ToString("X").PadLeft(4) + "H, ";

(14)

switch (p[i].Type) {

case 1: s += " TYPE : 1.Byte, "; msg[i] = GetOther(p[i]); break; case 2: s += " TYPE : 2.Byte 配列, "; msg[i] = GetText(p[i]); break; case 3: s += " TYPE : 3.Int16, "; msg[i] = GetInt16(p[i]); break; case 4: s += " TYPE : 4.Int32, "; msg[i] = GetInt32(p[i]); break; case 5: s += " TYPE : 5.Byte 配列, "; msg[i] = GetOther(p[i]); break; case 6: s += " TYPE : 6.未使用, "; msg[i] = GetOther(p[i]); break; case 7: s += " TYPE : 7.未定義, "; msg[i] = GetOther(p[i]); break; case 8: s += " TYPE : 8.未使用, "; msg[i] = GetOther(p[i]); break; case 9: s += " TYPE : 9.SLong, "; msg[i] = GetOther(p[i]); break; case 10: s += " TYPE : 10.SRational, "; msg[i] = GetOther(p[i]); break; }

s += " LENGTH : " + l.ToString().PadLeft(5) + " bytes"; lstInfo.Items.Add(s); } } } // リストボックス(情報)の選択項目が変化した時の処理

private void lstInfo_SelectedIndexChanged(object sender, EventArgs e) {

txtInfo.Text = msg[lstInfo.SelectedIndex]; }

// Byte 配列(ASCII エンコーディング)の値を文字列に変換するジェネラルプロシージャ private string GetText(System.Drawing.Imaging.PropertyItem p)

{ byte[] d = p.Value; return System.Text.Encoding.ASCII.GetString(d); } // Int16 の値を文字列に変換するジェネラルプロシージャ

private string GetInt16(System.Drawing.Imaging.PropertyItem p) {

byte[] d = p.Value; int n = 0;

string s = "";

for (int i = 0; i < d.Length; i+=2) { n = d[i] + d[i + 1] * 256; s += (n.ToString() + " "); } return s.Trim(); } // Int32 の値を文字列に変換するジェネラルプロシージャ

(15)

{

byte[] d = p.Value; int n = 0;

string s = "";

for (int i = 0; i < d.Length; i += 4) {

n = d[i] + d[i + 1] * 256 + d[i + 2] * 65536 + d[i + 3] * 16777216; s += (n.ToString() + " "); } return s.Trim(); } // 其他の値を文字列に変換するジェネラルプロシージャ

private string GetOther(System.Drawing.Imaging.PropertyItem p) {

byte[] d = p.Value; int n = 0;

string s = "";

for (int i = 0; i < d.Length; i += 2) { n = d[i]; s += (n.ToString("X").PadLeft(2, '0') + " "); } return s.Trim(); } } } 下記のコード例は、MSDN に記載されて居る物で有る。【参考】 ファイルFakePhoto.jpg からメタデータの 7 個の部分を読み取って表示するコード例を、下記に示す。 リスト内の2 番目の(インデックス 1)プロパティ項目には、Id 0x010F(機器のメーカー)と Type 2 (ASCII 形式でエンコードされたバイト配列)が指定されて居る。此のコード例は、此のプロパティ項 目の値を表示する。 Visual Basic ' Image オブジェクトの生成

Dim image As Bitmap = New Bitmap("c:¥FakePhoto.jpg") ' イメージから PropertyItems プロパティを取得

Dim propItems As PropertyItem() = image.PropertyItems

' 表示用の設定

Dim font As New Font("Arial", 12)

Dim blackBrush As New SolidBrush(Color.Black) Dim X As Integer = 0

(16)

' 各 PropertyItem の ID とデータ型と長さを表示 Dim count As Integer = 0

Dim propItem As PropertyItem For Each propItem In propItems

e.Graphics.DrawString( "Property Item " & count.ToString(), _ font, blackBrush, X, Y)

Y += font.Height

e.Graphics.DrawString( " iD: 0x" & propItem.Id.ToString("x"), _ font, blackBrush, X, Y)

Y += font.Height

e.Graphics.DrawString( " type: " & propItem.Type.ToString(), _ font, blackBrush, X, Y)

Y += font.Height

e.Graphics.DrawString( " length: " & propItem.Len.ToString() & " bytes", _ font, blackBrush, X, Y) Y += font.Height count += 1 Next propItem ' 2 番目のプロパティを文字列に変換して表示

Dim encoding As New System.Text.ASCIIEncoding()

Dim manufacturer As String = encoding.GetString(propItems(1).Value)

e.Graphics.DrawString( "The equipment make is " & manufacturer & ".", _ font, blackBrush, X, Y)

C#

// Image オブジェクトの生成

Image image = new Bitmap("c:¥FakePhoto.jpg"); // イメージから PropertyItems プロパティを取得 PropertyItem[] propItems = image.PropertyItems; // 表示用の設定

Font font = new Font("Arial", 12);

SolidBrush blackBrush = new SolidBrush(Color.Black); int X = 0;

int Y = 0;

/ /各 PropertyItem の ID とデータ型と長さを表示 int count = 0;

foreach (PropertyItem propItem in propItems) {

(17)

e.Graphics.DrawString( "Property Item " + count.ToString(), font, blackBrush, X, Y);

Y += font.Height;

e.Graphics.DrawString( " iD: 0x" + propItem.Id.ToString("x"), font, blackBrush, X, Y);

Y += font.Height;

e.Graphics.DrawString( " type: " + propItem.Type.ToString(), font, blackBrush, X, Y);

Y += font.Height;

e.Graphics.DrawString( " length: " + propItem.Len.ToString() + " bytes", font, blackBrush, X, Y);

Y += font.Height;

count++; }

// 2 番目のプロパティを文字列に変換して表示

System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding(); string manufacturer = encoding.GetString(propItems[1].Value);

e.Graphics.DrawString( "The equipment make is " + manufacturer + ".", font, blackBrush, X, Y);

参照

関連したドキュメント

ある周波数帯域を時間軸方向で複数に分割し,各時分割された周波数帯域をタイムスロット

Toshihiro Shirakawa and Ryuhei Uehara Common Developments of Three Different Orthogonal Boxes, The 24th Canadian Conference on Computational Geometry CCCG 2012, pp... The bible of

答 200dpi 以上の解像度及び赤・緑・青それぞれ 256 階調 (注) 以上で JIS X6933 又は ISO

ユーザ情報を 入力してくだ さい。必要に 応じて複数(2 つ目)のメー ルアドレスが 登録できます。.

本手順書は複数拠点をアグレッシブモードの IPsec-VPN を用いて FortiGate を VPN

72 Officeシリーズ Excel 2016 Learning(入門編) Excel の基本操作を覚える  ・Excel 2016 の最新機能を理解する  ・ブックの保存方法を習得する 73

エンプティ フラグ、プログラム可能なオールモストエンプティ フ ラグ、ハーフフル フラグ、プログラム可能なオールモストフル フラグ、およびフル フラグ ( 、 、 、

第9図 非正社員を活用している理由