線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2929
推到 Plurk!
推到 Facebook!

jpeg不能加入dbimage中

尚未結案
sun_chih_yen
一般會員


發表:40
回覆:33
積分:13
註冊:2003-10-03

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-10-03 09:05:00 IP:211.74.xxx.xxx 未訂閱
請問一下我要在資料庫中的dbimage中插入jpg圖片可是可以正常進入可是我選擇jpeg檔後就會出現錯誤訊號請問我那裡出問題了????研究好久感激不盡~~以下是我的程式碼不知那裡錯了 uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, DBCtrls, Mask, DB, ADODB, Grids, DBGrids, ComCtrls, Buttons, ToolWin, ImgList, ExtDlgs,jpeg, var jpg:TJpegImage; begin if openpicturedialog1.execute then begin adoquery1.Edit; adoquery1dsdesigner14.loadfromfile(openpicturedialog1.filename); end
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-10-03 09:13:03 IP:63.84.xxx.xxx 未訂閱
您好!    DBImage不支援顯示Jpeg的圖片檔, 所以要做一些變通的方法才可以顯示出來, 請參考justmade版主大人的大著. http://delphi.ktop.com.tw/topic.php?TOPIC_ID=30976 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=19482 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=27715    另外, 您也可以選擇其它變通的方法, 比如說在對應Image的欄位中存入該圖片檔的連接路徑, 而后再配合TImage元件來顯示(TImage元件支援Jpeg圖片檔的顯示), 如下連接: http://delphi.ktop.com.tw/topic.php?TOPIC_ID=37249    參考看看!    ===================== 努力,相信會獲得美麗! 忻晟
------
忻晟
sun_chih_yen
一般會員


發表:40
回覆:33
積分:13
註冊:2003-10-03

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-10-03 09:35:52 IP:211.74.xxx.xxx 未訂閱
我重新改了還是有錯誤 覺的好像有點亂的說~ 還有這一句表示什麼意思呢?? TBlobField(AdoQuery1.FieldByName('照片') as TBlobField).SaveToStream 困擾許久目前以下是我的程式碼 procedure TForm1.DBImage1DblClick(Sender: TObject); var jpg:TJpegImage; Stream:TMemoryStream; begin Stream:=TMemoryStream.Create ; jpg:= TJPEGImage.Create; jpg.LoadFromStream(Stream); DBImage1.Picture.Assign(jpg); if openpicturedialog1.execute then begin adoquery1.Edit; adoquery1dsdesigner14.loadfromfile(openpicturedialog1.filename); TBlobField(AdoQuery1.FieldByName('照片') as TBlobField).SaveToStream(Stream); Stream.Free; jpg.free; end
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-10-03 10:23:51 IP:63.84.xxx.xxx 未訂閱
您好!    這一句的意思是將BlobField欄位形態的值存入Stream中, 以便之后的讀取工作. 不知您是否有參考到Danny版主的TahDBJpeg元件, 試試看, 應該會方便一些.    參考看看!    ===================== 努力,相信會獲得美麗! 忻晟
------
忻晟
sun_chih_yen
一般會員


發表:40
回覆:33
積分:13
註冊:2003-10-03

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-10-12 01:42:59 IP:211.74.xxx.xxx 未訂閱
我看了好多類似的文章可是還是不行 我的程式碼為以下 目前可以存取bmp檔可是jpg檔都會出現錯誤不知我那裡錯了??? procedure TForm1.DBImage1DblClick(Sender: TObject); var jpg:TJpegImage; Stream:TMemoryStream; begin Stream:=TMemoryStream.Create ; jpg:= TJPEGImage.Create; jpg.LoadFromStream(Stream); DBImage1.Picture.Assign(jpg); if openpicturedialog1.execute then begin adoquery1.Edit; adoquery1dsdesigner14.loadfromfile(openpicturedialog1.filename); TBlobField(AdoQuery1.FieldByName('照片') as TBlobField).SaveToStream(Stream); Stream.Free; jpg.free; end
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-10-12 03:17:14 IP:63.84.xxx.xxx 未訂閱
您好!    DBImage資料感知元件可以存取顯示bmp格式的圖片, 但不支援Jpeg格式的圖片, 相信您在參考各位前輩的大作時已經有理解這個問題.    建議您使用存取檔案路徑的方式并配合Image元件來做有關圖片處理的要求, 小弟認為這種作法的好處多多. http://delphi.ktop.com.tw/topic.php?TOPIC_ID=37249    參考看看!    ===================== 努力,相信會獲得美麗! 忻晟
------
忻晟
sun_chih_yen
一般會員


