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

如何利用MemoryStream存取圖片?

尚未結案
han76816
一般會員


發表:10
回覆:9
積分:3
註冊:2010-03-08

發送簡訊給我
#1 引用回覆 回覆 發表時間:2012-01-30 17:45:30 IP:122.146.xxx.xxx 訂閱
是這樣的,我想作一個寫入圖片到資料庫的功能
其中filepath是圖片在本機的路徑,ms是memorystream
要驗證這個圖片是否是jpg檔,jpg檔才可以寫入
以下是我接手的程式碼

副檔名確定是jpg,
但一直讀不出JFIF(順便想問問JFIF是什麼意思= =?)
試了一整天都試不出來,想請各位高手協助解答,謝謝!

[code delphi]
procedure Insert_Photo(filepath: String; member_no: String; Image1: TImage);
var
ms: TMemoryStream;
cbuffer: array[0..4] of Char;
sJFIF: string;
iSEQNO: integer;
flist: TList;
JPEGImage: TJPEGImage;
begin
if UpperCase(Copy(filepath, Length(filepath)-2,3))<>'JPG' then
Abort;
try
ms := TMemoryStream.Create;
ms.LoadFromFile(filepath);
ms.Seek(6,soFromBeginning);
ms.Read(cbuffer, 4);
sJFIF := cbuffer;
finally
ms.Free;
end;
if sJFIF <> 'JFIF' then
begin
ShowMessage(不允許的圖檔格式,不可上傳!)
Abort;
end;
flist := Call_RPCWithFile('RemoteExecute1.php', filepath,
'update MEB_MEMBER SET MEB_MAIN_PIC=? where MEB_MAIN_MEMBER_NO=''' member_no '''');
if fList.Count = 0 then Abort;
//讀取圖片
JPEGImage := TJPEGImage.Create;
try
JPEGImage.LoadFromFile(filepath);
Image1.Picture.Graphic := JPEGImage;
finally
JPEGImage.Free;
end;
end;
[/code]




han76816
一般會員


發表:10
回覆:9
積分:3
註冊:2010-03-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2012-01-30 17:46:26 IP:122.146.xxx.xxx 訂閱
程式碼有點怪怪的,再請大家協助了

procedure Insert_Photo(filepath: String; member_no: String; Image1: TImage);
var
ms: TMemoryStream;
cbuffer: array[0..4] of Char;
sJFIF: string;
iSEQNO: integer;
flist: TList;
JPEGImage: TJPEGImage;
begin
if UpperCase(Copy(filepath, Length(filepath)-2,3))<>'JPG' then
Abort;
try
ms := TMemoryStream.Create;
ms.LoadFromFile(filepath);
ms.Seek(6,soFromBeginning);
ms.Read(cbuffer, 4);
sJFIF := cbuffer;
finally
ms.Free;
end;
if sJFIF <> 'JFIF' then
begin
ErpMessage(GetLanguageStr('HTL', 'Message_Error_HTL001004' ), mtError); //不允許的圖檔格式,不可上傳!
Abort;
end;
flist := Call_RPCWithFile('RemoteExecute1.php', filepath,
'update MEB_MEMBER SET MEB_MAIN_PIC=? where MEB_MAIN_MEMBER_NO=''' member_no '''');
if fList.Count = 0 then Abort;
JPEGImage := TJPEGImage.Create;
try
JPEGImage.LoadFromFile(filepath);
Image1.Picture.Graphic := JPEGImage;
finally
JPEGImage.Free;
end;
end;
GrandRURU
站務副站長


發表:240
回覆:1680
積分:1874
註冊:2005-06-21

發送簡訊給我
#3 引用回覆 回覆 發表時間:2012-01-31 01:38:49 IP:111.249.xxx.xxx 訂閱
 小改一部份
[code delphi]
const BufferSize = 50;
var Buffer:string;
// ......
ms.LoadFromFile(filepath);
SetLength(Buffer, BufferSize);
ms.Read(Buffer[1], BufferSize);
iSEQNO := Pos('JFIF' #$00, buffer);
if iSEQNO > 0 then // 允許的圖檔格式
// ......
[/code]

============================
JFIFJFIF網際網路上)的檔案。
參閱:Wiki
編輯記錄
GrandRURU 重新編輯於 2012-01-30 18:11:47, 註解 無‧
GrandRURU 重新編輯於 2012-01-30 18:12:38, 註解 無‧
GrandRURU 重新編輯於 2012-01-30 18:13:55, 註解 無‧
han76816
一般會員


發表:10
回覆:9
積分:3
註冊:2010-03-08

發送簡訊給我
#4 引用回覆 回覆 發表時間:2012-01-31 08:43:28 IP:122.146.xxx.xxx 訂閱
 有點奇怪...
他的iSEQNO=0,不知道是什麼原因...?
明明就是jpg檔...
han76816
一般會員


發表:10
回覆:9
積分:3
註冊:2010-03-08

發送簡訊給我
#5 引用回覆 回覆 發表時間:2012-01-31 08:47:22 IP:122.146.xxx.xxx 訂閱
我前面還有一個動作是,先把user開啟的圖片放入一個Image中,並另存新檔到photo.jpg
看photo.jpg是正常的,但就是不知道問題出在哪裡?
照您修改的地方讀出來的buffer前面是BM開頭...= =?


if OpenDialog1.Execute then
begin
jpg := TJPEGImage.Create;
try
jpg.LoadFromFile(OpenDialog1.FileName);
Image1.Picture.Bitmap.Assign(Jpg);
ImageResize(Image1.Picture, image1.Width, image1.Height);
Image1.Picture.SaveToFile('photo.jpg');
finally
jpg.Free;
end;
end;
GrandRURU
站務副站長


發表:240
回覆:1680
積分:1874
註冊:2005-06-21

發送簡訊給我
#6 引用回覆 回覆 發表時間:2012-01-31 08:55:37 IP:59.120.xxx.xxx 訂閱
那代表你存的結果是副檔名為jpg的bmp檔...
試一下這個吧
[code delphi]
if OpenDialog1.Execute then
begin
jpg := TJPEGImage.Create;
try
jpg.LoadFromFile(OpenDialog1.FileName);
Image1.Picture.Bitmap.Assign(Jpg);
ImageResize(Image1.Picture, image1.Width, image1.Height);
//Image1.Picture.SaveToFile('photo.jpg');
jpg.Assign(Image1.Picture.Bitmap);
jpg.SaveToFile('photo.jpg');
finally
jpg.Free;
end;
end;
[/code]

===================引 用 han76816 文 章===================
我前面還有一個動作是,先把user開啟的圖片放入一個Image中,並另存新檔到photo.jpg
看photo.jpg是正常的,但就是不知道問題出在哪裡?
照您修改的地方讀出來的buffer前面是BM開頭...= =?
...43...
編輯記錄
GrandRURU 重新編輯於 2012-01-30 17:56:27, 註解 無‧
GrandRURU 重新編輯於 2012-01-30 18:08:43, 註解 無‧
GrandRURU 重新編輯於 2012-01-30 18:09:17, 註解 無‧
系統時間:2024-03-29 12:54:25
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!