全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1984
推到 Plurk!
推到 Facebook!

輸入mysql blob field 中, jpg 只得半副圖,但相似方法bitmap 没問題

答題得分者是:malanlk
iarthurtkt
一般會員


發表:2
回覆:6
積分:1
註冊:2005-09-29

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-09-29 01:22:08 IP:202.175.xxx.xxx 未訂閱
第一部份:  我參考了貴站一些會員的提示-輸入jpg 及bitmap  --------------------------------------------------- with dmdbConnPool.q2 do begin SQL.clear; SQL.Add('update employee set PHOTO=:iPic'); SQL.Add('where employeeid=:iEmp'); ParamByName('iEmp').AsString:=dbEmployeeID.text;    if Uppercase(ExtractFileExt(DBEdit14.Text))='.JPG' then begin  JPG.Assign(Image1.Picture.Graphic);  TJPEGImage(Picture.Graphic).SaveToStream(Stream); ParamByName('iPic').SetBlobData(Stream.Memory,Stream.Size); ExecSQL;    end else if Uppercase(ExtractFileExt(DBEdit14.Text))='.BMP' then begin JPG.Assign(Image1.Picture.Graphic); JPG.CompressionQuality:=70; JPG.SaveToStream(Stream); ParamByName('iPic').SetBlobData(Stream.Memory,Stream.Size); ExecSQL; Showmessage('BITMAP are saved success : '+DBEdit14.Text); end; end; end; // end of the If Course Except on E : Exception do begin ShowMessage(E.ClassName+' error raised, with message : '+E.Message); ShowMessage('NOT SUCCESS TO UPLOAD IMAGE'); Exit; end; // end of the Exception    end; finally JPG.Free; Stream.Free; end; // end of the finally try ( First Try ) ------------------------------------------------------------------------------ 輸入bitmap没有任何問題。但當輸入jpg時,小圖没有問題,但大圖就得一半或更小(所謂大圖只是 3xx K)    第二部份: 是    Part 2: 這是QUERY的 afterscroll 事件--以顯示圖    with dmdbConnPool.q3 do begin SQL.clear; SQL.Add('select * from con_sys_employee'); SQL.Add('where Employeeid=:Employeeid'); ParamByName('Employeeid').AsString := EmpAdmin.dbEmployeeID.text; ExecSQL; open;    if not FieldByName('photo').IsNull then try MS:=TStringStream.Create(''); TBlobField(FieldByName('PHOTO')).SaveToStream(MS); MS.Position:=0; jpeg:=TJPEGImage.Create; jpeg.LoadFromStream(MS); EmpAdmin.Image1.Picture.Bitmap.Assign(jpeg); finally jpeg.Free; ms.Free; end // end of the try block  else begin EmpAdmin.image1.Picture :=nil; end // end of the begin end    ----------------------------------------------------------------------- 我是初學者,希望有一個指引,我使用的是 MYSQL 4.0.26 Zeoslib 6.15。 Mysql Photo Field 是 BLOB .        Arthur Tou  < >< > Arthur Tou
------
Arthur Tou
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-09-29 08:18:45 IP:203.69.xxx.xxx 未訂閱
JPG.Assign(Image1.Picture.Graphic);  TJPEGImage(Picture.Graphic).SaveToStream(Stream); 這行怎麼通過 compiler? 你是有另外把圖存到 Picture 嗎? 發表人 - malanlk 於 2005/09/29 08:20:29
iarthurtkt
一般會員


發表:2
回覆:6
積分:1
註冊:2005-09-29

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-09-29 10:48:32 IP:202.175.xxx.xxx 未訂閱
JPG.Assign(Image1.Picture.Graphic);           TJPEGImage(Image1.Picture.Graphic).SaveToStream(Stream);              或          JPG.Assign(Image1.Picture.Graphic);           TJPEGImage(JPG).SaveToStream(Stream);          都順利compiler,但結果與以往一樣。比較大的jpg半得一半。    ----------------       JPG.Assign(Image1.Picture.Graphic);           TJPEGImage(Picture.Graphic).SaveToStream(Stream);    不能compiler喔    
------
Arthur Tou
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-09-29 11:04:09 IP:203.69.xxx.xxx 未訂閱
http://dev.mysql.com/doc/mysql/en/storage-requirements.html TINYBLOB, TINYTEXT L 1 bytes, where L < 2^8 BLOB, TEXT L 2 bytes, where L < 2^16 MEDIUMBLOB, MEDIUMTEXT L 3 bytes, where L < 2^24 LONGBLOB, LONGTEXT L 4 bytes, where L < 2^32 是不是小於 64k 的都正常?
iarthurtkt
一般會員


發表:2
回覆:6
積分:1
註冊:2005-09-29

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-09-29 12:05:13 IP:202.175.xxx.xxx 未訂閱
謝謝 你的回覆.    我原本使用了blob, 現在改用longblob 就成功了。我記錯了我以前在jsp也是使用longblob。    是有一個方法, 即sql command select blob field 的size嗎??
------
Arthur Tou
iarthurtkt
一般會員


發表:2
回覆:6
積分:1
註冊:2005-09-29

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-09-29 15:38:16 IP:202.175.xxx.xxx 未訂閱
還有一些問題, 根據以上的code, save as file 都無問題.  我click image作另存動作, 是否可以根據Timage 知到file type,  或 原本file name 在savePictureDialog1 作為預設file type 或 file name.    如果不能實現,應如何改進呢?    --------------------------------------------------------- var jpgstream:TJpegImage ; begin jpgstream:= TJPEGImage.Create; jpgstream.Assign(image1.picture); //jpgstream.CompressionQuality:=50;//压缩质量    jpgstream.Compress; if  savePictureDialog1.Execute then image1.Picture.SaveToFile (savePictureDialog1.FileName); jpgstream.free;    --------------------------------------------------------- < >< > Arthur Tou
------
Arthur Tou
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-09-29 18:43:00 IP:203.69.xxx.xxx 未訂閱
你可以利用 Image1 的 Tag 這個 Property    如果當初讀入是  JPG 就令 Image1.Tag := 1; BMP 就令 Image1.Tag := 0; .... xxx 就令 Image1.Tag := n;    存檔時再 利用 Image1.Tag 判斷要存成什麼檔案...
iarthurtkt
一般會員


