2007年4月18日 星期三
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,因此暫時省略。
其他更高級的功能都還沒有生出來@__@
目前還卡在怎麼把長度縮短。
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日 星期三
2007年3月21日 星期三
Week3 ScanLine
本週的課題是寫出一個類似PhotoImpact仿製功能
呃,因為我在動態配置空間方面還頗弱的
加上資料結構不學好.....
在ScanLine的部份,呈現被ScanLine玩弄的狀態orz
是有一些想法,但是光是在圖片讀取就卡住,
所以有點打算改用Pixels或是Rect來寫這個程式。
等到有新進展後會繼續修改這篇文章~
呃,因為我在動態配置空間方面還頗弱的
加上資料結構不學好.....
在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);
黃老師教我們使用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 ; 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 ; 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上打轉
從課本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/
Information Hiding Class 請前往
http://ihc-bleach.blogspot.com/
訂閱:
文章 (Atom)