16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル
"RE:Bitmap結合+コメント付け TStream使用"
この発言は #00452 凛 さんのBitmap結合+コメント付け TStream使用 に対するコメントです
凛 さん、こんにちは。
>TFileStreamとTMemoryStreamを使い複数(この場合2つ)Bitmapファイルを
>結合し、コメントを付加した、独自ファイルを作る/読む方法の例です。
ちょっと改造させて頂きました。
(1)数百個単位で結合する場合にも対応、同時に開くストリーム数は2個
(2)ファイル名は最初に配列に格納されているものとする
要するに本格的なゲーム用にも使えるように(^^;)
type
TMixDataHeader = Record
datasize : array[0..999] of integer; //ファイルのサイズ
dataheadder : array[0..999] of integer; //ファイルの先頭位置
//あとはファイルの名前とか属性とか適当に入れるつもり
end;
//ファイルを結合する
procedure TForm1.Button1Click(Sender: TObject);
var
fs,dat1:TFileStream;
theHeader:TMixDataHeader;
filenames : array[0..5] of string;
i,imax: integer;
begin
//どこかからファイルリストは持ってくる感じで
filenames[0] := 'c:\1.bmp';
filenames[1] := 'c:\2.bmp';
filenames[2] := 'c:\3.bmp';
filenames[3] := 'c:\1.wav';
filenames[4] := 'c:\4.bmp';
imax := 4; //本当はちゃんとやりましょう
for i := 0 to imax do
begin;
dat1 :=TFilestream.Create(filenames[i],fmOpenRead);
theHeader.datasize[i] := dat1.size;
dat1.free
end;
theHeader.dataheadder[0]:= sizeof(theHeader);
for i := 1 to imax do
begin;
theHeader.dataheadder[i] :=
theHeader.dataheadder[i-1]+theHeader.datasize[i-1];
end;
fs:=TFileStream.create('c:\0.dat',fmCreate);
fs.position:=0;
fs.Write(theHeader,sizeOf(theHeader));
for i := 0 to imax do
begin;
dat1 :=TFilestream.Create(filenames[i],fmOpenRead);
dat1.position:=0;
fs.copyfrom(dat1,dat1.size);
dat1.free;
end;
fs.free;
end;
//ビットマップの場合の、取り出しと表示
procedure TForm1.Button2Click(Sender: TObject);
var
dat1:TMemoryStream;
fs:TFileStream;
theHeader:TMixDataHeader;
bmp:TBitmap;
i: integer;
begin
bmp:=TBitmap.create;
dat1:=TMemoryStream.Create;
i := 2; //適当です
fs:=TFileStream.create('c:\0.dat',fmOpenRead);
fs.position:=0;
fs.Read(theheader,sizeOf(theHeader));
fs.position := theHeader.dataheadder[i];
dat1.CopyFrom(fs,theHeader.datasize[i]);
dat1.position:=0;
bmp.LoadFromStream(dat1);
image1.Picture.assign(bmp);
fs.free;
dat1.free;
bmp.free;
end;
//サウンドの場合の取り出しと演奏
procedure TForm1.Button3Click(Sender: TObject);
var
dat1:TMemoryStream;
fs:TFileStream;
theHeader:TMixDataHeader;
i: integer;
begin
dat1:=TMemoryStream.Create;
i := 3; //適当です
fs:=TFileStream.create('c:\0.dat',fmOpenRead);
fs.position:=0;
fs.Read(theheader,sizeOf(theHeader));
fs.position := theHeader.dataheadder[i];
dat1.CopyFrom(fs,theHeader.datasize[i]);
dat1.position:=0;
dat1.SaveToFile('c:\temp.wav');
dat1.Free;
fs.free;
//DirectXなら TWave.LoadFromStream が使えるのですが。
With MediaPlayer1 do begin
Filename := 'c:\temp.wav';
Open;
Play;
Close;
end;
end;
PS. MindStormはほんと〜に面白いです。spirit.ocxをDelphiから使うサンプル
書いてみようかな(笑)
http://member.nifty.ne.jp/toyozou
99/02/11(木) 00:29 とよぞう(PXW07530)
Original document by とよぞう 氏 ID:(PXW07530)
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。
Copyright 1996-2002 Delphi Users' Forum
|