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

有關ScanLine問題!請各位先進們協助!謝謝!

尚未結案
auslk
初階會員


發表:35
回覆:77
積分:32
註冊:2003-02-17

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-10-01 21:14:07 IP:203.204.xxx.xxx 未訂閱
各位先進們:    小弟為影像初學者,想請教以下問題:     1.在此討論區中,小弟發現ScanLine    for迴圈 之下的寫法 有兩種版本    不知哪一個是對的?  2.可能小弟有寫錯 BCB執行後給我一個 Out of range!    請 先進們 給小弟指導!謝謝!     
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  Graphics::TBitmap *Bmp=new Graphics::TBitmap();
Byte *ptr;
int r,g,b;
int gray;
int i,j,threshold;
Bmp->Assign(Image1->Picture->Bitmap);
for(j=0;jHeight;j  )
 {
 ptr=(Byte *)Bmp->ScanLine[j];
  for(i=0;i<(Image1->Width);i)
    {
    b=ptr[i 3*j];
    g=ptr[i 3*j 1];
    r=ptr[i 3*j 2];
    gray=0.299*r 0.587*g 0.114*b;
    ptr[i 3*j]  =(Byte)(gray*0.25);
    ptr[i 3*j 1]=(Byte)(gray*0.25);
    ptr[i 3*j 2]=(Byte)(gray*0.25);
    }
  }
 Image2->Picture->Assign(Bmp);    }
Pauli 發表人 - auslk 於 2003/10/01 21:15:28
 
 
 
 
發表人 - auslk 於 2003/10/01 23:19:03
dean
一般會員


發表:24
回覆:60
積分:21
註冊:2003-08-23

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-10-01 21:53:45 IP:211.76.xxx.xxx 未訂閱
HI您好:     我也是初學者!下面的程式您試試看!我是可以成功的!  
    
   for (int i = 0;iHeight;i  )
   {
      ptr = (Byte *)Bmp->ScanLine[i];
      for (int j = 0;jWidth;j  )
      {
         B = ptr[j*3];
         G = ptr[j*3 1];
         R = ptr[j*3 2];             gray=0.299*r 0.587*g 0.114*b;             ptr[j*3] = (Byte)gray;
         ptr[j*3 1] = (Byte)gray;
         ptr[j*3 2] = (Byte)gray;
       }
   }
**我很想學,但又很不懂,所以一直問蠢問題,希望不要不屑我的問題,嘻嘻嘻**
auslk
初階會員


發表:35
回覆:77
積分:32
註冊:2003-02-17

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-10-01 21:58:01 IP:203.204.xxx.xxx 未訂閱
請問 您是用 ? byte    一般彩色影像 ==>24bit         黑白 ==> 8bit    
引言: HI您好: 我也是初學者!下面的程式您試試看!我是可以成功的!
    
   for (int i = 0;iHeight;i  )
   {
      ptr = (Byte *)Bmp->ScanLine[i];
      for (int j = 0;jWidth;j  )
      {
         B = ptr[j*3];
         G = ptr[j*3 1];
         R = ptr[j*3 2];             gray=0.299*r 0.587*g 0.114*b;             ptr[j*3] = (Byte)gray;
         ptr[j*3 1] = (Byte)gray;
         ptr[j*3 2] = (Byte)gray;
       }
   }
**我很想學,但又很不懂,所以一直問蠢問題,希望不要不屑我的問題,嘻嘻嘻**
發表人 - auslk 於 2003/10/01 22:03:58
taishyang
站務副站長


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-10-01 22:35:11 IP:140.135.xxx.xxx 未訂閱
auslk您好:   請確認您的Image1元件的寬與高和Graphics::TBitmap *Bmp   的寬與高是否相同 P.S:請參考下面聯結做適當的修改   http://delphi.ktop.com.tw/topic.php?TOPIC_ID=37787 版規說明,麻煩請大家遵守【將會在每40個主題之後出現一次】 順心 <>~我也是在學習的階段,回答的不好請您多多見諒與指教~ 發表人 -
JerryKuo
版主


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-10-02 09:49:17 IP:210.68.xxx.xxx 未訂閱
auslk你好:    1.)如果scanline是用於下列這種情形
    Graphics::TBitmap *Bmp = new Graphics::TBitmap();
    Bmp->LoadFromFile("rawdata.bmp");        
針對BMP讀出bmp檔,利用scanline將資料讀出,儲放至暫存空間(一維陣列或二 維陣列),此時如果filename.bmp的像素格式為24bits or 32bits,用scanline很 快的就能處理完成。但如果像素格式為16bits,15bits。RGB三個顏色就不是3 個byte,因此不能用你所說的方法讀取,會出現讀取錯誤。通常這時,我們可以先 經由GetRValue(),GetGValue(),GetBValue()獲取rgb,再依相對位置儲放至暫存 空間,如此在讀出資料時,才不會有讀錯資料問題,缺點是比用scanline慢了好幾 點。 2.)如果scanline是用於下列這種情形
    Graphics::TBitmap *Bmp     = new Graphics::TBitmap();
    TMemoryStream     *rawdata = new TMemoryStream();
    rawdata->LoadFromFile("image.raw");
    int DataSize = rawdata->Size;
    BYTE* pixel=new BYTE[DataSize];
    rawdata->Read(pixel, DataSize);        Bmp->PixelFormat = pf24bit;
    for loop
       *ptr=(Byte *)Bmp->ScanLine[j];
       for loop
           *ptr = pixel[];
針對影像資料已讀出為暫存陣列(例如:pixel[]),將資料儲存至bitmap物件,方 便秀圖,處理或是儲存成bmp檔,就可以使用你所參考的scanline方法,只要bitmap 物件pixelformat設定得當,秀圖及處理的速度飛快無比。 參考看看吧。
dean
一般會員


發表:24
回覆:60
積分:21
註冊:2003-08-23

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-10-02 13:07:01 IP:192.192.xxx.xxx 未訂閱
引言: auslk您好: 請確認您的Image1元件的寬與高和Graphics::TBitmap *Bmp 的寬與高是否相同 P.S:請參考下面聯結做適當的修改 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=37787 版規說明,麻煩請大家遵守【將會在每40個主題之後出現一次】 順心 <>~我也是在學習的階段,回答的不好請您多多見諒與指教~ 發表人 - >< face="Verdana, Arial, Helvetica"> taishyang前輩指的應該就是這個,如果您有宣告TBitmap *Bmp,那應該就已Bmp來作處理的長寬吧!
for(j=0;jHeight;j  )     
          **************
 {
 ptr=(Byte *)Bmp->ScanLine[j];
  for(i=0;i<(Image1->Width);i)
             *************
 
我的那個是讀一般的彩色圖檔24bits,然後轉灰階ㄚ! **我很想學,但又很不懂,所以一直問蠢問題,希望不要不屑我的問題,嘻嘻嘻**
taishyang
站務副站長


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-10-02 13:20:42 IP:140.135.xxx.xxx 未訂閱
大家好:      因為auslk會員最初是說[Out of range],所以在仔細看他的code   就會發現到他的掃描範圍是Image1的長與高,倘若實際上的*.bmp   長與寬大於您放在Form上的Image長與寬,就會發生此錯誤訊息了    順心 <>~我也是在學習的階段,回答的不好請您多多見諒與指教~
系統時間:2024-05-05 21:12:28
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!