將圖片放大 |
答題得分者是:cashyy
|
keikojason
初階會員 發表:37 回覆:63 積分:45 註冊:2004-05-10 發送簡訊給我 |
請問各位大大如果要將ㄧ張圖像放大要怎樣用呢?就是將Image1的每ㄧ個點變為16個點,形成新的ㄧ張圖Image2,假設Image1該點為黑色,其Image2就有16點黑色如下圖,還有小弟撰寫的程式,RUN時出現問題,不知道哪寫錯?還是小弟邏輯觀念錯誤呢?請為小弟解惑,謝謝各位前輩^.^...
Graphics::TBitmap *BMP = Image1->Picture->Bitmap; Graphics::TBitmap *BMP1 = Image1->Picture->Bitmap; BMP->Assign(Image1->Picture->Bitmap); BMP->PixelFormat = pf24bit; Byte *ptr,*ptr1; int value,index; for(int y=0;y |
cashyy
高階會員 發表:117 回覆:322 積分:212 註冊:2004-04-30 發送簡訊給我 |
|
keikojason
初階會員 發表:37 回覆:63 積分:45 註冊:2004-05-10 發送簡訊給我 |
引言: http://delphi.ktop.com.tw/topic.php?TOPIC_ID=34732cashyy 妳好: 這個方式(內插法)小弟有看過,我也有試過,但是在處理速度上因為較慢,所以我沒有參考它的法則,小弟是想說用對應的方式1點=>16點(如果1點白色,新圖就16點白色;反之黑色就16點黑色,新圖面積會是原圖面積的16倍,高與寬4倍)這樣處理可能會較快。 if(ptr[x*3]==0) value = 0; else value = 255; ptr1[index ] = value; ptr1[index 1] = value; ptr1[index 2] = value; |
JerryKuo
版主 發表:42 回覆:571 積分:322 註冊:2003-03-10 發送簡訊給我 |
引言:keikojason你好: 我建議你先看懂那個程式,因為內插法那個程式,只是取點方法用了比較龜 毛的方法,但是把取點方式改成整數點不要內插,就跟你想要的作法是一樣的。 ps: 程式中用GetRValue只是為了方便閱讀.並不是scanline有什麼問題引言: http://delphi.ktop.com.tw/topic.php?TOPIC_ID=34732cashyy 妳好: 這個方式(內插法)小弟有看過,我也有試過,但是在處理速度上因為較慢,所以我沒有參考它的法則,小弟是想說用對應的方式1點=>16點(如果1點白色,新圖就16點白色;反之黑色就16點黑色,新圖面積會是原圖面積的16倍,高與寬4倍)這樣處理可能會較快。if(ptr[x*3]==0) value = 0; else value = 255; ptr1[index ] = value; ptr1[index 1] = value; ptr1[index 2] = value; if (Image2->Picture->Bitmap->Empty==true) { ShowMessage("no Image to Process"); return; } Graphics::TBitmap *NBmp = new Graphics::TBitmap(); int w,h,newW,newH; double dX,dY,x,y; double scalar; // Zoom scalar int i,j; // int ix,iy; // integer value of (x,y) // double fx,fy; // float value of (x,y) unsigned char clr, clrR,clrG,clrB; // nclr1,nclr2,nclr3,nclr4; // color of neighbor 4 pixel w = Image1->Width; h = Image1->Height; scalar = StrToFloat(Edit3->Text); newW = (int)((double)w*scalar); newH = (int)((double)h*scalar); if((newW <=0) ||(newH <=0)) { ShowMessage("Invalided parameter"); return; } NBmp->PixelFormat = pf24bit; NBmp->Width = newW; NBmp->Height = newH; /* Caculate the step size of movement */ dX = (double)w/(double)newW; dY = (double)h/(double)newH; for(j = 0 ; j < newH ; j ) for(i =0 ; i < newW ; i ) { x = dX*(double)i; y = dY*(double)j; clrR = GetRValue(Bmp->Canvas->Pixels[x][y]); clrG = GetGValue(Bmp->Canvas->Pixels[x][y]); clrB = GetBValue(Bmp->Canvas->Pixels[x][y]); /* ix = (int)x; iy = (int)y; fx = x - (double)ix; fy = y - (double)iy; nclr1 = GetRValue(Bmp->Canvas->Pixels[ix][iy]); nclr2 = GetRValue(Bmp->Canvas->Pixels[ix 1][iy]); nclr3 = GetRValue(Bmp->Canvas->Pixels[ix][iy 1]); nclr4 = GetRValue(Bmp->Canvas->Pixels[ix 1][iy 1]); // Bilinear clrR=(byte)((1.0-fx)*(1.0-fy)*(double)nclr1 (fx)*(1.0-fy)*(double)nclr2 (1.0-fx)* (fy)*(double)nclr3 (fx)* (fy)*(double)nclr4); nclr1 = GetGValue(Bmp->Canvas->Pixels[ix][iy]); nclr2 = GetGValue(Bmp->Canvas->Pixels[ix 1][iy]); nclr3 = GetGValue(Bmp->Canvas->Pixels[ix][iy 1]); nclr4 = GetGValue(Bmp->Canvas->Pixels[ix 1][iy 1]); // Bilinear clrG=(byte)((1.0-fx)*(1.0-fy)*(double)nclr1 (fx)*(1.0-fy)*(double)nclr2 (1.0-fx)* (fy)*(double)nclr3 (fx)* (fy)*(double)nclr4); nclr1 = GetBValue(Bmp->Canvas->Pixels[ix][iy]); nclr2 = GetBValue(Bmp->Canvas->Pixels[ix 1][iy]); nclr3 = GetBValue(Bmp->Canvas->Pixels[ix][iy 1]); nclr4 = GetBValue(Bmp->Canvas->Pixels[ix 1][iy 1]); // Bilinear clrB=(byte)((1.0-fx)*(1.0-fy)*(double)nclr1 (fx)*(1.0-fy)*(double)nclr2 (1.0-fx)* (fy)*(double)nclr3 (fx)* (fy)*(double)nclr4); */ NBmp->Canvas->Pixels[i][j] = (TColor)RGB(clrR,clrG,clrB); } Image2->Width = newW; Image2->Height = newH; Image2->Picture->Bitmap = NBmp; delete NBmp; |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |