*.MDBの取扱について:画像の取得


あくせく  2009-01-22 06:34:42  No: 33192

delphi-5-pro及びTurbo-Delphiを使っています。
アクセスのデータファイルに接続してテキストや数値型データを読み書きするところは完了したのですが、「OLEオブジェクト型」フィールドにある画像データを取り出す方法がどうしてもわかりません。
DBイメージを関連づけるだけじゃ駄目なようだし、そもそも元のデータはjpegであったりBMPであったりと一貫性がありません。
「拡張子」というフィールドがあってその値でいずれの画像形式であるのか識別はできます。
このフィールド値を画像ファイルとして取り出す方法を伝授いただけませんでしょうか。


pekesuke  2009-01-22 21:45:19  No: 33193

あくせくさんこんにちは。

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;


アヤフヤ  2009-01-22 21:54:37  No: 33194

真琴:「アクセス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  URL  2009-01-25 06:21:10  No: 33195

「アクセス」さんこんには.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  URL  2009-01-25 07:43:07  No: 33196

Mr.XRAYです.

またまた大変失礼しました.
TADOQueryで接続とは書いていませんね.
私のレスはTADOQueryを使用した場合と解釈してください.
また

  if ADOQuery1.Active=False then OpenTable;
  
は,テーブルを開くクエリーを実行するものです.


Mr.XRAY  URL  2009-01-25 08:34:54  No: 33197

>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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加