請問一下如何才能將下列程式改成ScanLine的方式 |
答題得分者是:taishyang
|
ayuen
一般會員 發表:19 回覆:34 積分:10 註冊:2003-07-31 發送簡訊給我 |
請問一下如何才能將下列程式改成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;y |
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
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;y順心 > <>~我也是在學習的階段,回答的不好請您多多見諒與指教~> 發表人 - |
JerryKuo
版主 發表:42 回覆:571 積分:322 註冊:2003-03-10 發送簡訊給我 |
|
ayuen
一般會員 發表:19 回覆:34 積分:10 註冊:2003-07-31 發送簡訊給我 |
抱歉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 發送簡訊給我 |
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 發送簡訊給我 |
引言: 抱歉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 發送簡訊給我 |
因為我是要利用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 發送簡訊給我 |
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 發送簡訊給我 |
|
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
|
ayuen
一般會員 發表:19 回覆:34 積分:10 註冊:2003-07-31 發送簡訊給我 |
|
ayuen
一般會員 發表:19 回覆:34 積分:10 註冊:2003-07-31 發送簡訊給我 |
|
ayuen
一般會員 發表:19 回覆:34 積分:10 註冊:2003-07-31 發送簡訊給我 |
|
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
ayuen您好:
引言: 我先前也有以此方法來做一些處理但是卻有一些未知的影響 會有出現像素的問題耶出現什麼樣的問題? 您*.raw的內容與格式為何? 引言: 如果將Image2上的值取出所取出的值是和原始的raw data值一樣嗎 我再繼續做下去試試看答案就如同下面連結所說的 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=38437 確切知道您*.raw的格式,data值就會一樣 ~我也是在學習的階段,回答的不好請您多多見諒與指教~ |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |