FX入門

バイナリデータとは

バイナリデータとは
Tcl/Tk

バイナリデータにするには?

1.デスクトップのデータを読み込みます。
2.ビットマップデータを Form に貼り付けた Image1 に描画します。
3.Image1 の縦・横2分の1サイズのImage2 に Assign します。
4.Image2 に表示されているデータを MemoryStream に保存します
5.MemoryStream のデータをファイルに保存します。
6.ファイルを MemoryStream に読み込みます。
7.Image2 にデータを表示します。

デスクトップのデータを読み込んで TBitmap に取り込み、
Image1 に表示するところまではできました。
デスクトップの画像が小さく(1600x1200->80x64)なって表示されています。
この、80×64の画像データをバイナリデータ(TMemoryStream)として
取り込みたいのです。

環境は Windows2000、WindowsXP で Delphi6、Delphi7 です。

ビットマップ形式にするのは簡単です。 Canvas の StrechDraw や CopyRect
をつかって画像をコピーして SaveToFile するだけです。

それでしたら、TBitmap には SaveToStream() メソッドもあります。

りおりおさんすみません。
確かに意味はおかしいですね。
Bitmap 形式でデータを出力させたいので、
簡単にセーブするために TMemoryStream で SaveToFile としてだけで
Bitmap ファイルが作成できるようなデータと言う意味です。
これでも少し日本語変なのかも知れませんけど
意味というかやりたいことがわかってもらえますでしょうか?

で、現在は 元のデータが BmpSource にあり、
Image1.Width,Image.Height を 60,45 、Stretch=True に設定して
Image1.バイナリデータとは Picture.Bitmap.Assign(BmpSource) で Image1に縮小した
絵が表示されています。

わからないのはこの 60×45 サイズのビットマップデータを
BmpDest に作成したいのです。

ちなみに
TBitmap.SaveToStream(MemStr) の後 MemStr.SaveToFile('作成.bmp')
もしくは TBitmap.SaveToFile('作成.bmp')
として、Windowsのペイントソフト等で読み込めるのでしょうか?

目的は
MemStr.SaveToFile('作成.bmp');
として作成されたファイルがビットマップ形式のファイルであること
なのですが。

以下のように作成してみました。
BmpSource には 1600X1200 のビットマップデータがあります。
Image1 (現在 60X45)は縮小されたデータが表示されています。
BmpDest に データをコピーしましたが、縮小されたデータではなく
1600X1200 の左上の 60X45 の部分だけがコピーされます。

procedure TForm1.Button1Click(Sender: TObject);
var
Rect Area;
begin
GetDeskTopBitmap(BmpSource); //←DeskTop の画像取得
Image1.Picture.Bitmap.Assign(BmpSource); //←Image1 に貼り付け

BmpDest.Width := Image1.Width;
BmpDest.Height := Image1.Height;
Area = Rect(0, 0, Image1.Widht - 1, Image1.Height - 1);
BmpDest.Canvas.CopyRect(Area, Image1.Canvas, Area);
BmpDest.SaveToFile('D:\Test.bmp');

> CopyRect(Area, Image1.Canvas, Area);

TImage は保持している画像のサイズと目に見えるように表示してる画像のサイズが
違っています。(今の場合)これがヒントです。

> バイナリデータとは BmpDest.Canvas.CopyRect(Area, Image1.Canvas, Area);

> 1600X1200 の左上の 60X45 の部分だけがコピーされます。

りおりおさんどうもありがとうございます。
サイズが小さくなりました。
でも、ちょっとおかしいと思われるところがあります。

縮小した画像は32ビット(デスクトップ表示)だったのに
色圧縮されたような絵になってしまいます。
どうしてでしょうか?

procedure TForm1.FormCreate(Sender: TObject);
begin
BmpSource := TBitmap.Create;
BmpDest := TBitmap.Create;
BmpDest.Width := 320;
BmpDest.Height := 240;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
BmpSource.Free;
BmpDest.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
GetDeskTopBitmap(BmpSource);
BmpDest.Canvas.CopyRect(Rect(0, バイナリデータとは 0, BmpDest.Width, BmpDest.Height),
BmpSource.Canvas, Rect(0, 0, BmpSource.Width, BmpSource.バイナリデータとは Height));
BmpDest.SaveToFile('D:Test.bmp');
end;

GetDeskTopBitmapの中が不明ですが、
StretchDrawを使ってはどうでしょうか。
縮小のアルゴリズムが違うようです。
StretchDrawは明らかに単純間引き、CopyRectはなんだかうまく文字部分を優先的に残すようになってるみたいです。

BmpDest.Canvas.CopyRect(Rect(0, 0, BmpDest.Width, BmpDest.Height),
BmpSource.Canvas,
Rect(0, 0, BmpSource.Width, BmpSource.Height)
);
BmpDest.SaveToFile('C:\Test(copyrect).bmp');

BmpDest.Canvas.StretchDraw(Rect(0, 0, BmpDest.Width, バイナリデータとは BmpDest.Height),
BmpSource);

