サーバにある画像をDelphiで表示させるには?


やまやま  2005-02-15 01:38:43  No: 13231

サーバの中にある画像データをDelphiのTImageに表示させたいのですが、
どうすればいいのかまったく分かりません。。。

サーバとは接続されているのですが。。。

Delphiは2005を使っています。
サーバにはOracle9iが入っています。

分かりづらい質問ですみません。どなたか教えていただけますか?


...  2005-02-15 02:33:52  No: 13232

http://otn.oracle.co.jp/forum/index.html


やまやま  2005-02-15 03:24:29  No: 13233

Oracleで画像を管理した方がいいってことですか???

ADOを使ってDelphiとOracleは接続してあるのですが。。。


りんご  2005-02-15 04:30:42  No: 13234

した方が良いとかじゃなくて
Oracleで管理されてるんじゃないんですか?


やまやま  2005-02-15 22:59:07  No: 13235

文字データはOracleで管理しています。
しかし、画像のデータはOracleでどうやって管理するのか?
また、それをどうやってDelphiで表示させることができるのか?
が分かりません。

画像は今はサーバではなく、自分のパソコンに保存してしまっています。
それをDelphiで表示させている状態です。
私以外の人から画像が見れないのでどうにか改善させたいのですが…


HOta  2005-02-15 23:07:57  No: 13236

Oracleのデーター型にBLOB型というものがあります。
この型でしたら、画像データーや特殊な型の保存ができます。
BLOBで検索してみてください。


やまやま  2005-02-23 23:54:39  No: 13237

どうにか調べて自分なりにやってみたのですが
下のソースでは、”無効なクラス型キャスト”という
例外が発生してしてしまいます。
どこか間違っているのでしょうか。。。

// BLOB 項目に保存する例
procedure TForm1.Button1Click(Sender: TObject);
var
  Ime1:  TBitmap;
  Strm: TBlobStream;
begin
  ADOQuery1.Active:=True;
  ADOTable1.Active:=True;
  Ime1:=Image1.Picture.Bitmap;

  ADOTable1.Edit;
  ADOTable1.Insert;

  { BLOB ストリームを作成 }
  Strm := TBlobStream.Create(TBlobField(ADOTable1.FieldByName('GAZOU')), bmWrite);
  try
    { BITMAP データをストリームに保存 }
    Ime1.SaveToStream(Strm);
    ADOTable1.Post;
  finally
    Strm.Free;
    Ime1.Free;
  end;
end;


HOta  2005-02-24 18:08:02  No: 13238

TBlobStreamはTADOBlobStreamに変えましょう。
ADOQuery1とADOTable1がごっちゃになっているようです。
どちらかにしましょう。
また、EditとInsertは同時に使用できません。
Delphi FAQより引用します。
//TBlobStreamは必ずTable.Editよりも後でCreateしなければならず、
//Table.Postの前までにFreeしなければならない。

これでどうでしょう。
var
  Ime1: TBitmap;
  ID  : Integer;
  Strm: TADOBlobStream;
begin
  ADOTable1.Active:=True;

  Ime1:=Image1.Picture.Bitmap;

  ADOTable1.Insert;

  { BLOB ストリームを作成 }
  Strm := TADOBlobStream.Create(TBlobField(ADOTable1.FieldByName('IMAGE')), bmWrite);
  try
    { BITMAP データをストリームに保存 }

    Ime1.SaveToStream(Strm);
    //Strmを使わない場合、
    //ADOTable1.FieldByName('IMAGE').Assign(Image1.Picture);
    Strm.Free;
    Ime1.Free;
    ADOTable1.Post;
  finally
    ADOTable1.Close;
  end;


やまやま  2005-02-24 18:40:27  No: 13239

細かいところまで丁寧に指導していただきありがとうございます。
例外も出なくなりました。
BLOBに保存することができたと思います。

ところが、今度は画像を読み込めません。。。
お手数をおかけして申し訳ありませんが、読み込みについてもアドバイス等がありましたら、ご指導お願いします。
下のソースで例外などは出ません。
Image2に表示させたいのですが、表示してくれません。。。

// BLOB 項目に保存する
procedure TForm1.Button1Click(Sender: TObject);
var
  Ima1:  TBitmap;
  ID:integer;
  Strm: TADOBlobStream;
