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

stream Write空值?

答題得分者是:tokiama
heart75047
一般會員


發表:9
回覆:13
積分:19
註冊:2010-05-20

發送簡訊給我
#1 引用回覆 回覆 發表時間:2010-06-26 03:48:45 IP:111.252.xxx.xxx 訂閱
想把檔案前面加入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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2010-06-27 02:08:11 IP:113.31.xxx.xxx 訂閱
  1. 这样试试:
  2. fs.Position:=0;//加上这句
  3. ms.Write(fs,sizeof(fs));
  4. fs.Free;
  5. bit := Tbitmap.Create;
  6. ms.Position:=0;// 加上这句
  7. bit.LoadFromStream(ms);
------
今天真是,我喜欢今天...
heart75047
一般會員


發表:9
回覆:13
積分:19
註冊:2010-05-20

發送簡訊給我
#3 引用回覆 回覆 發表時間:2010-06-27 03:27:42 IP:111.252.xxx.xxx 訂閱
原來如此 我都忘記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 文 章===================
  1. 这样试试:
  2. fs.Position:=0;//加上这句
  3. ms.Write(fs,sizeof(fs));
  4. fs.Free;
  5. bit:=Tbitmap.Create;
  6. ms.Position:=0;//加上这句
  7. bit.LoadFromStream(ms);


之後 小弟有請教過老師

老師說 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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2010-06-28 20:54:09 IP:125.231.xxx.xxx 未訂閱
新手好奇問一下:

這東西可以用把檔頭放到 Stream 裡然後改數值後,在用 TFileStream.Create 轉存成 Bmp 圖檔嗎?
系統時間:2024-05-02 0:21:13
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!