5 バイナリXML for Javaの使用

バイナリXMLは、Oracle 11 g バイナリデータとは リリース1(11.1)で導入された機能です。バイナリXMLを使用すると、XMLテキストと圧縮バイナリXMLの間でのエンコードおよびデコードが可能になります。効率を考慮して、DOMおよびSAX APIは、XMLアプリケーションが直接使用できるようにバイナリXMLの上位にあります。XMLドキュメントのフラグメントの圧縮と解凍により、インクリメンタル処理が促進されます。

この章では、XML Parser for Javaを十分に理解していると想定します。

バイナリXML格納形式

XMLType 記憶域オプションは、XML文書を新しいバイナリ形式で格納するために提供されています。この新しい記憶域オプションは、既存の CLOB オプションおよびオブジェクト・リレーショナル記憶域オプションに追加されるものです。新しいバイナリXML記憶域オプションを使用して、 XMLType の表および列を作成することができます。バイナリ形式のXMLデータは、 XMLType 上で動作するすべての既存のSQL演算子および関数、およびPL/SQL APIでアクセスおよび操作することができます。

バイナリXMLプロセッサ

バイナリXMLプロセッサとは、バイナリXML形式をテキストに、またXMLテキストをバイナリXML形式に処理および変換するコンポーネントを説明する抽象語です。スキーマを格納するためのキャッシュも提供されます。バイナリXMLプロセッサのベース・クラスは BinXMLProcessor です。バイナリXMLプロセッサでは、ネットワーク・プロトコル・リクエストを発信または受信できます。

バイナリXMLの使用モデル

バイナリXML for Javaにはいくつかの使用モデルがあります。最初に用語集を示します。

バイナリXMLの用語集

スタンドアロン・モデル

これはバイナリXMLの最も単純な使用例です。単一のバイナリXMLプロセッサがあります。使用可能な唯一のリポジトリは、永続的でなく、バイナリXMLプロセッサが存在する間だけ使用できる、ローカルなメモリー内ボキャブラリ・キャッシュです。すべてのスキーマはあらかじめエンコーディング前にバイナリXMLプロセッサに登録される必要がありますが、XMLプロセッサが xsi:SchemaLocation タグを認識したときに自動登録させることもできます。デコーディングの場合、スキーマはボキャブラリ・キャッシュですでに使用可能です。

クライアントサーバー・モデル

データに対して別個の接続が指定( associateDataConnection() を使用)されているのでなければ、エンコーディングでもデコーディングでも同じ接続を使用してすべてのデータとメタデータが格納および取得されるとします。

リポジトリを使用したWebサービス・モデル

このシナリオでは複数のクライアントがあり、それぞれでバイナリXMLプロセッサが実行されています。エンコーディングするクライアントとデコーディングするクライアントは異なります。メタデータを格納するための、すべてのクライアントに接続された共有リポジトリ(データベースでなくてもかまいません)があります。これはファイル・システムでも何か他のリポジトリでもかまいません。最初のバイナリXMLプロセッサは、エンコーディングを実行する前に、スキーマがリポジトリに登録されるか、エンコーディング時に xsi:schemaLocation タグを使用してスキーマが自動的に登録されることを保証します。2番目のバイナリXMLプロセッサはデコーディングに使用され、スキーマの場所を認識しません。スキーマはリポジトリからフェッチします。

最初のバイナリXMLプロセッサがスキーマを登録し、2番目のバイナリXMLプロセッサが同一のスキーマをリポジトリに登録すると、バイナリXMLプロセッサはスキーマをコンパイルしないで、ローカルなボキャブラリ・キャッシュにある、既存のコンパイル済スキーマの vocabulary-id を戻します。

リポジトリを使用しないWebサービス・モデル

このシナリオでは複数のクライアントがあり、それぞれでバイナリXMLプロセッサが実行されています。エンコーディングとデコーディングが異なったクライアント上で発生する可能性があります。共有メタデータ・リポジトリはありません。エンコーダは、次のクライアントに渡されたバイナリ・データがスキーマに依存しない、つまりインライン・トークン定義を持っていることを保証する必要があります。そうするには、エンコード時に setProperty() メソッドを使用して schemaAware = false 、および inlineTokenDefs = true と設定します。デコーディング時にスキーマは必要ありません。

バイナリXML for Javaの各部分

バイナリXMLエンコーディング: バイナリXMLエンコーダはXML 1.0 infoset をバイナリXMLに変換します。

BバイナリXMLデコーディング: バイナリXMLデコーダはバイナリXMLをXML infosetに変換します。

バイナリXMLエンコーディング

エンコーダは BinXMLStream から作成されます。入力はXMLテキストとみなされ、作成元の BinXMLStream に対してエンコード済バイナリXMLを出力します。エンコーダはストリーミングSAXを使用してXMLテキストを読み取ります。XMLテキストのエンコーディングはXML解析の結果に基づいています。

