2007年4月18日 星期三

Week 7: Image-based Spam E-mail






上面三張圖片,分別是:所有資料、使用的電腦繪圖、使用的自然圖片。
Spam圖片的數值分布範圍頗廣的,有一種我程式寫錯的感覺=.=a

2007年4月11日 星期三

Histogram

部份程式碼:
 for( i = 0 ; i <IH ; i++ )
 {
 ptr = (Byte * )Image1->Picture->Bitmap->ScanLine[i];
  for( j = 0 ; j < IW ; j++ )
  {
   R[ i ][ j ] = ptr[ j * 3 + 2 ];
   G[ i ][ j ] = ptr[ j * 3 + 1 ];
   B[ i ][ j ] = ptr[ j * 3 ];
  } //每個座標將RGB的值分開來存放
  }
-----------------------------
  //以下只有展示處理R...G跟B很類似的方法
  for( i = 0 ; i <IH ; i++ )
 {
  ptr = ( Byte * ) Image2->Picture->Bitmap->ScanLine[i];
  for( j = 0 ; j < IW ; j++ )
  {
   ptr[j * 3 + 2 ] = R[ i ][ j ];
   ptr[j * 3 + 1 ] = 0;
   ptr[j * 3 ] = 0;
  }  //把R的值讀出來並且顯示在Image2
 }
-----------------------------
 for( i = 0 ; i < IH ; i++ )
 {
  for( j = 0 ; j < IW ; j++ )
  {
   TR = R[i][j];
   RH[ TR ]++;   TG = G[i][j];
   GH[ TG ]++;   TB = B[i][j];
   BH[ TB ]++;
   }
  }   //上述程式紀錄RGB 0~255每個值各有幾點

 for(i=0;i<256;i++)
 {
  if (Rmax<RH[i])
  {
   Rmax=RH[i]; //如果Rmax小於RH[i],Rmax=RH[i]
  } } //G跟B略

 for (i=0;i<255;i++)  //假設x為該畫幾點
 {
  x = (RH[i]*IH) / Rmax;
  TempR[i]=x;
  Image5->Canvas->MoveTo(i*2,IH);
  Image5->Canvas->LineTo(i*2,IH-x);
 }
----------------------
如果只是取出RGB值跟畫出基礎的Histogram,以上的程式碼已經足夠。我後面的程式碼雖然可以往上畫,但是卻沒有辦法縮短Histogram,因此暫時省略。

其他更高級的功能都還沒有生出來@__@
目前還卡在怎麼把長度縮短。

2007年3月28日 星期三

Week4筆記

Image?->Picture->Bitmap->PixelFormat=pf24bit;
(可以預防讀圖時出現問題)

Image?->Picture->Bitmap->Width=ImageWidth;
Image?->Picture->Bitmap->Height=ImageHeight;
↑要指定Bitmap大小,使用ScanLine才不會出錯

2007年3月21日 星期三

Week3 ScanLine

本週的課題是寫出一個類似PhotoImpact仿製功能

呃,因為我在動態配置空間方面還頗弱的
加上資料結構不學好.....

在ScanLine的部份,呈現被ScanLine玩弄的狀態orz
是有一些想法,但是光是在圖片讀取就卡住,
所以有點打算改用Pixels或是Rect來寫這個程式。

等到有新進展後會繼續修改這篇文章~

2007年3月14日 星期三

Week2@2007.03.08

暨倉庫番問答之後,本週的課題是變臉
黃老師教我們使用PhotoImpact11將兩位(以上)同學的臉互相更換。這個課題一共用到了下列功能:
1.套索
2.柔邊
3.放大放小
4.水平翻轉
5.選轉N度
6.亮度增減


根據上面用到個功能,老師出了四個程式讓同學當回家作業....
1.水平翻轉(我想順便來個垂直)
2.套索
3.大小
4.旋轉

post這篇blog的當下,是完成了水平(垂直)翻轉的功能