begin
  ADOTable1.Active:=True;
  Ima1:=Image1.Picture.Bitmap;
  ADOTable1.Insert;

  { BLOB ストリームを作成 }
  Strm := TADOBlobStream.Create(TBlobField(ADOTable1.FieldByName('IMAGE')), bmWrite);
  try
    { BITMAPをストリームに保存 }
    Ima1.SaveToStream(Strm);
    Strm.Free;
    Ima1.Free;
    ADOTable1.Post;
  finally
    ADOTable1.Close;
  end;
end;

// BLOB 項目から読み込む
procedure TForm1.Button2Click(Sender: TObject);
var
  Ima2:  TBitmap;
  ID:integer;
  Strm: TADOBlobStream;
begin
   ADOTable1.Active:=True;
  { BLOB ストリームを作成 }
  Strm := TADOBlobStream.Create(TBlobField(ADOTable1.FieldByName('IMAGE')), bmRead);
  try
    { BITMAPをストリームから読み込み }
    Ima2.LoadFromStream(Strm);
    { Image コンポーネントに表示}
    Image2.Picture.Assign(Ima2);
  finally
    Strm.Free;
    Ima2.Free;
  end;
end;


i  2005-02-25 20:08:37  No: 13240

http://delphi.about.com/od/database/l/aa030601a.htm


やまやま  2005-03-01 19:54:02  No: 13241

iさんに教えていただいたのに申し訳ありませんが、
表示できない状況が改善できませんでした。

何度もお世話になって申し訳ありませんが、
どなたかBLOBデータの表示について再度教えていただけませんか。


kkk  2005-03-01 20:14:08  No: 13242

Ima2: TBitmap;
で宣言して
  Ima2.Free;
をしているのですが Ima2はどこで作成しているのでしょうか?
 TBitmap.Createが見当たらないのですが・・・


やまやま  2005-03-01 22:01:31  No: 13243

ご指摘ありがとうございます。

フォームにTImageコンポートネントを保存と表示用に2つ作ったので、なんとなくTBitmap.Createはいらないのかと思ったのですが。。。

付け足した方がよいのでしょうか?


なんとなく  2005-03-01 22:16:31  No: 13244

DB のアプリを作る前に、クラスの基本を勉強したほうが近道のような気がします。


やまやま  2005-03-01 23:47:44  No: 13245

Delphiの基礎があまりできていない状態で、
DBアプリを作るのはよくなかったかもしれません。
しかし、もう卒業まで時間が無く、
どうにかこのアプリを完成させたいのです。
みなさんにお世話になってばかりで申し訳ないのですが…


HOta  2005-03-02 00:31:23  No: 13246

イメージが保存されていないようです。
下記でJpegファイルを保存しています。
//保存
procedure TForm1.Button7Click(Sender: TObject);
var
  jpeg  : TJPEGImage;
  Ima1  : TBitmap;
  ID    : integer;
  Strm  : TADOBlobStream;
begin
  jpeg  := TJPEGImage.Create;
  Ima1:=  TBitmap.Create;
  ADOTable2.Open;
  jpeg.LoadFromFile(FNAME);
  Ima1.Assign(jpeg);
  ADOTable2.Edit;
  { BLOB ストリームを作成 }
  Strm := TADOBlobStream.Create(TBlobField(ADOTable2.FieldByName('IMGDT')), bmWrite);
  try
    // BITMAPをストリームに保存
    Ima1.SaveToStream(Strm);
    //  解放
    Freeandnil(Strm);
    Freeandnil(jpeg);
    Freeandnil(Ima1);
    ADOTable2.Post;
  finally
    ADOTable2.Close;
  end;
end;
//表示
procedure TForm1.Button6Click(Sender: TObject);
var
  Ima2:  TBitmap;
  ID:integer;
  Strm: TADOBlobStream;
begin
   Ima2:=  TBitmap.Create;
   ADOTable2.Open;
  { BLOB ストリームを作成 }
  Strm := TADOBlobStream.Create(TBlobField(ADOTable2.FieldByName('IMGDT')), bmRead);
  try
    { Image コンポーネントに表示}
    Image2.Picture.Bitmap.LoadFromStream(Strm);
  finally
    Freeandnil(Strm);
    Freeandnil(Ima2);
  end;
end;


やまやま  2005-03-02 03:21:40  No: 13247

いつも暖かいご指導ありがとうございます。

Delphi2005ではTJPEGImageは対応じゃないらしく、
コンパイルできませんでした。
自分なりに直してみたのですが……表示できませんでした。

procedure TForm1.Button1Click(Sender: TObject);
var
  Ima1: TBitmap;
  ID: integer;
  Strm: TADOBlobStream;