エンコーディングがスキーマ対応か、スキーマレスかどうかを指定するエンコーダ上で schemaAware フラグを設定します。

エンコーダ上の別のプロパティは、PSVI(Post Schema Validated Infoset)情報をバイナリ・ストリームの一部として指定しています。これがtrueに設定されると、DOM上のPSVI用のXDK拡張APIを使用してPSVI情報にアクセスできます。 psvi = true の場合、入力XMLはスキーマに関して完全に検証されます。 psvi が false の場合、PSVI情報は出力バイナリ・ストリームに含まれません。デフォルトは false です。

バイナリXMLデコーディング

バイナリXMLデコーダはバイナリXMLをXML infosetに変換します。デコーダは BinXMLStream から作成されます。このストリームからバイナリXMLを読み取り、SAXイベントを出力するか、デコードされたXMLの読取りのためのPull型 InfosetReader APIを提供します。スキーマが BinXMLStream に関連付けられている場合、バイナリXMLデコーダは、デコーディングの前にボキャブラリIDを使用してボキャブラリ・キャッシュから関連付けられたスキーマ・オブジェクトを取得します。ボキャブラリ・キャッシュにスキーマがないが、サーバーへの接続情報はある場合、スキーマはサーバーからフェッチされます。

スキーマが BinXMLStream に関連付けられていない場合、トークン定義は BinXMLStream 内のインラインであっても、トークン・セットに格納されていてもかまいません。対応する名前空間のトークンが、ローカルなボキャブラリ・キャッシュの中に格納されていない場合、トークン・セットはリポジトリからフェッチされます。

Tcl – バイナリデータの操作(2) -binary format-

Tcl/Tk

binary format

binary formatは、formatString で指定した書式に従って arg で指定した文字列をバイナリデータに変換を行い、変換したバイナリデータを返します。

formatString バイナリデータとは の指定方法

a
文字列argをcount桁分、バイナリ値で出力します。

A
argがcountより少ない場合、スペースで埋められます。それ以外は、aと同じ。

b
2進数表記の文字列(age)をcount桁分、バイト単位でlow-to-high順に出力します。

[参考]
ビット・桁の数え方

例の場合

B
ビットが各バイト内のhigh-to-lowの順番で出力されることを除いて、bと同じです。

h
16進数表記の文字列(age)をcount桁分、バイト単位でlow-to-high順に出力します。

H
バイト内で上位から下位(high-to-low)の順で出力されることを除いて、hと同じです。

c
1つ以上の8ビット整数値を変換します。

s
1つ以上の16ビット整数値をリトルエンディアン(little-endian)順に出力します。

16ビット(2バイト)の内、最下位バイトを先に出力します。それ以外はcと同じです。

S
1つ以上の16ビット整数値をビッグエンディアン(big-endian)順に出力します。

16ビット(2バイト)の内、最上位バイトを先に出力します。それ以外はsと同じです。

t
Tclスクリプトが実行されているマシンのネイティブのバイト順で16ビット整数を出力することを除いて、sおよびSと同じです。

i
1つ以上の32ビット整数値をリトルエンディアン(little-endian)順に出力します。

32ビット(4バイト)の内、最下位バイトを先に出力します。それ以外はcと同じです。

I
1つ以上の32ビット整数値をビッグエンディアン(big-endian)順に出力します。

32ビット(4バイト)の内、最上位バイトを先に出力します。それ以外はiと同じです。

n
Tclスクリプトが実行されているマシンのネイティブのバイト順で32ビット整数を出力することを除いて、iおよびIと同じです。

w
1つ以上の64ビット整数値をリトルエンディアン(little-endian)順に出力します。

64ビット(8バイト)の内、最下位バイトを先に出力します。それ以外はcと同じです。

W
1つ以上の64ビット整数値をビッグエンディアン(big-endian)順に出力します。

64ビット(8バイト)の内、最上位バイトを先に出力します。それ以外はwと同じです。

m
Tclスクリプトが実行されているマシンのネイティブのバイト順で64ビット整数を出力することを除いて、wおよびWと同じです。

f
1つ以上の単精度浮動小数点数を、マシンのネイティブ表現で出力します。

たとえば、Intel(R) バイナリデータとは Core(TM) i7-4770 CPU上で実行されているWindowsシステムでは、

r
単精度浮動小数点数をリトルエンディアン順に格納することを除いて、fと同じです。

R
単精度浮動小数点数をビッグエンディアン順に格納すること以外はrと同じです。

d
1つ以上の倍精度浮動小数点数を、マシンのネイティブ表現で出力します。それ以外は、fと同じです。

q
倍精度浮動小数点数をリトルエンディアン順に格納することを除いて、dと同じです。

Q
倍精度浮動小数点数をビッグエンディアン順で格納することを除いてqと同じです。

x
count個のnullバイトを出力します。countが指定されていない場合は、1バイトのnullを出力します。countが*の場合、エラーが発生します。

関連記事

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次
閉じる