[程式解釋]
1.設定存取資料用的陣列
int temp[800][800][3]; //圖片最大可存到800*800
2.讀取資料存進陣列中
int i,j;
for ( i=0 ; i<>Width ; i++)
{
for( j=0 ; j<>Height ; j++)
{
temp[i][j][0]=GetRValue(Image1->Canvas->Pixels[i][j]);//該Pixel的R
temp[i][j][1]=GetGValue(Image1->Canvas->Pixels[i][j]);//G
temp[i][j][2]=GetBValue(Image1->Canvas->Pixels[i][j]);//B
}
}
3.翻轉時的程式
---[水平翻轉]---
x=Image1->Width; //x取Image的寬
y=Image1->Height;//取長
for ( i=0 ; iWidth ; i++)
{
for( j=0 ; j<>Height ; j++)
{
Image1->Canvas->Pixels[i][j]=(TColor)RGB(temp[x-i][j][0],temp[x-i][j][1],temp[x-i][j][2]);
} //這邊是水平翻轉
}
---[垂直翻轉]---
x=Image1->Width;
y=Image1->Height;
for ( i=0 ; iWidth ; i++)
{
for( j=0 ; j<>Height ; j++)
{
Image1->Canvas->Pixels[i][j]=(TColor)RGB(temp[i][y-j][0],temp[i][y-j][1],temp[i][y-j][2]);
}
}

------------------------------------------------------------------
以下是[放大縮小]。
int x,y;
float score,si;
x=Image1->Width; //取出原圖大小
y=Image1->Height;
score = ScrollBar1->Position; //用ScrollBar控制縮放
si= ( (score-10)/10 )+1; //最大放大到兩倍,最小縮小到0.1倍
Edit1->Text = si;
Image2->Width= si*x; //讓放大縮小的圖再另一張Image顯示
Image2->Height= si*y;
//以下是放大的程式
TRect ResizeRect;
ResizeRect = TRect(0,0,si*x,si*y);
Image2->Canvas->StretchDraw(ResizeRect, Image1->Picture->Bitmap);

2007年3月5日 星期一

倉庫番鍵盤改寫

本週的作業是把佳玉已經設定好的倉庫番,移動方式從滑鼠控制改成鍵盤亦可操控。

從課本6-2的內容可以發現,其實鍵盤的每個按鈕都有一個特定的代碼,
我使用的是Form1的OnKeyDown,
if (Key == 37) {Copy原本放在←的程式} //不敢亂動程式,怕之後出錯。
if (Key == 38) {Copy原本放在↑的程式}
if (Key == 39) {Copy原本放在→的程式}
if (Key == 40) {Copy原本放在↓的程式}

做到這步後,卻發現一個大問題!!
因為BCB按鈕太貼心了!!設計了可以用Tab移動or用方向鍵選擇按鈕的功能,
導致沒辦法直接使用鍵盤操控貓咪的移動。

在這個階段時,我先把所有按鈕都Enabled(讓按鈕不能使用),
確認可以使用鍵盤操控後才繼續進行下個步驟。

因為總是會用到按鈕(Restart&Game Rule),
=>我不能把按鈕功能全部移除,得想個辦法讓按鈕的Tab功能失效。

我嘗試過TabStop的設定,但是似乎不能用鍵盤讓TabStop。

最後=>根據老師的建議,以及一些想法....
我嘗試讓按鈕在OnMouseMove時Enabled才等於true的狀態,
//↑其實這個有點沒意義
接著在按鈕有關的程式內的最後一行全部加上ButtonX->Enabled=false;
後來終於成功了~~

結論:原來應該直接設定Enabled,而不是在TabStop上打轉

2007年3月1日 星期四

Test

這個Blog是為了互動媒體的課程所設立的...新版的blogger似乎有點不太穩...

Information Hiding Class 請前往
http://ihc-bleach.blogspot.com/