發表:2
回覆:6
積分:1
註冊:2005-09-29

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-09-30 11:58:48 IP:202.175.xxx.xxx 未訂閱
如這樣寫,來判斷Image1,應該無問題喔.. if image1.Tag=0 then begin    SavePictureDialog1.DefaultExt := GraphicExtension(TJpegimage);    SavePictureDialog1.Filter := GraphicFilter(TJpegimage); end else if image1.Tag=1 then begin    SavePictureDialog1.DefaultExt := GraphicExtension(TBitmap);    SavePictureDialog1.Filter := GraphicFilter(TBitmap); end;    if savePictureDialog1.Execute then begin   image1.Picture.SaveToFile (savePictureDialog1.FileName); end; ---------------------------------------------------------- 但我有新問題出現,所SaveAs的圖應該全都轉為Jpg了,我想應該是我存入及由資料庫中存出Image中都有問題... ------------------------------------------------------ 我改了所存入的Bitmap部份如下: Stream:=TMemoryStream.Create; ...    BMP:=TBitmap.Create;    BMP.Assign(Image1.Picture.Graphic);    BMP.SaveToStream(Stream); ParamByName('iPic').SetBlobData(Stream.Memory,Stream.Size);    ExecSQL;    這部份能夠COMPILER. ---------------------------------------------------------------------------------------------------------- 但到load Image不知如何判斷所Load的Stream是Bitmap,還是Jpg.    應該如何判斷,能否判斷所load的Stream是什麼呢?    Stream := TMemoryStream.Create; TBlobField(FieldByName('PHOTO')).SaveToStream(Stream); Stream.Read()    如果是Header之類的東東,好像我在上存時没有入,應該怎麼辦呢? < >< > Arthur Tou
------
Arthur Tou
iarthurtkt
一般會員


發表:2
回覆:6
積分:1
註冊:2005-09-29

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-09-30 12:16:19 IP:202.175.xxx.xxx 未訂閱
如你所說的方法,我如下寫,來判斷Image1,應該無問題喔..先謝謝你的解答    if image1.Tag=0 then begin    SavePictureDialog1.DefaultExt := GraphicExtension(TJpegimage);    SavePictureDialog1.Filter := GraphicFilter(TJpegimage); end else if image1.Tag=1 then begin    SavePictureDialog1.DefaultExt := GraphicExtension(TBitmap);    SavePictureDialog1.Filter := GraphicFilter(TBitmap); end;    if savePictureDialog1.Execute then begin   image1.Picture.SaveToFile (savePictureDialog1.FileName); end;    ----------------------------------------------------------    但我有新問題出現,所SaveAs的圖應該全都轉為Jpg了,我想應該是我存入及由資料庫中存出Image中都有問題... ------------------------------------------------------ 我改了所存入的Bitmap部份如下: Stream:=TMemoryStream.Create; ...    BMP:=TBitmap.Create;    BMP.Assign(Image1.Picture.Graphic);    BMP.SaveToStream(Stream); ParamByName('iPic').SetBlobData(Stream.Memory,Stream.Size);    ExecSQL;    //通過了Compile,暫未知有無問題    ------------------------------------------------------- 在load image 到 Timage中,必須因應是bitmap還是jpg來存到Timage,這部份我有點困難, 就是不無所load出現的stream是什麼東東。能否直接讀出stream是什麼IMAGE類型嗎?    Stream := TMemoryStream.Create; TBlobField(FieldByName('PHOTO')).SaveToStream(Stream); Stream.Read(--------------------------------Header,--------------SizeOf(TGraphicHeader));    ? 問題我又没有在上存圖時存入什麼header之類的參數,有没有更方便的方法做到能直接判斷bitmap,還是jpg呢? 因為我不知如何表達在上存時存入header之類的東東(好像網上没有使用query+sql 中存入header的例子喔)。    ----------------------------------------------------------------------------------------------------------------- < >< > Arthur Tou
------
Arthur Tou
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-09-30 13:04:49 IP:203.69.xxx.xxx 未訂閱
http://www.fastgraph.com/help/image_file_header_formats.html http://delphi.ktop.com.tw/topic.php?topic_id=77622     上圖是我將 存入 Stream 的記憶體及原本 File 的二進位內容, 這張圖告訴我們 TImage.SaveToStream 事實上會將檔頭資訊也存入Stream內, TJPEGImage.SaveToStream 也會將檔頭部份存入, Load Stream 後, 可以由檔頭來判斷圖形類別.... 當然在資料庫內加一個欄位 ImageType 也是可以....
iarthurtkt
一般會員


發表:2
回覆:6
積分:1
註冊:2005-09-29

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-10-04 11:39:06 IP:202.175.xxx.xxx 未訂閱
請問能不能查找己存入資料庫中的blob file的內容。 如何做呢? 使用winhex可以嗎? 例如:我的資料是mysql,應該怎查某一特定欄位內容? (我本人曾使winhex查普通文件的經驗) Arthur Tou
------
Arthur Tou
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-10-04 12:03:49 IP:203.69.xxx.xxx 未訂閱
收一下 簡訊
系統時間:2024-06-16 11:10:21
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!