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

請問兩的像素的亮度值互傳與亮度平均

尚未結案
bettyps
一般會員


發表:3
回覆:4
積分:1
註冊:2004-04-01

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-04-16 23:32:40 IP:140.117.xxx.xxx 未訂閱
我想要將本來的圖片偶數像素的值傳到另一個圖片                                                                                  所以我這樣寫                                                                      
ShowMessage(           
int Width, Height;
Graphics::TBitmap *TheBitmap, *TempBitmap;
Byte *ptr, *ptrt;
TempBitmap= new Graphics::TBitmap();
TheBitmap=Image1->Picture->Bitmap;
TheBitmap->PixelFormat=pf8bit;
TempBitmap->Assign(TheBitmap);
                                                                                
                                                                                
for (int y=0; yScanLine[y];
 ptrt = (Byte*) TempBitmap->ScanLine[y];
 for (int x=0; xAssign(TempBitmap);
);                                                                     
debug時沒有錯誤但執行此按鈕時ptrt[x]=ptr[x]總是出現警告的視窗 Project Project2.exe raised exception class EAccessViolation with message 'Access violation at address 00402A44 in module 'Project2.exe'. Read of address '0107F000'. 請問是發生怎樣的錯誤呢? 卡在這裡好久...XD...請解惑..感激..Q__Q PS:順帶問一下如果是圖形中兩個pixel亮度的平均大家又怎麼寫呢?
 
 
 
發表人 - bettyps 於 2004/04/16 23:53:16 發表人 - bettyps 於 2004/04/16 23:55:27
taishyang
站務副站長


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-04-17 00:20:32 IP:140.135.xxx.xxx 未訂閱
bettyps您好:
   Byte *ptr=NULL, *ptrt=NULL;
   Graphics::TBitmap *TheBitmap= new Graphics::TBitmap();
   Graphics::TBitmap *TempBitmap= new Graphics::TBitmap();
   TheBitmap->Assign(Image1->Picture->Bitmap);
   TheBitmap->PixelFormat=pf8bit;
   TempBitmap->PixelFormat=pf8bit;
   TempBitmap->Width = TheBitmap->Width;
   TempBitmap->Height = TheBitmap->Height;
   for (int y=0; yHeight; y=y 2)
   {
      ptr = (Byte*) TheBitmap->ScanLine[y];
      ptrt = (Byte*) TempBitmap->ScanLine[y];
      for (int x=0; xWidth; x=x 2)
      {
         ptrt[x]=ptr[x];
      }
   }
   Image2->Picture->Assign(TempBitmap);
   delete TempBitmap;
   delete TheBitmap;
不知這樣是不是您要的 還是您要的是類似下面連結說的 < href="http://delphi.ktop.com.tw/topic.php?TOPIC_ID=46606">http://delphi.ktop.com.tw/topic.php?TOPIC_ID=46606
引言:順帶問一下如果是圖形中兩個pixel亮度的平均大家又怎麼寫呢?
請將程式碼PO上來讓有經驗的前輩們幫您看看< > 順心< > ~我也是在學習的階段,回答的不好請您多多見諒與指教~ 發表人 - taishyang 於 2004/04/17 00:27:24
bettyps
一般會員


發表:3
回覆:4
積分:1
註冊:2004-04-01

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-04-17 01:24:04 IP:140.117.xxx.xxx 未訂閱
謝謝你~~ 我試過你的程式碼似乎也跟我本來的道理相通 但是仍然執行是同樣的錯誤...(怪) 又參考了你給我的另一個以前的網址 我用Canvas方法改寫如下    
ShowMessage(
int Width, Height;
Graphics::TBitmap *TheBitmap, *TempBitmap;
Byte *ptr1, *ptr2;
TempBitmap= new Graphics::TBitmap();
TheBitmap=Image1->Picture->Bitmap;
TempBitmap->Assign(TheBitmap);
Width = TheBitmap->Width;
Height = TheBitmap->Height;    for (int y=0; yCanvas->Pixels[x][y]=TheBitmap->Canvas->Pixels[x][y];
 }
}    //以上只是純複製    //此後這段是我試圖做的平均
for (int y=0; yCanvas->Pixels[x 1][y];
     p2=TempBitmap->Canvas->Pixels[x-1][y];
     sum=p1 p2;
     if (sum%2==0)
     TempBitmap->Canvas->Pixels[x][y]=(int)(sum)/2;
     else if (sum%2==1)
     TempBitmap->Canvas->Pixels[x][y]=(int)(sum-1)/2;
}
}    //程式未完...    );
用Canvas寫法我個人比較能懂 但是這樣寫出來不知道為何亮度平均部分例如138跟137會得52 後來發現似乎是平均有小數就會出線這樣的問題 請問BCB中有四捨五入的函數嗎? 若我我照上面這樣寫結果卻也一樣又為什麼呢?...><
taishyang
站務副站長


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-04-17 03:02:52 IP:61.231.xxx.xxx 未訂閱
bettyps您好:
引言: 我試過你的程式碼似乎也跟我本來的道理相通 但是仍然執行是同樣的錯誤...(怪)
的確是蠻怪的,因為我確定可以正常執行才po上來的, winxp BCB6.0 不過只是把偶數點的像素資料顯示在Image2上 我給您的連結則是會縮小影像大小 而下面連結則是另外的做法 http://delphi.ktop.com.tw/topic.php?topic_id=32831
引言: 用Canvas寫法我個人比較能懂 但是這樣寫出來不知道為何亮度平均部分例如138跟137會得52 小弟建議您可以用Debug的方式確認問題點在哪邊,再針對問題點解決 因為您沒附圖片與完整的程式碼,小弟能力不足很難幫的上忙< > 後來發現似乎是平均有小數就會出線這樣的問題 請問>四捨五入這問題站上有問過了請您搜尋一下囉< > 若我我照上面這樣寫結果卻也一樣又為什麼呢?...>< 小弟家裡電腦沒灌BCB,待小弟下禮拜學校後再幫您試試看 或是可以等有經驗的前輩幫您看看 順心 <>~我也是在學習的階段,回答的不好請您多多見諒與指教~ 發表人 -
bettyps
一般會員


發表:3
回覆:4
積分:1
註冊:2004-04-01

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-04-17 03:28:38 IP:140.117.xxx.xxx 未訂閱
引言: bettyps您好:
引言: 我試過你的程式碼似乎也跟我本來的道理相通 但是仍然執行是同樣的錯誤...(怪)
的確是蠻怪的,因為我確定可以正常執行才po上來的, winxp BCB6.0 不過只是把偶數點的像素資料顯示在Image2上 我給您的連結則是會縮小影像大小 而下面連結則是另外的做法 http://delphi.ktop.com.tw/topic.php?topic_id=32831 這似乎跟我想要的又不太一樣@_@
引言: 用Canvas寫法我個人比較能懂 但是這樣寫出來不知道為何亮度平均部分例如138跟137會得52 小弟建議您可以用Debug的方式確認問題點在哪邊,再針對問題點解決 因為您沒附圖片與完整的程式碼,小弟能力不足很難幫的上忙< > 後來發現似乎是平均有小數就會出線這樣的問題 請問>四捨五入這問題站上有問過了請您搜尋一下囉< > 若我我照上面這樣寫結果卻也一樣又為什麼呢?...>< 小弟家裡電腦沒灌BCB,待小弟下禮拜學校後再幫您試試看 或是可以等有經驗的前輩幫您看看 順心 <>~我也是在學習的階段,回答的不好請您多多見諒與指教~ 發表人 - >< face="Verdana, Arial, Helvetica"> 感謝 小熬夜又改了改程式...很神奇地又可以跑了 (真不知道之前又是錯在哪) 現在寫法如下
ShowMessage(
Graphics::TBitmap* BMP =new Graphics::TBitmap();
  BMP->Assign(Image1->Picture->Bitmap);
  BMP->PixelFormat=pf8bit;
  Byte* ptr, *ptrup, *ptrdown = NULL;
  for (int y=0; yHeight; y=y 2)
  {
    ptr=(Byte*)BMP->ScanLine[y];
    for (int x=1; xWidth; x=x 2)
    {
      int sum=(int)ptr[x-1] (int)ptr[x 1];
      ptr[x]=(Byte)(sum/2);        }
  }      for (int y=1; yHeight; y=y 2)
  {
    ptrup=(Byte*)BMP->ScanLine[y-1];
    ptrdown=(Byte*)BMP->ScanLine[y 1];
    for (int x=0; xWidth; x=x 2)
    {
      int sum=(int)ptrup[x] (int)ptrdown[x];
      ptr[x]=(Byte)(sum/2);        }
  }      for (int y=1; yHeight; y=y 2)
  {
    ptr=(Byte*)BMP->ScanLine[y];
    ptrup=(Byte*)BMP->ScanLine[y-1];
    ptrdown=(Byte*)BMP->ScanLine[y 1];
    for (int x=1; xWidth; x=x 2)
    {
      int sum=(int)ptrup[x] (int)ptrdown[x] (int)ptr[x-1] (int)ptr[x 1];
      ptr[x]=(Byte)(sum/4);        }
  }
  Repaint();
  Image2->Picture->Assign(BMP);
  delete BMP;
);
第一個回圈用Photoshop驗證沒錯...但第二跟第三個迴圈卻又不太對了 但圖片可以跑...每多跑一個回圈用difference驗證果然又不太一樣 結果也類似我要的...但總覺得還是怪怪的...因為PS用滴管演正的結果並不太相同 不過這段程式先暫時研究到這裡 感謝盡心的taishyang版主..<(_ _)> 若有時間再請幫我看看~~
JerryKuo
版主


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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-04-19 09:36:15 IP:61.230.xxx.xxx 未訂閱
引言:
        
int Width, Height;
Graphics::TBitmap *TheBitmap, *TempBitmap;
Byte *ptr, *ptrt;
TempBitmap= new Graphics::TBitmap();
TheBitmap=Image1->Picture->Bitmap;
TheBitmap->PixelFormat=pf8bit;
不知道你為什麼要設定pf8bit,是為了轉成灰階嗎,如果是,轉灰階不是這樣
做的,RGB轉灰階有一定的公式。
TempBitmap->Assign(TheBitmap);
          
for (int y=0; yScanLine[y];
 ptrt = (Byte*) TempBitmap->ScanLine[y];
 for (int x=0; xWidth不等於TempBitmap->Width),也因此才會出
現'Access violation'
 }
}
Repaint();
TheBitmap->Assign(TempBitmap);
);                                                                     
debug時沒有錯誤但執行此按鈕時ptrt[x]=ptr[x]總是出現警告的視窗 Project Project2.exe raised exception class EAccessViolation with message 'Access violation at address 00402A44 in module 'Project2.exe'. Read of address '0107F000'.
請你再檢查看看 發表人 - jerrykuo 於 2004/04/19 09:41:35
系統時間:2024-05-12 13:36:12
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!