サーバの中にある画像データをDelphiのTImageに表示させたいのですが、
どうすればいいのかまったく分かりません。。。
サーバとは接続されているのですが。。。
Delphiは2005を使っています。
サーバにはOracle9iが入っています。
分かりづらい質問ですみません。どなたか教えていただけますか?
http://otn.oracle.co.jp/forum/index.html
Oracleで画像を管理した方がいいってことですか???
ADOを使ってDelphiとOracleは接続してあるのですが。。。
した方が良いとかじゃなくて
Oracleで管理されてるんじゃないんですか?
文字データはOracleで管理しています。
しかし、画像のデータはOracleでどうやって管理するのか?
また、それをどうやってDelphiで表示させることができるのか?
が分かりません。
画像は今はサーバではなく、自分のパソコンに保存してしまっています。
それをDelphiで表示させている状態です。
私以外の人から画像が見れないのでどうにか改善させたいのですが…
Oracleのデーター型にBLOB型というものがあります。
この型でしたら、画像データーや特殊な型の保存ができます。
BLOBで検索してみてください。
どうにか調べて自分なりにやってみたのですが
下のソースでは、”無効なクラス型キャスト”という
例外が発生してしてしまいます。
どこか間違っているのでしょうか。。。
// 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;
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;
細かいところまで丁寧に指導していただきありがとうございます。
例外も出なくなりました。
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;
http://delphi.about.com/od/database/l/aa030601a.htm
iさんに教えていただいたのに申し訳ありませんが、
表示できない状況が改善できませんでした。
何度もお世話になって申し訳ありませんが、
どなたかBLOBデータの表示について再度教えていただけませんか。
Ima2: TBitmap;
で宣言して
Ima2.Free;
をしているのですが Ima2はどこで作成しているのでしょうか?
TBitmap.Createが見当たらないのですが・・・
ご指摘ありがとうございます。
フォームにTImageコンポートネントを保存と表示用に2つ作ったので、なんとなくTBitmap.Createはいらないのかと思ったのですが。。。
付け足した方がよいのでしょうか?
DB のアプリを作る前に、クラスの基本を勉強したほうが近道のような気がします。
Delphiの基礎があまりできていない状態で、
DBアプリを作るのはよくなかったかもしれません。
しかし、もう卒業まで時間が無く、
どうにかこのアプリを完成させたいのです。
みなさんにお世話になってばかりで申し訳ないのですが…
イメージが保存されていないようです。
下記で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;
いつも暖かいご指導ありがとうございます。
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;
JPEGを扱うときは、JPEGユニットをUsesに加えてください。
JPEGユニットを加えました。ご指摘ありがとうございました。
TADOTableのプロパティ設定がうまくいってないようで…
TADOCnnectionとTDataSourceとは接続できていて、
TADOConnectionとOracleの接続もできているのですが…
TADOTableのTableNameプロパティを設定しようとすると
”テーブルが存在しません”とエラーがでてしまいます。
原因が分からず困っています。
いつもお世話になってばかりいて申し訳ありません。
Oracle <-->TADOCnnection<-->TADOTable<-->TDataSource
と接続します。
TADOTableのConnectionをADOCnnection1とかにします。
TDataSourceのDataSetにADOTableを入れます。
しかし、TImageに表示するだけなら、TDataSourceは不要です。
TDataControlに接続する場合にこれを介します。
でも、今まで登録したりしていたのでは無いですか?
すみません的外れかもしれません、データーデースなのでTDBImageじゃないですか?
2005じゃないですがD6ですとhttp://cc.borland.com/ccweb.exe/listing?id=17955のJPEGSupport now is "GraphicSuppport"を導入するとできますけど。
2005だと直っているか図りません。
的外れでしたらごめんなさい。
最初の方の発言で、TImageに表示していましたので、
このあたりから、別スレッドにした方がよいのではと思いました。
みなさん発言ありがとうございます。
Delphiの問題ではなくて、Oracleの方の接続が問題だったようです。
無事TableNameプロパティーにテーブル名が入れられるようになりました。
的外れなことを質問してしまってすみませんでした。
HOtaさんに教えていただいた通りやってみたのですが、
エラーも例外も出ないのに、やはり表示ができません。
TableNameプロパティには自分で作成したテーブル名が自動ではでないので、自分で入力したのですが、本来は自動で出た選択可能なテーブルを入力するものなのでしょうか?
前にも書きましてが、IMageがBLOBFieldに登録されていますでしょうか?
表示できないのは、BLOBFieldがNullかもしれません。
IsNullプロパティで調べてみましょう。
TableNameに自動で表示されるものを使うのが間違いないでしょう。そのためのIDEです。自動で出ないのは接続に問題があるようです。
私は、Oraclの様なRDBMSに対して、Tableコンポーネントを使うのは、
レスポンスが遅くなり、ほとんど使いません。
卒業の時期となり、研究はここまでで終わらせることになってしまいました。今までご親切に教えていただきありがとうございました。
表示はできないままになってしまいましたが、ADOについてなど
とても勉強になりました。
細かく質問に答えてくださったHOtaさん、本当にありがとうございました。
これからDelphiについてもっと勉強し、頑張っていきたいとおもいます。
ツイート | ![]() |