線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1052
推到 Plurk!
推到 Facebook!

各位高手.....請問一個問題有關轉檔的問題..??

尚未結案
kevinhue
一般會員


發表:23
回覆:42
積分:13
註冊:2003-05-06

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-06-16 16:35:42 IP:218.160.xxx.xxx 未訂閱
請問一個問題: 我想利用Memorystream讀一個圖檔,然後轉換成.bin檔,請問要怎麼作ㄚ?
lcsboy
版主


發表:87
回覆:622
積分:394
註冊:2002-06-18

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-06-16 16:44:16 IP:211.23.xxx.xxx 未訂閱
可否說說你的.bin檔的格式是怎樣呢? Q1. 只是把圖檔的內容存下來的叫作.bin檔嗎? Q2. 還是這個.bin是去掉Header只留圖素的檔叫.bin呢? Q3. 或是圖素與調色盤分離的才是你要的.bin檔呢?    以上只要回答一個,相信很快有人可以解得出來 不過我在此先假設你是 class="code"> TMemoryStream *TMS=new TMemoryStream(); Graphics::TBitmap *MyBmp=new new Graphics::TBitmap; ..... // MyBmp->LoadFormFile("Show.BMP"); 不一定是讀bmp檔, 也許你的bitmap是從別的memory copy過來的 MyBmp->SaveToStream(TMS); // 這樣不就抓過來了嗎!!! ^__^ ..... // 接著就看你愛怎麼修改BMP的圖素 TMS->SaveToFile("GotBMP.bin"); // 搞定他 delete MyBmp; delete TMS; 發表人 - lcsboy 於 2003/06/16 17:05:19
kevinhue
一般會員


發表:23
回覆:42
積分:13
註冊:2003-05-06

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-06-16 17:19:48 IP:218.160.xxx.xxx 未訂閱
親愛的lcsboy: 我只是要中間圖素的部份,因為我想做一個用LED顯示的圖檔..... 可以請教一下要怎麼抓... Kevinhue敬上
lcsboy
版主


發表:87
回覆:622
積分:394
註冊:2002-06-18

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-06-17 09:47:18 IP:211.23.xxx.xxx 未訂閱
引言: 親愛的lcsboy: 我只是要中間圖素的部份,因為我想做一個用LED顯示的圖檔..... 可以請教一下要怎麼抓... Kevinhue敬上
中間圖素的部份? 還是表達的不是非常的清楚...嗯...不知道你的中間是從第幾個byte還是什麼顏色開始 所以請參考以下的寫法, 自行增修 < class="code"> TMemoryStream *SourceTMS=new TMemoryStream(); TMemoryStream *TargetTMS=new TMemoryStream(); Graphics::TBitmap *MyBmp=new new Graphics::TBitmap; BYTE *pSource, *pTarget; ..... // MyBmp->LoadFormFile("Show.BMP"); 不一定是讀bmp檔, 也許你的bitmap是從別的memory copy過來的 MyBmp->SaveToStream(SourceTMS); // 這樣不就抓過來了嗎!!! ^__^ pSource=(BYTE *)SourceTMS->Memory; // 先抓到圖檔在記憶體的起啟位置 pSource =99; // 假設你要處理的圖素從第100個byte開始 TargetTMS->Size=SourceTMS->Size-100; // 開始處理Buffer pTarget=(BYTE *)TargetTMS->Memory; // 取得Buffer的起啟位置 for (int i=0; i<(SourceTMS->Size-100); i ) *pTarget[i]=*pSource[pt ]; // 把Data從原來的圖檔抓到你的Buffer TargetTMS->SaveToFile("GotBMP.bin"); // 假設你要存到file, 如果要存到別的地方, 請舉一反三吧 delete MyBmp; delete SourceTMS; delete TargetTMS; 程式只是參考用, 一定會不合你意, 所以看懂後, 舉一反三吧
kevinhue
一般會員


發表:23
回覆:42
積分:13
註冊:2003-05-06

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-06-17 10:48:45 IP:218.160.xxx.xxx 未訂閱
親愛的lcsboy老大: 下面是我做的一些小修改....可是有個問題,就是為啥我執行之後,開啟的bmp檔 和我所存的bin檔的大小一樣,可是裡面卻沒有值(都是00h)可以幫我看一下好嗎?? TMemoryStream *SourceTMS=new TMemoryStream(); TMemoryStream *TargetTMS=new TMemoryStream(); Graphics::TBitmap *MyBmp=new Graphics::TBitmap; char *pSource, *pTarget; MyBmp->LoadFromFile(OpenDlg->FileName); MyBmp->SaveToStream(SourceTMS); pSource=(BYTE *)SourceTMS->Memory; pSource =53; //bmp檔的值是從第0036h開始放值 TargetTMS->Size=SourceTMS->Size-54; pTarget=(BYTE *)TargetTMS->Memory; for (int x=0; x<(SourceTMS->Size-54); x ) { buffer=buffer *(pTarget ); //buffer是公用的String } delete MyBmp; delete SourceTMS; delete TargetTMS; Kevinhue敬上
lcsboy
版主


