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

TMemoryStream儲存半張圖的問題

尚未結案
kimogi
一般會員


發表:18
回覆:10
積分:5
註冊:2005-07-11

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-09-18 03:37:32 IP:221.169.xxx.xxx 未訂閱
我想要儲存一張影像的前100Bytes,但是儲存完用pspad開原圖跟儲存後的圖前100Bytes不一樣,不知是哪裡寫錯了,希望能幫我看一下,謝謝^^     
 
if (OpenPictureDialog1->Execute())
{
Graphics::TBitmap *MyBMP = new Graphics::TBitmap;
MyBMP->LoadFromFile(OpenPictureDialog1->FileName);
TMemoryStream *msSrc = new TMemoryStream();
msSrc->Write(MyBMP,100);
msSrc->SaveToFile("C:\\test.bmp");
delete msSrc;
delete MyBMP;
}    else return;    
malanlk
尊榮會員


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-09-18 11:33:25 IP:61.219.xxx.xxx 未訂閱
圖檔的最前面通常都是圖形的資訊 http://www.fastgraph.com/help/image_file_header_formats.html    當你將資料讀入 TBitmap 後, 檔頭資訊就被記錄在 TBitmap 自己的格式內, 你用 msSrc->Write 寫入的只是 TBitmap 資料格式的前 100 Bytes, 當然跟原檔案不同....
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-09-18 11:41:46 IP:59.115.xxx.xxx 未訂閱
kimogi 您好:    Bitmap 的內含資料不能像您那樣直接取用的,請參考下列作法:
if (OpenPictureDialog1->Execute()) {
    Graphics::TBitmap *MyBMP = new Graphics::TBitmap;
    MyBMP->LoadFromFile(OpenPictureDialog1->FileName);
    TMemoryStream *msSrc = new TMemoryStream();
//  msSrc->Write(MyBMP,100);  // 不可以這樣直接取用 Bitmap 內含資料
    MyBMP->SaveToStream(msSrc);  // 取用資料
    msSrc->Size = 100;  // 設定保留的大小
    msSrc->SaveToFile("C:\\test.bmp");
    delete msSrc;
    delete MyBMP;
} else return;
7 天天敲鍵盤 v 時時按滑鼠 8
kimogi
一般會員


發表:18
回覆:10
積分:5
註冊:2005-07-11

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-09-18 17:02:10 IP:221.169.xxx.xxx 未訂閱
謝謝兩位前輩的解答~但突然想到2個問題不太明瞭 [問題一] 因為我試了儲存前10Bytes對照了一下原圖前10Bytes,為什麼會多了4個Bytes,也就是我想測試一下存10Bytes就好,但他為什麼會存成14Bytes,試了不同的大小總是會出現多儲存的位元 [問題二] 我又試了存500Bytes,那扣掉前54Bytes剩下像素值有存進去但卻無法用小畫家開,請問是什麼原因呢,不是因該會開一出部分圖嘛? 謝謝解答^^
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-09-18 20:17:21 IP:61.217.xxx.xxx 未訂閱
kimogi 您好:
引言:[問題一] 因為我試了儲存前10Bytes對照了一下原圖前10Bytes,為什麼會多了4個Bytes,也就是我想測試一下存10Bytes就好,但他為什麼會存成14Bytes,試了不同的大小總是會出現多儲存的位元 [問題二] 我又試了存500Bytes,那扣掉前54Bytes剩下像素值有存進去但卻無法用小畫家開,請問是什麼原因呢,不是因該會開一出部分圖嘛?
1. 您是使用何種方式儲存資料的?我用我自己前一篇提供給您的方式儲存資料,並未發生您描述的狀況。 2. 表頭資料中有資料長度與長、寬....等資訊,您有配合您實際裁剪過的資料來做修正嗎?如果沒有的話,那個檔案就不是一個完整的 .BMP 檔案,當然無法正常開啟。 7 天天敲鍵盤 v 時時按滑鼠 8
kimogi
一般會員


發表:18
回覆:10
積分:5
註冊:2005-07-11

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-09-18 22:55:35 IP:221.169.xxx.xxx 未訂閱
問題二解決了,謝謝,但問題一我就是照你幫我修改過的程式碼儲存,如下  
if (OpenPictureDialog1->Execute()) 
{
    Graphics::TBitmap *MyBMP = new Graphics::TBitmap;
    MyBMP->LoadFromFile(OpenPictureDialog1->FileName);
    TMemoryStream *msSrc = new TMemoryStream();
    MyBMP->SaveToStream(msSrc);  
    msSrc->Size =10;  
    msSrc->SaveToFile("C:\\test.bmp");
    delete msSrc;
    delete MyBMP;
} 
else return;
我所選的圖是256*256 Lena的圖
第一張圖是用pspad看原圖的資料    
第二張圖是我存的10Bytes 明明存10Bytes卻會多出4個Bytes,而且為什麼除了BM兩字的資料是正確的,其他後面資料(例如:第4個bytes是00,但我存的是0d),謝謝,請幫我看一下^^
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-09-19 00:29:03 IP:61.230.xxx.xxx 未訂閱
kimogi 您好:    我選用和您一樣的圖檔,同時也使用 PsPad 來檢視由程式產生的 test.bmp 檔案內容如下:     如圖所示,一切都蠻正常的,並未出現您所描述的那種狀況,由您貼的圖來看,好像凡是有 00 的地方都會轉成 0D 0A,而且長度竟然還會超過?這也未免太令人匪夷所思了吧~ 7 天天敲鍵盤 v 時時按滑鼠 8
kimogi
一般會員


發表:18
回覆:10
積分:5
註冊:2005-07-11

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-09-19 12:43:58 IP:61.224.xxx.xxx 未訂閱
奇怪~那一樣的程式結果居然不一樣,不過還是謝謝解答^^
系統時間:2024-05-04 10:16:40
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!