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

請問關於我這個影像反白的程式

答題得分者是:richtop
xdio2
一般會員


發表:60
回覆:29
積分:17
註冊:2004-07-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-10-17 14:45:36 IP:61.59.xxx.xxx 未訂閱
怎麼我反白後便成一張全紅色的圖勒... 小弟是新手,請各位大大不吝賜教 感謝~~     
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int width,height;
Byte x;
height=Image1->Picture->Bitmap->Height;
width=Image1->Picture->Bitmap->Width;    Image1->Picture->Bitmap->PixelFormat=pf8bit;
Image2->Picture->Bitmap->Assign(Image1->Picture->Bitmap);    for(int i=0;iPicture->Bitmap->Canvas->Pixels[j][i]=x;
Image2->Picture->Bitmap->Canvas->Pixels[j][i]=(255-x);
}
}
}    右邊的紅色圖,就是我的結果...
怎麼會變成這樣勒...不太明白~     
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-10-17 15:00:51 IP:61.59.xxx.xxx 未訂閱
for(int j=0;jPicture->Bitmap->Canvas->Pixels[j][i]=x; Image2->Picture->Bitmap->Canvas->Pixels[j][i]=(255-x); } what are you doing???? what's the value of 'x' ?????
xdio2
一般會員


發表:60
回覆:29
積分:17
註冊:2004-07-23

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-10-17 15:27:34 IP:61.59.xxx.xxx 未訂閱
引言: for(int j=0;jPicture->Bitmap->Canvas->Pixels[j][i]=x; Image2->Picture->Bitmap->Canvas->Pixels[j][i]=(255-x); } what are you doing???? what's the value of 'x' ?????
x是我要用來存像素質的變數阿 因為Image2是跟我的原圖一樣的東西 所以我就直接反白Image2 上面那兩行就是用255這個像素去減所有的像素質阿 難道...反白不是這樣做嗎? 我看書上是這樣寫的 小弟是新手,請大大指點一下,謝謝~
xdio2
一般會員


發表:60
回覆:29
積分:17
註冊:2004-07-23

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-10-17 15:34:45 IP:61.59.xxx.xxx 未訂閱
引言: for(int j=0;jPicture->Bitmap->Canvas->Pixels[j][i]=(255-x); } what are you doing???? what's the value of 'x' ?????
多謝這位大大提醒...我放錯x的位置了 應該寫x=Image2->Picture->Bitmap->Canvas->Pixels[j][i]; 我的結果變成下面的 可是有些像素變成紅的 這是怎麼回事呢....??
richtop
資深會員


發表:122
回覆:646
積分:468
註冊:2003-06-10

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-10-17 20:36:28 IP:211.76.xxx.xxx 未訂閱
xdio2 您好:    一個最少的修改方式供您參考:

for (int i=0;iPicture->Bitmap->Canvas->Pixels[j][i];
            Image2->Picture->Bitmap->Canvas->Pixels[j][i]= x ^ 0x00FFFFFF;
          }
     }

又因為Image2->Picture->Bitmap->Canvas->Pixels[j][i];傳回的型態是TColor,所以直接用255去減會有問題,應該要分別取出RGB分量再分別用255去減。

TColor color;
  Byte r,b,g;
  for (int i=0;iPicture->Bitmap->Canvas->Pixels[j][i];
            r = 255 - GetRValue(color);  // r = ~ GetRValue(color); // not運算
            g = 255 - GetGValue(color);  // g = ~ GetGValue(color);
            b = 255 - GetBValue(color);  // b = ~ GetBValue(color);
            Image2->Picture->Bitmap->Canvas->Pixels[j][i]= (TColor) RGB(r,g,b);
          }
     }    
補充一下,如果改成ScanLine的方式存取會提升速度,站上有很多例子請自行參考。 RichTop 敬上 =====***** 把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題! =====##### 發表人 - richtop 於 2004/10/17 20:55:16
系統時間:2024-11-25 22:51:12
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!