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

Bitmap->LoadFromStream

答題得分者是:taishyang
chi30
一般會員


發表:5
回覆:17
積分:4
註冊:2005-01-20

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-03-29 11:31:32 IP:61.228.xxx.xxx 未訂閱
各位先進好, 小弟要用Image1->Picture->Bitmap來秀一個處理過的unsigned char* 的 image buffer. 以下是我用的方法. dbuf 是 unsigned char 的buf 其大小為height*width TMemoryStream *tmpStr = new TMemoryStream(); tmpStr->Read(dbuf,height*width); Graphics::TBitmap *pBitmap = new Graphics::TBitmap(); tmpStr->Position = 0; pBitmap->LoadFromStream((TStream*)tmpStr); Image1->Canvas->Draw(0,0,pBitmap); 我執行上面的程式後, Image1 會變成整張白色的. 但是完全不會秀出圖檔. 請問各位先進 上面的程式碼到底那裡錯了??? YoHo~~~
------
YoHo~~~
chunglin
一般會員


發表:8
回覆:8
積分:3
註冊:2005-02-03

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-03-29 12:28:47 IP:61.221.xxx.xxx 未訂閱
試著在 pBitmap->LoadFromStream((TStream*)tmpStr); 前加上 pBitmap->Height = height; pBitmap->Width = width; 看看這樣可不可以,之前碰過沒指定圖檔大小會不正常的情況過 創作需要無限的想像。
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-03-29 12:34:56 IP:210.68.xxx.xxx 未訂閱
tmpStr->Read(dbuf,height*width); //這是將tmpStr的內容放入dbuf中
而
tmpStr->Write(dbuf,height*width); //這是將dbuf的內容寫入tmpStr中
所以您的需求似乎是要用Write
順心 <>~我也是在學習的階段,回答的不好請您多多見諒與指教~
chi30
一般會員


發表:5
回覆:17
積分:4
註冊:2005-01-20

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-03-29 13:12:10 IP:61.228.xxx.xxx 未訂閱
謝謝兩位的回答. 我把tmpStr->Read 改成 tmpStr->Write. 也設定了pBitmap的大小 . 不過顯示出來的檔還是一片空白. 不知問題在那? ps: 其實我是可以用TBitmap::Scanline的方式一條一條寫到bitmap裡. 不過想用用看TMemoryStream 的方式看看, 因為這TMemoryStream一次讀到Bitmap裡, 我覺得應該會比較快. 所以想試試. 發表人 - chi30 於 2005/03/29 13:26:38
------
YoHo~~~
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-03-29 14:00:05 IP:210.68.xxx.xxx 未訂閱
您好: 我用下面的程式碼對一張24Bbit影像做灰階化是沒有問題的
    TMemoryStream *msSrc = new TMemoryStream();
    msSrc->LoadFromFile("test.bmp");        const int BmpHeadLen = 54;
    Byte BmpHead[BmpHeadLen]={0};
    Byte *BmpData = new Byte[msSrc->Size-BmpHeadLen];
    msSrc->Read(BmpHead, BmpHeadLen);
    msSrc->Position = BmpHeadLen;
    msSrc->Read(BmpData, msSrc->Size-BmpHeadLen);
    //msSrc->SaveToFile("Src.dat");
    for (int i=0 ;iSize-BmpHeadLen; i =3)
    {
       int B = BmpData[i];
       int G = BmpData[i 1];
       int R = BmpData[i 2];
       int Gray = (R G B)/3;
       BmpData[i] = Gray;
       BmpData[i 1] = Gray;
       BmpData[i 2] = Gray;
    }        TMemoryStream *msDest = new TMemoryStream();
    msDest->Write(BmpHead, BmpHeadLen);
    msDest->Position = BmpHeadLen;
    msDest->Write(BmpData, msSrc->Size-BmpHeadLen);
    //msDest->SaveToFile("Dest.dat");
    msDest->Position = 0;        Image1->Picture->Bitmap->LoadFromStream(msDest);
    
    delete msDest;
    delete msSrc;
    delete [] BmpData;
順心 <>~我也是在學習的階段,回答的不好請您多多見諒與指教~
chi30
一般會員


發表:5
回覆:17
積分:4
註冊:2005-01-20

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-03-29 14:42:38 IP:61.228.xxx.xxx 未訂閱
謝謝啦.. 問題在於我沒有在TStream 前加bmp的檔頭.... 
------
YoHo~~~
系統時間:2024-05-17 15:32:11
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!