begin
  Ima1:= TBitmap.Create;
  ADOTable1.Open;
  Ima1.LoadFromFile('C:\sotuken\gazou.bmp');
  ADOTable1.Edit;

  { BLOB ストリームを作成 }
  Strm := TADOBlobStream.Create(TBlobField(ADOTable1.FieldByName('IMGDT')), bmWrite);
  try
    { BITMAPをストリームに保存 }
    Ima1.SaveToStream(Strm);
    Freeandnil(strm);
    Freeandnil(Ima1);
    ADOTable1.Post;
  finally
    ADOTable1.Close;
  end;
end;

// BLOB 項目から読み込む
procedure TForm1.Button2Click(Sender: TObject);
var
  Ima2:  TBitmap;
  ID:integer;
  Strm: TADOBlobStream;
begin
   Ima2:=TBitmap.Create;
   ADOTable1.Open;
  { BLOB ストリームを作成 }
  Strm := TADOBlobStream.Create(TBlobField(ADOTable1.FieldByName('IMGDT')), bmRead);
  try
    { BITMAPをストリームから読み込み }
    Image2.Picture.Bitmap.LoadFromStream(Strm);
    { Image コンポーネントに表示}
  finally
    Freeandnil(Strm);
    Freeandnil(Ima2);
  end;
end;


HOta  2005-03-02 20:12:57  No: 13248

JPEGを扱うときは、JPEGユニットをUsesに加えてください。


やまやま  2005-03-03 01:33:43  No: 13249

JPEGユニットを加えました。ご指摘ありがとうございました。

TADOTableのプロパティ設定がうまくいってないようで…
TADOCnnectionとTDataSourceとは接続できていて、
TADOConnectionとOracleの接続もできているのですが…
TADOTableのTableNameプロパティを設定しようとすると
”テーブルが存在しません”とエラーがでてしまいます。
原因が分からず困っています。

いつもお世話になってばかりいて申し訳ありません。


HOta  2005-03-03 02:17:34  No: 13250

Oracle <-->TADOCnnection<-->TADOTable<-->TDataSource
と接続します。
TADOTableのConnectionをADOCnnection1とかにします。
TDataSourceのDataSetにADOTableを入れます。
しかし、TImageに表示するだけなら、TDataSourceは不要です。
TDataControlに接続する場合にこれを介します。

でも、今まで登録したりしていたのでは無いですか?


マッコ  2005-03-03 06:43:22  No: 13251

すみません的外れかもしれません、データーデースなのでTDBImageじゃないですか?
2005じゃないですがD6ですとhttp://cc.borland.com/ccweb.exe/listing?id=17955のJPEGSupport now is "GraphicSuppport"を導入するとできますけど。
2005だと直っているか図りません。
的外れでしたらごめんなさい。


HOta  2005-03-03 22:41:33  No: 13252

最初の方の発言で、TImageに表示していましたので、
このあたりから、別スレッドにした方がよいのではと思いました。


やまやま  2005-03-03 23:01:55  No: 13253

みなさん発言ありがとうございます。

Delphiの問題ではなくて、Oracleの方の接続が問題だったようです。
無事TableNameプロパティーにテーブル名が入れられるようになりました。
的外れなことを質問してしまってすみませんでした。

HOtaさんに教えていただいた通りやってみたのですが、
エラーも例外も出ないのに、やはり表示ができません。

TableNameプロパティには自分で作成したテーブル名が自動ではでないので、自分で入力したのですが、本来は自動で出た選択可能なテーブルを入力するものなのでしょうか?


HOta  2005-03-04 00:49:43  No: 13254

前にも書きましてが、IMageがBLOBFieldに登録されていますでしょうか?
表示できないのは、BLOBFieldがNullかもしれません。
IsNullプロパティで調べてみましょう。

TableNameに自動で表示されるものを使うのが間違いないでしょう。そのためのIDEです。自動で出ないのは接続に問題があるようです。

私は、Oraclの様なRDBMSに対して、Tableコンポーネントを使うのは、
レスポンスが遅くなり、ほとんど使いません。


やまやま  2005-03-05 00:33:50  No: 13255

卒業の時期となり、研究はここまでで終わらせることになってしまいました。今までご親切に教えていただきありがとうございました。

表示はできないままになってしまいましたが、ADOについてなど
とても勉強になりました。

細かく質問に答えてくださったHOtaさん、本当にありがとうございました。

これからDelphiについてもっと勉強し、頑張っていきたいとおもいます。


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

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






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