如何對圖片做馬賽克的效果?? |
尚未結案
|
qq2141
一般會員 發表:4 回覆:3 積分:1 註冊:2004-12-10 發送簡訊給我 |
|
TheMoon
中階會員 發表:17 回覆:95 積分:67 註冊:2002-06-05 發送簡訊給我 |
|
qq2141
一般會員 發表:4 回覆:3 積分:1 註冊:2004-12-10 發送簡訊給我 |
引言:您好, 您可在影像選取的特定區域中分割成一個一個的區塊進行處理, 區塊大小可自訂, 然後在每一區塊中計算色點的平均值, 再以此平均值填入此區塊的各點。 a|b|c m|m|m d|e|f → m=(a b c d e f g h i)/9 → m|m|m g|h|i m|m|m 試試看吧> >>< face="Verdana, Arial, Helvetica"> 不好意思 請問我該怎麼取得特定區域的位置做轉換呢??? Pixels[i][j],(i,j)=螢幕上點座標嗎?? 那如果想使用ScanLine[y]我該怎麼寫呢?? 我陷在卡在如何取得特定區域的影像每個pixel的rgb值 我該怎麼知道我取得的範圍的長寬?? 可否請您給點指點呢!! 或是有範例可以說明會更明白 謝謝你 |
yaozong
一般會員 發表:5 回覆:7 積分:2 註冊:2004-10-17 發送簡訊給我 |
|
qqmax
一般會員 發表:17 回覆:26 積分:8 註冊:2004-11-22 發送簡訊給我 |
引言: 就如同TheMoon大大所說的,你可以將圖片分為n個區塊,我這裡就舉3*3個區塊 為例子,當你把圖片分為3*3個區塊時,第一個區塊pixels的範圍就在 (0,0)~((image->width/6),(image->height/6))之內,任意抓某一個pixels的 color,在將其他在此區塊內pixels的color都等於剛剛所抓的color 做完後在跑下一個區塊,當你的區塊取的個數越多,所呈現的馬賽克會越接近底色. 這個方法給你做個參考吧 >>< face="Verdana, Arial, Helvetica"> 其實我對如何取到那幾點再取平均值的程式與法實在想不出來 可以給點建議嗎??^^謝謝 |
TheMoon
中階會員 發表:17 回覆:95 積分:67 註冊:2002-06-05 發送簡訊給我 |
假設您選取的範圍是在(StratX,StartY)~(EndX,EndY)之間, 且您的區塊大小設為3X3, 那麼用ScanLine的作法可參考如下: (假設影像是24-bits Color Image存放於Img1物件中) (程式未做詳細的邊界判斷,請自行修改) Byte *ptr1, *ptr2, *ptr3; Byte *rptr1,*rptr2, *rptr3; Byte R,G,B; int i,j,k; Graphics::TBitmap *bmp = new Graphics::TBitmap(); //暫存結果 bmp->Height=EndY-StartY 1; bmp->Width=EndX-StartX 1; bmp->PixelFormat=pf24bit; for(i=StartY; i |
qqmax
一般會員 發表:17 回覆:26 積分:8 註冊:2004-11-22 發送簡訊給我 |
引言:對不起再請問一下你的StarX,Y和EndX,Y是代表哪兩點呢 長方形的佐上跟右下點嗎??? 謝謝假設您選取的範圍是在(StratX,StartY)~(EndX,EndY)之間, 且您的區塊大小設為3X3, 那麼用ScanLine的作法可參考如下: (假設影像是24-bits Color Image存放於Img1物件中) (程式未做詳細的邊界判斷,請自行修改) Byte *ptr1, *ptr2, *ptr3; Byte *rptr1,*rptr2, *rptr3; Byte R,G,B; int i,j,k; Graphics::TBitmap *bmp = new Graphics::TBitmap(); //暫存結果 bmp->Height=EndY-StartY 1; bmp->Width=EndX-StartX 1; bmp->PixelFormat=pf24bit; for(i=StartY; i |
TheMoon
中階會員 發表:17 回覆:95 積分:67 註冊:2002-06-05 發送簡訊給我 |
|
qqmax
一般會員 發表:17 回覆:26 積分:8 註冊:2004-11-22 發送簡訊給我 |
引言:引言: 對不起再請問一下你的StarX,Y和EndX,Y是代表哪兩點呢 長方形的佐上跟右下點嗎??? 謝謝Yes 建議您先試試看做整張影像的馬賽克效果, 測試成功後再去做選擇區域的馬賽克效果, 因為做整張影像的情況比較單純, 且要判斷的條件也比較少。 >>< face="Verdana, Arial, Helvetica"> 嗯嗯我懂了 謝謝你的精闢講解 for(k=0; k<3; k ) { rptr1[(j-StartX k)*3]=rptr2[(j-StartX k)*3]=rptr3[(j-StartX k)*3]=B; rptr1[(j-StartX k)*3 1]=rptr2[(j-StartX k)*3 1]=rptr3[(j-StartX k)*3 1]=G; rptr1[(j-StartX k)*3 2]=rptr2[(j-StartX k)*3 2]=rptr3[(j-StartX k)*3 2]=R; } 可已在問一下以上FOR迴圈邏輯怎麼想的 j-StartX k不會<0嗎???? |
TheMoon
中階會員 發表:17 回覆:95 積分:67 註冊:2002-06-05 發送簡訊給我 |
引言: 嗯嗯我懂了 謝謝你的精闢講解 for(k=0; k<3; k ) { rptr1[(j-StartX k)*3]=rptr2[(j-StartX k)*3]=rptr3[(j-StartX k)*3]=B; rptr1[(j-StartX k)*3 1]=rptr2[(j-StartX k)*3 1]=rptr3[(j-StartX k)*3 1]=G; rptr1[(j-StartX k)*3 2]=rptr2[(j-StartX k)*3 2]=rptr3[(j-StartX k)*3 2]=R; } 可已在問一下以上FOR迴圈邏輯怎麼想的 j-StartX k不會<0嗎????不好意思, 為了縮短程式篇幅造成您閱讀程式上的困擾。 說明如下: (1) j的初設值為StartX,所以(j-StartX k)會>=0。 (2) 由於在3X3的區塊中,每個row都有3個點, 所以用for(k=0; k<3; k )來做, 以k移動指向每個點的起始位址。 (3) 接著迴圈內的程式意義如下: rptr1[(j-StartX k)*3 0]=B; rptr2[(j-StartX k)*3 0]=B; rptr3[(j-StartX k)*3 0]=B; rptr1[(j-StartX k)*3 1]=G; rptr2[(j-StartX k)*3 1]=G; rptr3[(j-StartX k)*3 1]=G; rptr1[(j-StartX k)*3 2]=R; rptr2[(j-StartX k)*3 2]=R; rptr3[(j-StartX k)*3 2]=R; 因為每個Pixel佔3個Bytes, 所以(j-StartX k)*3, 又每個Byte分別代表B,G,R, 所以有 0, 1, 2的區別。 |
chatman
一般會員 發表:7 回覆:2 積分:1 註冊:2004-10-07 發送簡訊給我 |
引言:發表人 - chatman 於 2004/12/16 02:25:41假設您選取的範圍是在(StratX,StartY)~(EndX,EndY)之間, 且您的區塊大小設為3X3, 那麼用ScanLine的作法可參考如下: (假設影像是24-bits Color Image存放於Img1物件中) (程式未做詳細的邊界判斷,請自行修改) Byte *ptr1, *ptr2, *ptr3; Byte *rptr1,*rptr2, *rptr3; Byte R,G,B; int i,j,k; Graphics::TBitmap *bmp = new Graphics::TBitmap(); //暫存結果 bmp->Height=EndY-StartY 1; bmp->Width=EndX-StartX 1; bmp->PixelFormat=pf24bit; for(i=StartY; i |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |