輸入mysql blob field 中, jpg 只得半副圖,但相似方法bitmap 没問題 |
答題得分者是:malanlk
|
iarthurtkt
一般會員 發表:2 回覆:6 積分:1 註冊:2005-09-29 發送簡訊給我 |
第一部份:
我參考了貴站一些會員的提示-輸入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 發送簡訊給我 |
|
iarthurtkt
一般會員 發表:2 回覆:6 積分:1 註冊:2005-09-29 發送簡訊給我 |
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 發送簡訊給我 |
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 發送簡訊給我 |
|
iarthurtkt
一般會員 發表:2 回覆:6 積分:1 註冊:2005-09-29 發送簡訊給我 |
還有一些問題, 根據以上的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 發送簡訊給我 |
|
iarthurtkt
一般會員 發表:2 回覆:6 積分:1 註冊:2005-09-29 發送簡訊給我 |
如這樣寫,來判斷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 發送簡訊給我 |
如你所說的方法,我如下寫,來判斷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 發送簡訊給我 |
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 發送簡訊給我 |
|
malanlk
尊榮會員 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |