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

請問一下如何才能將下列程式改成ScanLine的方式

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


發表:19
回覆:34
積分:10
註冊:2003-07-31

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-10-06 12:08:28 IP:219.68.xxx.xxx 未訂閱
請問一下如何才能將下列程式改成ScanLine的方式 因為我的處理速度要快一點 
    
   TMemoryStream* ima=new TMemoryStream();
   ima->LoadFromFile(OpenDialog1->FileName);
   int dwSize=ima->Size;
   BYTE* pixel=new BYTE[dwSize];
   ima->Read(pixel, dwSize);
   Graphics::TBitmap* BMP=new Graphics::TBitmap();
   BMP->Width=1024;
   BMP->Height=1024;
   for (int y=0;yHeight;y  )
   {
    for (int x=0;xWidth;x  )
    {
     byte color=TColor(pixel[1024*y x]);
     SetPixel(BMP->Canvas->Handle, x,y,TColor(RGB(color,color,color)));
    }
   }
taishyang
站務副站長


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-10-06 14:04:04 IP:140.135.xxx.xxx 未訂閱
ayuen您好:  試試下面這樣吧
 
 TMemoryStream* ima=new TMemoryStream();
 ima->LoadFromFile(OpenDialog1->FileName);
 int dwSize=ima->Size;
 BYTE* pixel=new BYTE[dwSize],*ptr;  
 ima->Read(pixel, dwSize);     
 Graphics::TBitmap* BMP=new Graphics::TBitmap();
 BMP->PixelFormat=pf24bit;
 BMP->Height=1024;
 BMP->Width=1024;
for (int y=0;yHeight ;y  )
 {
  ptr=(Byte*)BMP->ScanLine[y];
  for (int x=0;xWidth;x  )
  {
   byte color=TColor(pixel[1024*y x]);
   ptr[x*3]=ptr[x*3 1]=ptr[x*3 2]=color;
  }
 }
 Image1->Picture->Assign(BMP);
 delete [] pixel;               delete ima;
 delete BMP;
順心 > <>~我也是在學習的階段,回答的不好請您多多見諒與指教~ 發表人 -
JerryKuo
版主


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-10-06 16:19:34 IP:61.230.xxx.xxx 未訂閱
記得設定pixelformat為pf24bit
ayuen
一般會員


發表:19
回覆:34
積分:10
註冊:2003-07-31

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-10-06 17:14:28 IP:219.68.xxx.xxx 未訂閱
抱歉Taishyang版主: 因為我要將讀進來的raw data選取我要的部分於image2顯示(256*256) 但是若我將RAW的Width和Height設成256 就會出現Access Violation的錯誤 設成1024不會出現錯誤但就變成整張圖摟 如果我要做灰階處理是否要先將PixelFormat設成8bit還是不必設呢 因為之前我有發生過類似的問題  
     TMemoryStream* ima=new TMemoryStream();
     ima->LoadFromFile(OpenDialog1->FileName);
     int dwSize=ima->Size;
     BYTE* pixel=new BYTE[dwSize],*ptr;
     ima->Read(pixel, dwSize);
     Graphics::TBitmap* RAW=new Graphics::TBitmap();
     RAW->PixelFormat=pf24bit;
     RAW->Width=256;      
     RAW->Height=256;
     for (int y=0;y<1024;y  )
     {
     ptr=(Byte*)RAW->ScanLine[y];
      for (int x=0;x<1024;x  )
      {
       byte color=TColor(pixel[1024*y x]);
       ptr[x*3]=ptr[x*3 1]=ptr[x*3 2]=color;
      }
     }
     Image2->AutoSize=true;
     Image2->Picture->Assign(RAW);
     delete [] pixel;
     delete ima;
     delete RAW;
 
taishyang
站務副站長


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-10-06 18:00:20 IP:140.135.xxx.xxx 未訂閱
ayuen您好:
引言: 因為我要將讀進來的raw data選取我要的部分於image2顯示(256*256) 但是若我將RAW的Width和Height設成256就會出現Access Violation的錯誤設成1024不會出現錯誤但就變成整張圖
因為您Create出來的RAW大小只有256*256,但您卻給它1024*1024大小的資料 所以會錯誤是正常的 <>< face="Verdana, Arial, Helvetica">引言: 如果我要做灰階處理是否要先將PixelFormat設成8bit還是不必設呢 這方面建議您先去看一下影像處理中RGB色彩模型,以及灰階轉換的原理 再來請搜尋一下ScanLine的用法,以及其涵義... 因為答案是可設定成8bit或24bit[兩者皆可] 若您設定成24bit,則ptr[x*3]為B,ptr[x*3 1]為G,ptr[x*3 2]為R 若您設定為8bit,ptr[x]即為0~255的像素值分佈 疑!在下面連結中JerryKuo版主不是已經達到您要的需求嗎?? http://delphi.ktop.com.tw/topic.php?TOPIC_ID=38170 順心 <>~我也是在學習的階段,回答的不好請您多多見諒與指教~ 發表人 -
JerryKuo
版主


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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-10-06 18:05:15 IP:61.230.xxx.xxx 未訂閱
引言: 抱歉Taishyang版主: 因為我要將讀進來的raw data選取我要的部分於image2顯示(256*256) 但是若我將RAW的Width和Height設成256 就會出現Access Violation的錯誤 設成1024不會出現錯誤但就變成整張圖摟 如果我要做灰階處理是否要先將PixelFormat設成8bit還是不必設呢 因為之前我有發生過類似的問題
     TMemoryStream* ima=new TMemoryStream();
     ima->LoadFromFile(OpenDialog1->FileName);
     int dwSize=ima->Size;
     BYTE* pixel=new BYTE[dwSize],*ptr;
     ima->Read(pixel, dwSize);
     Graphics::TBitmap* RAW=new Graphics::TBitmap();
     RAW->PixelFormat=pf24bit;
     RAW->Width=256;      
     RAW->Height=256;
     for (int y=0;y<1024;y  )
     {
     ptr=(Byte*)RAW->ScanLine[y];
      for (int x=0;x<1024;x  )
      {
       byte color=TColor(pixel[1024*y x]);
       ptr[x*3]=ptr[x*3 1]=ptr[x*3 2]=color;
      }
     }
     Image2->AutoSize=true;
     Image2->Picture->Assign(RAW);
     delete [] pixel;
     delete ima;
     delete RAW;
 
