是要彩色圖片轉成灰階後取轉換後的128、64、32、16、8、4、2色的值,
還是彩色圖片取128、64、32、16、8、4、2色的值之後再轉成灰階。
因此我寫了這兩部分的程式。
第一部分:
彩色圖片取128、64、32、16、8、4、2色值之後再轉成灰階。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitytENgvxl3aZ2jt9EUE8BTVCszwBrrvycJjjZ13aCS4urdeHsxT4jmVcGwXBj-cTQGkkbNd2y8D5-YLqLUI1T1CwJv1XsddaOzJph_R_Mm9R56G6tW7WF615F8-LfEKpCXlpI6gCYOIc/s320/1.bmp)
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-wJHEk7bOruJQmwr8jrMrHCz5Poms02dgQfE8OiqLcogoi1I8vHhiog8lvZs8jgs8xnSHG5FeL5b7kc9zPZssaVC_6WWd4_QYdoNdZ_loYgwo-YpApJrBHApfRKvC0SeGp32d-ydkNOc/s320/2.bmp)
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4sSvQf7BygTTIpG6lp7ft05syfu2Uek1j54puczVCc3vpBh19esEVUzTiVjdpv19qv69XwnIduKGzJ5rEC1AHFdbHgC8SPfL8EgNPhbjMwWkWMn-CkrxJm1GBcIcxmfu4_8sZPOPt1f0/s320/3.bmp)
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgU0iVrVGhbf_yxs1GpSYvlULM2DKTcjTQMetDLaKLL37GK-SLyZfgemh3SgegmL4C5RRouEhRlpZWB-kwsis7GKRj5xA4LUGVY6HsKS5MgJvSyAhGE-uhEBshEkKgyP6PXTJJ17QOjshw/s320/4.bmp)
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLQ1nsuWWUmTVvzXWjAjhgghwy9vyHnXq2PGWRC5evJ3ATrvbTW2fAo8kgBZYv40JIOHzGtvRX78lGmsTab2MUjUWsjVKnklgCBIqudRYURhf6pTdO0cFWIhrnoEHiX1nZO4EB2ACj_Bc/s320/5.bmp)
第二部分:
彩色圖片轉成灰階後取轉換後的128、64、32、16、8、4、2色的值。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcNC3bLLJT0fHHWqcEYrvPfJCOL-t9QzZI5E-fBj6ZXaOdMZ5zhJ866aMcntF90bFmm2ollZlFnIDvwf5CqHDIVNkpnYVaEX0p0JEhzjVqrcG5RjLUBTPUlcV2wHc48Sy8tN8lRJNMvMM/s320/2.1.bmp)
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgj7NpW_WUQWG_ViH63tk5ybA-k1BKl2QhrZsGR7_KzBICRwYS5mD8oOqhI4ayvERrk0CZ1SF0lW48ggI6lkXtE0HitMOxMX1lsgiPFGEGJNT3BL78yAL1nFS1ffV7RUA8rNM1q0kKa-QI/s320/1.2.bmp)
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdQLND3AgMY3d6GjLC6J782TeewWM3bUCnddzBP624k43WPpbDXwnP9Da3hVTbWzdAf0_ccH6nZ7COh2KwAFeJqdnl9KVB1Qd7Sx8fMGYeyNOBp4bjOxvlniRCAGp4__r96IQIZMrSuAU/s320/1.3.bmp)
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOodri3WXVngvEE74nELE6bfwPDE9l4Kfu2vjmth34PU63o6kDiT7PbHQ2sMk_TRQvLE_YvpXASgYZ9qw9KWP7-T9geda-DIIbcjDJ-7H2UhDjrfnAf1uTZ2hv4gq7gNIPX5VZ0NmZmpg/s320/1.4.bmp)
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYitn6agYhcUy19eCsHOR65M2GZ_3jdR_Qn9FiZPxdGGZyclOcldCDBI3zw8wH5ffjlwcilGvFfi03ipwjvl71QRGdomtBbRoh9hmG2XAbAq0Tdr4yFLd3drsXIJ9hllbOKE1z8bTAyNw/s320/1.5.bmp)
這次的作業我覺得非常容易,不管是第一部分或第二部分,
每個色值的判斷都只要幾行短短的程式結果就出來了。
比較需要思考的地方我認為只有如何取得128、64、32、16、8、4、2色的值,
而我研究出來的數學公式為: ( 256 * n ) / L
n: 所需的顏色數-1
L: 256 / ( n + 1 )
之後只要將計算取得色值的公式,加入程式中並加上判斷設值的轉換範圍,
這樣程式就寫完了。
程式碼如下:
for(i=0; i< iImageWidth; i++)
{
for(j=0; j< iImageHeight; j++)
{
R=GetRValue(Image1->Canvas->Pixels[i][j]); //先將圖片中的RGB個別取出
G=GetGValue(Image1->Canvas->Pixels[i][j]);
B=GetBValue(Image1->Canvas->Pixels[i][j]);
for(k=4,n=0;k<=256,n<=63;k=k+4,n++) //n為顏色數,k為強度
{
if(k-4<= R && R< k)
R=(256*n)/63; //算出該取的顏色數值
if(k-4<=G && G< k)
G=(256*n)/63;
if(k-4<=B && B< k)
B=(256*n)/63;
if(R==256)
R=255;
if(G==256)
G=255;
if(B==256)
B=255;
gray=(0.299*R+0.587*G+0.114*B);
Image64Color->Canvas->Pixels[i][j]=RGB(gray,gray,gray);
}
上面的執行結果是比較簡單的轉換法,
後來我嘗試使用直接去呼叫記憶體中的值去轉換,
但是發生了轉換後的圖改變了原本的彩色圖,
造成色彩混亂,目前這部分還在研究中。
P.S:關於呼叫記憶體發生錯誤的問題,在老師的協助下解決了。
原來只是我那部分寫得太複雜了,導致後來讀圖的時候取影響到了原本的彩色圖片。
之後聽老師上可講解老師的程式,發現我的寫法還是比較複雜,
寫得行數還是太多了,還是可以再更簡短的,這部分的能力還得再加強。
下方為聽完老師講解後修改出來的程式
for (i=0; i<256; i++)
{
pal.peRed = GrayLevel[i/4]; //在調色盤進行顏色的選取
pal.peGreen = GrayLevel[i/4];
pal.peBlue = GrayLevel[i/4];
SetPaletteEntries(GrayHandle,i,1,&pal);
}
imNew->Picture->Bitmap->Palette = GrayHandle;
for (j=0;j
bPtrImage = (Byte *)Image1->Picture->Bitmap->ScanLine[j];
bPtrNewImage = (Byte *)imNew->Picture->Bitmap->ScanLine[j];
for (i=0;i< iImageWidth;i++)
bPtrNewImage [i]=(Byte)(0.299*bPtrImage[i*3+2]+0.587*bPtrImage[i*3+1]+0.114*bPtrImage[i*3]);
}
在執行後,比我之前寫的執行速度還要更快,而且也少了冗長的判斷,
就算判斷其它位元強度也只需要更改GrayLevel[i/4]; 紅色字的數值,
而且閱讀上也更加方便,真的事讓我受益良多,該學的還多的很。
沒有留言:
張貼留言