發表:40
回覆:33
積分:13
註冊:2003-10-03

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-10-12 11:56:02 IP:203.70.xxx.xxx 未訂閱
我有參考您的文件可是為什麼我的程式碼到了adoquery1.Close; adoquery1.Clear; adoquery1.SQL.Add('Select * From Image1 Where 照片=''' DBEdit1.Text ''''); 這幾段都會出現錯誤訊息???? begin if OpenPictureDialog1.Execute then DBEdit1.Text := OpenPictureDialog1.FileName; Image1.Picture.LoadFromFile(DBEdit1.Text); end; //以DBEdit來記錄圖檔的路徑名稱﹐再以Image來顯示﹒ //在查詢是否重覆的時候﹐就可利用DBEdit1的Text來判斷﹐如下﹕ begin adoquery1.Close; adoquery1.Clear; adoquery1.SQL.Add('Select * From Image1 Where 照片=''' DBEdit1.Text ''''); QImage.Open; if adoquery1.RecordCount>0 then Application.MessageBox('已有相同的圖片','錯誤視窗',MB_OK);
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-10-12 12:48:19 IP:63.84.xxx.xxx 未訂閱
您好!    請問錯誤信息是什么? 另外, 小弟做了一個簡單的範例, Access資料庫形態, 資料表中只有編號和圖片兩個欄位, DBEdit1感知元件對應圖片欄位, 程式碼如下, 經測試可正常Run.
procedure TForm1.ADOQuery1AfterEdit(DataSet: TDataSet);
begin
  if OpenPictureDialog1.Execute then
    begin
      DBEdit1.Text := OpenPictureDialog1.FileName;
      Image1.Picture.LoadFromFile(DBEdit1.Text);
    end
  else
    Exit;
end;
存入資料表之后...(略Post步驟)
procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField);
begin
  if FileExists(DBEdit1.Text) then
    Image1.Picture.LoadFromFile(DBEdit1.Text)
  else
    Image1.Picture := nil;
end;
供您參考看看! ===================== 努力,相信會獲得美麗! 忻晟 發表人 - cashxin2002 於 2003/10/12 12:54:29
------
忻晟
wuabc
初階會員


發表:6
回覆:60
積分:33
註冊:2002-10-28

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-10-12 15:08:32 IP:203.204.xxx.xxx 未訂閱
這一篇應是你要的
 
{
Article: Pictures inside a database    http://delphi.about.com/library/weekly/aa030601a.htm    Chapter three of the free
Delphi Database Course for beginners.
Displaying images (BMP, JPEG, ...) inside
an Access database with ADO and Delphi.    For the .zip file of this project click here.    }    unit Unit1;    interface    uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Buttons, ExtCtrls, StdCtrls, Db, ADODB, Grids, DBCtrls, DBGrids;    type
  TForm1 = class(TForm)
    ADOTable1: TADOTable;
    DataSource1: TDataSource;
    btnShowImage: TButton;
    ADOImage: TImage;
    ADOTable1Name: TWideStringField;
    ADOTable1Description: TWideStringField;
    ADOTable1Author: TWideStringField;
    ADOTable1Type: TWideStringField;
    ADOTable1Size: TFloatField;
    ADOTable1Cost: TBCDField;
    ADOTable1DateUpl: TDateTimeField;
    ADOTable1Picture: TBlobField;
    DBGrid1: TDBGrid;
    procedure btnShowImageClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
  public
     { Public declarations }
  end;    const
 JPEGstarts = 'FFD8';
 BMPstarts = '424D';  //BM    var
  Form1: TForm1;    implementation
uses jpeg;
 {$R *.DFM}    function JpegStartsInBlob (PicField:TBlobField):integer;
var
 bS     : TADOBlobStream;
 buffer : Word;
 hx     : string;
begin
 Result := -1;
 bS := TADOBlobStream.Create(PicField, bmRead);
 try
  while (Result = -1) and (bS.Position   1 < bS.Size) do
  begin
   bS.ReadBuffer(buffer, 1);
   hx:=IntToHex(buffer, 2);
   if hx = 'FF' then begin
     bS.ReadBuffer(buffer, 1);
     hx:=IntToHex(buffer, 2);
     if hx = 'D8' then Result := bS.Position - 2
     else if hx = 'FF' then bS.Position := bS.Position-1;
   end; //if
  end; //while
 finally
  bS.Free
 end;  //try
end;    procedure TForm1.btnShowImageClick(Sender: TObject);
var
  bS  : TADOBlobStream;
  Pic : TJpegImage;
begin
  bS := TADOBlobStream.Create(AdoTable1Picture, bmRead);
  try
    bS.Seek(JpegStartsInBlob(AdoTable1Picture), soFromBeginning);
    Pic:=TJpegImage.Create;
    try
     Pic.LoadFromStream(bS);
     ADOImage.Picture.Graphic:=Pic;
    finally
     Pic.Free;
    end;
  finally
    bS.Free
  end;
end;    procedure TForm1.FormCreate(Sender: TObject);
var sDBPath, sCons: string;
begin
//change the sDBPath to point to your database!
sDBPath := 'c:\!Gajba\About\aboutdelphi.mdb';
sCons := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source='   sDBPath   ';Persist Security Info=False';    ADOTable1.ConnectionString := sCons;
ADOTable1.TableName := 'Applications';
DataSource1.DataSet := ADOTable1;
DBGrid1.DataSource := DataSource1;    ADOTable1.Active:=True;
end;    procedure TForm1.FormDestroy(Sender: TObject);
begin
  ADOTable1.Active:=False;
end;    //Extra!! save JPG to table
procedure SaveJpegToTable(Table: TADOTable; PicField:TBlobField; sPicPath: string);
{
Usage:      SPicFileName := 'C:\!gajba\cdcovers\cdcover1.jpg';
  SaveJpegToTable(ADOTable1, ADOTable1Picture, SPicFileName);
}
var
  fS  : TFileStream;
begin
  fs:=TFileStream.Create(sPicPath, fmOpenRead);
  try
   Table.Edit;
   PicField.LoadFromStream(fs);
   Table.Post;
  finally
   fs.Free;
  end;
end;    end.     
sun_chih_yen
一般會員


發表:40
回覆:33
積分:13
註冊:2003-10-03

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-10-12 16:24:09 IP:203.70.xxx.xxx 未訂閱
您好cashxin2002 我有按照你的教法去做目前是可以正常去存取bmp檔的圖那麼jpg圖檔的圖只能取出和放入DBIMAGE元件內可是每當我按存檔時DBIMAGE元件內的JPG馬上就不見了可是BMP檔卻可以正確存取 procedure TForm1.ADOQuery1AfterEdit(DataSet: TDataSet); begin if OpenPictureDialog1.Execute then begin DBEdit1.Text := OpenPictureDialog1.FileName; Image1.Picture.LoadFromFile(DBEdit1.Text); end else Exit; end; 存入資料表之后...(略Post步驟) procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField); begin if FileExists(DBEdit1.Text) then Image1.Picture.LoadFromFile(DBEdit1.Text) else Image1.Picture := nil; end;
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-10-12 17:58:37 IP:63.84.xxx.xxx 未訂閱
您好﹗    如果您是使用存取檔案路徑的方法﹐將圖檔路徑存入資料表中對應的欄位(字串形態)﹐那就應該可以正常存取和顯示﹐可能您忽略了一個地方﹐就是小弟是用Image元件﹐而不是DBImage元件﹐不能將Jpeg格式圖檔通過DBImage資料感知元件存入資料表﹐這就是之前所說的問題所在﹐所以改用Image元件﹐應該就可以解決您的問題了﹒    有一個地方需要注意﹐就是圖檔所在的路徑必須正确﹐且存入后不要將圖檔移至其它的位置﹐否則將會找不到圖檔﹒    參考看看﹗    ===================== 努力,相信會獲得美麗! 忻晟
------
忻晟
sun_chih_yen
一般會員


發表:40
回覆:33
積分:13
註冊:2003-10-03

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-10-12 19:50:07 IP:203.70.xxx.xxx 未訂閱
感謝cashxin2002可是我還有一個問題我是使用access做一個通訊錄那麼我使用您的方法去抓jpg檔目前是可以了可是只要我按儲存那麼這個圖示也會從image中消失而路徑記錄到dbedit1.txt那麼我可以讓image元件的圖示不要消失而且每一頁的圖示都不同嗎
sun_chih_yen
一般會員


發表:40
回覆:33
積分:13
註冊:2003-10-03

發送簡訊給我
#13 引用回覆 回覆 發表時間:2003-10-12 21:04:57 IP:203.70.xxx.xxx 未訂閱
我終於試成功了感謝各位大力幫忙!!!
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#14 引用回覆 回覆 發表時間:2003-10-12 22:00:35 IP:63.84.xxx.xxx 未訂閱
引言: 感謝cashxin2002可是我還有一個問題我是使用access做一個通訊錄那麼我使用您的方法去抓jpg檔目前是可以了可是只要我按儲存那麼這個圖示也會從image中消失而路徑記錄到dbedit1.txt那麼我可以讓image元件的圖示不要消失而且每一頁的圖示都不同嗎
您好! 有關這個問題, 之前有寫到這樣一段程式碼:
procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField);
begin
  if FileExists(DBEdit1.Text) then
    Image1.Picture.LoadFromFile(DBEdit1.Text)
  else
    Image1.Picture := nil;
end;
以上的程式碼是寫在DataSource元件的OnDataChange事件中, 這個事件會根据目前資料指針的任何移動狀態而使用資料感知元件反應出對應的欄位內容, 您可以將DBEdit1元件的Visible屬性值設為False, 亦在Form中看不到這個元件, 然后再利用DBEdit1元件的Text值配合Image1元件來顯示圖檔. 參考看看! ===================== 努力,相信會獲得美麗! 忻晟
------
忻晟
系統時間:2024-04-29 8:14:11
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!