< face="Verdana, Arial, Helvetica"> 迴圈1024x1024筆資料,設256x256 bitmap去讀取,難怪會Access Violation 在你提供的程式碼裡面沒有看到選取的動作,先確定一下選取動作有沒有加進去?
ayuen
一般會員


發表:19
回覆:34
積分:10
註冊:2003-07-31

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-10-06 18:26:52 IP:219.68.xxx.xxx 未訂閱
因為我是要利用image1的mousedown來當成選取的區塊 而image1上的圖為1024*1024的raw data 利用image1之mousedown來當成所選取區塊大小的起點 取256*256顯示於image2再將其作處理     
   StartX=X;
   StartY=Y; 
   TMemoryStream* ima=new TMemoryStream();
   ima->LoadFromFile(OpenDialog1->FileName);
   int dwSize=ima->Size;
   BYTE* pixel=new BYTE[dwSize];
   ima->Read(pixel, dwSize);
   Graphics::TBitmap* RAW=new Graphics::TBitmap();
   RAW->Width=256;
   RAW->Height=256;
   for (int y=0;y<1024;y  )
   {
    for (int x=0;x<1024;x  )
    {
     byte color=TColor(pixel[1024*y x]);
     SetPixel(RAW->Canvas->Handle, (x-StartX),(y-StartY),TColor(RGB(color,color,color)));
    }
   }
taishyang
站務副站長


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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-10-06 19:12:08 IP:140.135.xxx.xxx 未訂閱
ayuen您好:  嗯? 您還是沒有看懂我與JerryKuo版主的意思耶 看一下您的迴圈的範圍,與您的 > 看了您的需求,您試試下面的 class="code"> void __fastcall TForm1::Image1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { Graphics::TBitmap *bmpDst=new Graphics::TBitmap; bmpDst->Width=256; bmpDst->Height=256; bmpDst->Canvas->CopyMode=cmSrcCopy; bmpDst->Canvas->CopyRect(Rect(0,0,bmpDst->Width,bmpDst->Height),Image1->Canvas,Rect(X,Y,X 256,Y 256)); Image2->Picture->Assign(bmpDst); delete bmpDst; } 應該就是您要的吧 <>~我也是在學習的階段,回答的不好請您多多見諒與指教~ 發表人 -
ayuen
一般會員


發表:19
回覆:34
積分:10
註冊:2003-07-31

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-10-06 19:30:51 IP:219.68.xxx.xxx 未訂閱
< >我是要將 > 拍謝< >
taishyang
站務副站長


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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-10-06 19:39:10 IP:140.135.xxx.xxx 未訂閱
ayuen您好:   上面的方式不能解決您的問題嗎 請問一下您
ayuen
一般會員


發表:19
回覆:34
積分:10
註冊:2003-07-31

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-10-06 19:48:11 IP:219.68.xxx.xxx 未訂閱
Taishyang版主你好: 我的格式為*. >
ayuen
一般會員


發表:19
回覆:34
積分:10
註冊:2003-07-31

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-10-06 19:51:50 IP:219.68.xxx.xxx 未訂閱
sorry 剛剛沒看到 >
ayuen
一般會員


發表:19
回覆:34
積分:10
註冊:2003-07-31

發送簡訊給我
#13 引用回覆 回覆 發表時間:2003-10-06 20:01:34 IP:219.68.xxx.xxx 未訂閱
先謝謝Taishyang版主摟: 我先前也有以此方法來做一些處理但是卻有一些未知的影響 會有出現像素的問題耶 如果將Image2上的值取出所取出的值是和原始的raw data值一樣嗎 我再繼續做下去試試看 多謝Taishyang版主
taishyang
站務副站長


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

發送簡訊給我
#14 引用回覆 回覆 發表時間:2003-10-06 20:19:13 IP:140.135.xxx.xxx 未訂閱
ayuen您好:
引言: 我先前也有以此方法來做一些處理但是卻有一些未知的影響 會有出現像素的問題耶
出現什麼樣的問題? 您*.raw的內容與格式為何?
引言: 如果將Image2上的值取出所取出的值是和原始的raw data值一樣嗎 我再繼續做下去試試看
答案就如同下面連結所說的 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=38437 確切知道您*.raw的格式,data值就會一樣 ~我也是在學習的階段,回答的不好請您多多見諒與指教~
系統時間:2024-05-05 18:34:50
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!