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

請問如何將binary轉image?

尚未結案
blacknew
一般會員


發表:2
回覆:5
積分:1
註冊:2002-12-30

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-07-01 15:42:53 IP:211.23.xxx.xxx 未訂閱
請教各位前輩 我有一個binary表示的image的檔案 內容大約是: 00 00 00 00 00 00 00 00 00 00 00 00 00 02 00 04 00 02 00 02 00 08 00 21 ....................... ............................................... 其中: 1 pixel 用 2 byte表示 這個image是128 x 128 pixel 請問我要如何將這個檔案轉成正常可秀出的image..?? 謝謝!!!
taishyang
站務副站長


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-07-01 16:07:04 IP:140.135.xxx.xxx 未訂閱
blacknew您好:   下面是我讀取RAW Data影像的萬用程式,您參考看看(依您的需要作修改)
 
   TMemoryStream* ima = new TMemoryStream();
   ima->LoadFromFile(檔案名稱);
   BYTE bBuf=0;
   for (int i=0;iSize;i  )
    {
     ima->Position=i;
     bBuf=i;
     ima->Read(&bBuf,1);
     pixel[i]=bBuf;
    }
   delete ima;
   }
  for (y=0;y<128;y  )
   {
    for (x=0;x<128;x  )
     {
      color=((256*pixel[count] pixel[count 1]))/16;
      SetPixel(Image1->Canvas->Handle, x,y,TColor(RGB(color,color,color)));
      count =2;
     }
   }
順心 <>~我也是在學習的階段,所以請您多多見諒與指教~ 發表人 -
blacknew
一般會員


發表:2
回覆:5
積分:1
註冊:2002-12-30

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-07-01 17:29:40 IP:211.23.xxx.xxx 未訂閱
感謝taishyang 的迅速解答!! 解決了部分的問題 但影像秀出來是這樣 不是很清楚 請問是否我遺漏了什麼..?? 正常的清晰度應該是這樣:
taishyang
站務副站長


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-07-01 21:05:29 IP:140.135.xxx.xxx 未訂閱
blacknew您好:  我想會造成這樣的現象,主要是因為下面的程式所引起    
 
  for (y=0;y<128;y  )
   {
    for (x=0;x<128;x  )
     {
      color=((256*pixel[count] pixel[count 1]))/16;
      SetPixel(Image1->Canvas->Handle, x,y,TColor(RGB(color,color,color)));
      count =2;
     }
   }
   
您必須將您的資料正規化至0~255才能將像素打在Image上(顏色分佈才會正確)... 順心 <>~我也是在學習的階段,所以請您多多見諒與指教~ 發表人 -
blacknew
一般會員


發表:2
回覆:5
積分:1
註冊:2002-12-30

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-07-02 09:51:19 IP:211.23.xxx.xxx 未訂閱
謝謝taishyang~ 請問將資料正規化至0~255 是指若大於255的值調整至255以下? 例如: 257 調整為 1 ...??
taishyang
站務副站長


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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-07-02 10:31:06 IP:140.135.xxx.xxx 未訂閱
blacknew您好:    因為每個像素以8bits表示,所以範圍是0~255,而您的資料是2Bytes 範圍是0~65535所以您必須把範圍映射到0~255(正規化)    順心 <>~我也是在學習的階段,所以請您多多見諒與指教~
MilesWamg
一般會員


發表:18
回覆:37
積分:11
註冊:2003-02-07

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-07-02 11:23:32 IP:163.18.xxx.xxx 未訂閱
for (y=0;y<128;y  )
   {
    for (x=0;x<128;x  )
     {
        color=pixel[count];//如果前一位元組為高八位元
         //color=pixel[count 1];//如果後一位元組為高八位元
         color=(16*pixel[count] pixel[count 1SetPixel(Image1->Canvas->Handle, x,y,TColor(RGB(color,color,color)));
       count =2;
     }
   }
發表人 - MilesWamg 於 2003/07/02 15:07:56
blacknew
一般會員


發表:2
回覆:5
積分:1
註冊:2002-12-30

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-07-02 11:43:47 IP:211.23.xxx.xxx 未訂閱
謝謝taishyang! 但正規化後 影像呈現仍有問題 請問是否還有可能有疏漏之處??
blacknew
一般會員


發表:2
回覆:5
積分:1
註冊:2002-12-30

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-07-02 11:48:46 IP:211.23.xxx.xxx 未訂閱
謝謝MilesWamg~ 修正後影像呈現仍不正常 如下:
taishyang
站務副站長


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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-07-02 11:58:04 IP:140.135.xxx.xxx 未訂閱
blacknew您好:   我程式功力沒有那麼厲害< >,可以反推您的資料分佈為何< > 所以是否方便將您的專案與SOURCE(多一點測試檔案)上傳至 http://delphi.ktop.com.tw/forum.asp?FORUM_ID=97 [會員求助程式檔案上傳區] 並說明檔案的格式 順心 <>~我也是在學習的階段,所以請您多多見諒與指教~ 發表人 -
MilesWamg
一般會員


發表:18
回覆:37
積分:11
註冊:2003-02-07

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-07-02 12:03:49 IP:163.18.xxx.xxx 未訂閱
for (y=0;y<128;y  )
   {
    for (x=0;x<128;x  )
     {
       color=((256*pixel[count] pixel[count 1]))/256;//此一計算為16bits表示但除上16,故計算會超出255應為除上256!!
       SetPixel(Image1->Canvas->Handle, x,y,TColor(RGB(color,color,color)));
       count =2;
     }
   }
一pixels為2byte 故修正為 color=((256*pixel[count] pixel[count 1]))/256; 或者 為color=pixel[count]; (因為後者經正規化後會消失!!) 請試試看此一方法 發表人 - MilesWamg 於 2003/07/02 15:09:16
JerryKuo
版主


發表:42
回覆:571
積分:322
註冊:2003-03-10

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-07-02 13:00:37 IP:61.230.xxx.xxx 未訂閱
blacknew你好    下面有兩種情況和解決的方法,參考看看 1.影像是一個pixel兩個byte,可能實際上只用一個值,例如: 00 14 實際上只有14=20,所以你可以讀兩個byte只挑後面值處理就好,秀出來看 就知道,我是覺得很少人會把灰階範圍提升到0~65535。
for (y=0;y<128;y  )
   {
    for (x=0;x<128;x  )
     {
       color=(byte)pixel[count   1];
       SetPixel(Image1->Canvas->Handle, x,y,TColor(RGB(color,color,color)));
       count =2;
     }
   }
2.每個像素灰階範圍是0~65535,那就把值正規化(normalize),原程式改成
for (y=0;y<128;y  )
   {
    for (x=0;x<128;x  )
     {
       color=(byte)((256*pixel[count]   pixel[count   1])*256)/65536;
       SetPixel(Image1->Canvas->Handle, x,y,TColor(RGB(color,color,color)));
       count =2;
     }
   }
加號秀不出來..用想像的
blacknew
一般會員


發表:2
回覆:5
積分:1
註冊:2002-12-30

發送簡訊給我
#13 引用回覆 回覆 發表時間:2003-07-02 17:11:30 IP:211.23.xxx.xxx 未訂閱
謝謝各位前輩的熱心回應 我的問題已經解決了 謝謝!!!
系統時間:2024-05-06 3:02:24
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!