stream Write空值? |
答題得分者是:tokiama
|
heart75047
一般會員 發表:9 回覆:13 積分:19 註冊:2010-05-20 發送簡訊給我 |
想把檔案前面加入BMP檔頭 讓它變成圖檔
參考了很多Stream的文章 不過有看沒有懂 Tstream TMemoryStream TFilestream 為什麼要寫入緩衝? 為什麼不直接寫入就好? 以下是我的程式碼 不過寫出來的圖檔都是空的 不知道為什麼 請高手解答 試了三種方式 都是空值 [code delphi] procedure TForm1.Button1Click(Sender: TObject); var ms,fs:TMemoryStream; st:tfilestream; Bmf: TBitmapFileHeader; //BMP 檔頭資料 bit:tbitmap; s:string; begin if OpenDialog1.Execute then ms:=TMemoryStream.Create; ms.Write(Bmf, sizeof(Bmf)); //方式一 {assignfile(b, OpenDialog1.FileName); reset(b); while not EOF(b) do begin read(b, d); ms.Write(d,8); end; closefile(b);} //方式二 {st:=tfilestream.Create(OpenDialog1.FileName, fmOpenRead or fmShareDenyWrite); //fmOpenRead :以只讀方式打開指定文件 ms.Write(st,sizeof(st)); st.Free;} //方式三 fs:=TMemoryStream.Create; fs.LoadFromFile(OpenDialog1.FileName); ms.Write(fs,sizeof(fs)); fs.Free; bit := Tbitmap.Create; bit.LoadFromStream(ms); Image1.Picture.Assign(bit); s:=copy(ExtractFileName(OpenDialog1.FileName),1,length(ExtractFileName(OpenDialog1.FileName))-4); image1.Picture.SaveToFile(s '.bmp'); bit.Free; ms.Free; end; [/code] 新手發問 請多包含^^ |
wzwcn
一般會員 發表:0 回覆:5 積分:6 註冊:2010-06-27 發送簡訊給我 |
|
heart75047
一般會員 發表:9 回覆:13 積分:19 註冊:2010-05-20 發送簡訊給我 |
原來如此 我都忘記Position 要歸零
加上fs.Position:=0; 之後 還是0位元組 加上ms.Position:=0;之後 他顯示 project project1.exe raised exception class EInvalidGraphic with message 'Bitmap image is not valid'.process stopped. Use Step or Run to continue. 由於是手動打的 哪裡拼錯還請見諒 翻譯的結果 好像是 ms裡的東西不能裝進bit ===================引 用 wzwcn 文 章===================
之後 小弟有請教過老師 老師說 Bmf 就是TBitmapFileHeader 長度只有14 於是我又再寫了幾種方法 [code delphi] var Form1: TForm1; a,b,c:file of byte; d:byte; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var i:integer; begin randomize; if OpenDialog1.Execute then assignfile(a, OpenDialog1.FileName); reset(a); assignfile(b, '123.bmp'); reset(b); assignfile(c, inttostr(random(9999999)) '.bmp'); rewrite(c); for i:=1 to 54 do begin //先讀入正常bmp檔頭 read(a, d); //←←這行會錯誤 Write(c, d); end; while not EOF(a) do begin //在寫入原本要加入的檔案 read(a, d); Write(c, d); end; closefile(a); closefile(b); closefile(c); end; [/code] 那行的錯誤 是 read beyond end of file 讀取超出文件結尾 123.bmp 確定有 550 KB (563,974 位元組) 請問該如何排除錯誤 加了seek(b,0); 還是一樣 請各位大大賜教 感謝wzwcn 大大的提醒!!
編輯記錄
heart75047 重新編輯於 2010-06-27 03:29:48, 註解 無‧
heart75047 重新編輯於 2010-06-27 03:30:37, 註解 無‧ heart75047 重新編輯於 2010-06-27 03:33:08, 註解 用底色或是標紅字會出現原始碼 很亂 所以改掉了‧ |
tokiama
一般會員 發表:34 回覆:60 積分:23 註冊:2009-04-19 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |