delphi-5-pro及びTurbo-Delphiを使っています。
アクセスのデータファイルに接続してテキストや数値型データを読み書きするところは完了したのですが、「OLEオブジェクト型」フィールドにある画像データを取り出す方法がどうしてもわかりません。
DBイメージを関連づけるだけじゃ駄目なようだし、そもそも元のデータはjpegであったりBMPであったりと一貫性がありません。
「拡張子」というフィールドがあってその値でいずれの画像形式であるのか識別はできます。
このフィールド値を画像ファイルとして取り出す方法を伝授いただけませんでしょうか。
あくせくさんこんにちは。
TBlobStreamを使ってみてはいかがでしょう。
var
Buffer: PChar;
MemSize: Integer;
Stream: TBlobStream;
begin
Stream := TBlobStream.Create(query1.FieldByName('XXXX') as
TBlobField, bmRead);
try
MemSize := Stream.Size;
Inc(MemSize); {バッファーの null ターミネーター用に空きスペースを準備 }
Buffer := AllocMem(MemSize);
try
Stream.Read(Buffer^, MemSize);
{Bufferの中身に対する処理記述 }
finally
FreeMem(Buffer, MemSize);
end;
finally
Stream.Free;
end;
end;
真琴:「アクセスDATABASEは知らないけど、PARADOXだったらコレで出来るよね? ハルコさん」
procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField);
begin
Show_BlobField(TDataSource(Sender).DataSet.FieldByName('Graphic') as TBlobField, DBImage1);
end;
procedure TForm1.Show_BlobField(aField: TBlobField; aImage: TDBImage);
var
bs: TBlobStream;
Header: array[0..7]of WORD;
OleGraphic: TOleGraphic;
begin
bs := TBlobStream.Create(TBlobField(aField), bmRead);
try
if bs.Size > SizeOf(Header) then begin
bs.Read(Header, SizeOf(Header));
// if (Header[0] = $4D42) then begin // BMP
// bs.Position := 0;
// end else
if (Header[Length(Header) div SizeOf(WORD)] = $4D42) then begin // BMP
bs.Position := Length(Header);
end else begin // BMP, JPG, GIF, ICO, METAFILE
bs.Position := 0;
end;
OleGraphic := TOleGraphic.Create;
try
OleGraphic.LoadFromStream(bs);
aImage.Picture.Assign(OleGraphic);
finally
OleGraphic.Free;
end;
end;
finally
bs.Free;
end;
end;
春子:「そうね、もしアクセスの格納画像がバイナリならば、こんなカンジでもイケルけど…」
真琴:「え? OLEオブジェクト型って、バイナリじゃないの?」
春子:「そう、ただのバイナリじゃないみたいだから、バイナリに変換しないとダメだと思うよ」
真琴:「どんな変換?」
春子:「アタシも詳しくはないけど、ヘッダー情報(105文字とか78バイトとか)があって、残りをBase64で変換するとか…ヘッダー長も変る場合があるとか…」
真琴:「そんなアヤフヤなの? じゃぁ、変換は無理かぁ…」
春子:「とにかく、まず、そのOLEオブジェクト型がどんなものかを解析しないとダメかな?」
「アクセス」さんこんには.Mr.XRAYです.
>「OLEオブジェクト型」フィールドにある画像データを
の場合,基本的にDelphiでは,以下のページのコードで扱えます.
http://mrxray.on.coocan.jp/Delphi/plSamples/560_RichEditDB.htm
例えば,
//=============================================================================
// ADOQuery1からJPEG画像データを取得して表示
// 画像の場合,記録画像の種類(TBitmap,TJpegImage等)を知っている必要がある
//=============================================================================
procedure TForm1.btnRead20Click(Sender: TObject);
var
AJPEG : TJPEGImage;
begin
if ADOQuery1.Active=False then OpenTable;
ADOQuery1.First;
Image1.Picture.Assign(nil);
AJPEG := TJPEGImage.Create;
try
//項目FOleObjの内容をAJPEGに読込んでImage1に表示
//AJPEG.Assign(TBlobField(ADOQuery1.FieldByName('FOleObj')));でも同じ
AJPEG.Assign(ADOQuery1.FieldByName('FOleObj'));
Image1.Picture.Assign(AJPEG);
finally
AJPEG.Free;
end;
end;
(動作確認は Windows XP(SP2) + Delphi 5,6,7,2007 )
ただし,これは,Delphiのコードでmdbに書き込んだデータの場合です.
春子さんが言っているように,
他の,例えばAccess側で書き込んだデータはそのままでは読めない場合があるようです.
http://blog.goo.ne.jp/souichi-kikaizikake/e/9b80f863c5e751fa6961774e09266885
Mr.XRAYです.
またまた大変失礼しました.
TADOQueryで接続とは書いていませんね.
私のレスはTADOQueryを使用した場合と解釈してください.
また
if ADOQuery1.Active=False then OpenTable;
は,テーブルを開くクエリーを実行するものです.
>http://blog.goo.ne.jp/souichi-kikaizikake/e/9b80f863c5e751fa6961774e09266885
このページにあるリンクの内,このQ and Aへのリンクがうまくいかないようですのです.
以下になっています.参考までに.
ACCESSのOLEオブジェクト型で質問
https://www.petitmonte.com/bbs/answers?question_id=2924
dbimageでaccessの画像が読めません。
https://www.petitmonte.com/bbs/answers?question_id=5032
ツイート | ![]() |