發表:87
回覆:622
積分:394
註冊:2002-06-18

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-06-17 11:33:43 IP:211.23.xxx.xxx 未訂閱
引言: TargetTMS->Size=SourceTMS->Size-54; pTarget=(BYTE *)TargetTMS->Memory; for (int x=0; x<(SourceTMS->Size-54); x ) { buffer=buffer *(pTarget ); //buffer是公用的String }
這位同學.....不知道你有沒有注意原先我的demo中有這麼的一行: *pTarget[i]=*pSource[pt ]; 1. 很合理!!! 因為TargetTMS你沒給他任何的Data, 所以當你new一個TMemoryStream的起始值就是0x00, 於是乎, 你的code的寫法, 是把一堆0x00放到你的buffer, 所以你的buffer裡的data都是0x00 <--- 非常合理 2. 也許你codeing error, 應該是改成這樣吧? buffer=buffer *(pSource ); 如果程式改成這樣的話, 那就不需要TargetTMS了 3. 公用的String?是TStringList還是TMemoryStream? 還是AnsiString? 不管如何....還是可以達到你的要求...只是......學程式要會活用呀
kevinhue
一般會員


發表:23
回覆:42
積分:13
註冊:2003-05-06

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-06-17 11:35:14 IP:218.160.xxx.xxx 未訂閱
親愛的lcsboy老大: 浙是我改過之後的程式,是可以跑值出來了,而且"大部份"都對,現在唯一的問題就是,假如我讀54k的bmp檔,而我存的bin檔只有32k,怎麼會這樣ㄚ....可以幫我解決一下好嗎??? TMemoryStream *TargetTMS=new TMemoryStream(); Graphics::TBitmap *MyBmp=new Graphics::TBitmap; char *pTarget; MyBmp->LoadFromFile(OpenDlg->FileName); MyBmp->SaveToStream(TargetTMS); pTarget=(BYTE *)TargetTMS->Memory; TargetTMS->Size; for (int x=0; xSize; x ) { buffer=buffer *(pTarget ); Application->ProcessMessages(); } delete MyBmp; delete TargetTMS; Kevinhue敬上
lcsboy
版主


發表:87
回覆:622
積分:394
註冊:2002-06-18

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-06-17 12:42:16 IP:211.23.xxx.xxx 未訂閱
引言: 親愛的lcsboy老大: 浙是我改過之後的程式,是可以跑值出來了,而且"大部份"都對,現在唯一的問題就是,假如我讀54k的bmp檔,而我存的bin檔只有32k,怎麼會這樣ㄚ....可以幫我解決一下好嗎??? TMemoryStream *TargetTMS=new TMemoryStream(); Graphics::TBitmap *MyBmp=new Graphics::TBitmap; char *pTarget; MyBmp->LoadFromFile(OpenDlg->FileName); MyBmp->SaveToStream(TargetTMS); pTarget=(BYTE *)TargetTMS->Memory; TargetTMS->Size; for (int x=0; xSize; x ) { buffer=buffer *(pTarget ); Application->ProcessMessages(); } delete MyBmp; delete TargetTMS; Kevinhue敬上
前提:圖檔在File裡的格式與Bitmap在記憶體排列的格式是不一樣相同的 1. 在上面紅色的那一行下面, 試試: ShowMessage(TargetTMS->Size); // 或許你就會知道有什麼不同了 2. 詳細的圖檔在File 或是 圖檔在記憶體的格式, 請參閱相關的規格說明, 我不在此作說明.
kevinhue
一般會員


發表:23
回覆:42
積分:13
註冊:2003-05-06

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-06-17 15:01:04 IP:218.160.xxx.xxx 未訂閱
親愛的lcsboy大哥: 我已經找到我所遇到的問題了,謝謝你的指導......在此由忠感謝 Kevinhue敬上
lcsboy
版主


發表:87
回覆:622
積分:394
註冊:2002-06-18

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-06-17 16:11:37 IP:211.23.xxx.xxx 未訂閱
< > 不客氣.... 這個例子學會, 相信以後不管要轉什麼檔, 應該都難不倒你了吧!< >
系統時間:2024-05-06 16:10:51
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!