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

將圖片放大

答題得分者是:cashyy
keikojason
初階會員


發表:37
回覆:63
積分:45
註冊:2004-05-10

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-06-12 15:35:35 IP:163.28.xxx.xxx 未訂閱
請問各位大大如果要將ㄧ張圖像放大要怎樣用呢?就是將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;yHeight;y++)
  {
  ptr=(Byte*)BMP->ScanLine[y];
   for(int x=0;xWidth;x++)
     {
     for(int o=0;xHeight;o++)
       {ptr=(Byte*)BMP1->ScanLine[o];
        index=0;
       for(int p=0;pWidth;p++)
         {
              if(ptr[x*3]==0)
                value = 0;
              else value = 255;
              ptr1[index  ] = value;
              ptr1[index+1] = value;
              ptr1[index+2] = value;
              index += 3;
          }
       }       
     }
   }    Image2->Picture->Assign(BMP1);
Image2->Show();
cashyy
高階會員


發表:117
回覆:322
積分:212
註冊:2004-04-30

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-06-12 18:27:32 IP:59.104.xxx.xxx 未訂閱
您好! 請參考下列資訊: http://delphi.ktop.com.tw/topic.php?TOPIC_ID=34732 http://delphi.ktop.com.tw/topic.php?topic_id=66035 http://delphi.ktop.com.tw/topic.php?topic_id=64504 http://delphi.ktop.com.tw/topic.php?topic_id=47369
keikojason
初階會員


發表:37
回覆:63
積分:45
註冊:2004-05-10

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-06-12 19:05:18 IP:163.28.xxx.xxx 未訂閱
引言: http://delphi.ktop.com.tw/topic.php?TOPIC_ID=34732
cashyy 妳好: 這個方式(內插法)小弟有看過,我也有試過,但是在處理速度上因為較慢,所以我沒有參考它的法則,小弟是想說用對應的方式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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-06-13 12:05:03 IP:220.135.xxx.xxx 未訂閱
引言:
引言: http://delphi.ktop.com.tw/topic.php?TOPIC_ID=34732
cashyy 妳好: 這個方式(內插法)小弟有看過,我也有試過,但是在處理速度上因為較慢,所以我沒有參考它的法則,小弟是想說用對應的方式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;
keikojason你好: 我建議你先看懂那個程式,因為內插法那個程式,只是取點方法用了比較龜 毛的方法,但是把取點方式改成整數點不要內插,就跟你想要的作法是一樣的。 ps: 程式中用GetRValue只是為了方便閱讀.並不是scanline有什麼問題
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;
系統時間:2024-05-19 8:48:10
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!