天天看點

C語言讀取和顯示BMP檔案

在TC2.0下,隸屬于16位子系統,是以int是2位元組,long是4位元組,char是1位元組。繪圖系統模式是VGA,顔色當然也很有限,是以讀取bmp像素後需要把像素顔色轉換為“最近”的已有VGA顔色。用int GetColor(int r,int g,int b)實作傳回一個顔色值(color code)。用putpixel(int x,int y,int color)繪制一個像素。

      下圖是幾種在.NET Framework中的已知顔色和其RGB值(下圖當然也是使用代碼繪制的,代碼略)。

C語言讀取和顯示BMP檔案

      16種顔色是位于RGB立方體中的16個點,相當于尋找一個最接近指定顔色的點。為了簡化計算,計算出兩點距離的平方即可。

      為了加快搜尋,我們可以用下面的類似繪制“金剛石”的代碼提前求出最短距離的平方,這個資料将應用到GetColor函數中。原因是我們已知最近的兩個顔色點的距離,如果某點與某顔色的距離小于最短距離的一半,則此顔色就是我們要找的結果。

C語言讀取和顯示BMP檔案
C語言讀取和顯示BMP檔案

Compute Minimum Dist^2 Code

int COLORS[16][3]={

C語言讀取和顯示BMP檔案
C語言讀取和顯示BMP檔案
C語言讀取和顯示BMP檔案
C語言讀取和顯示BMP檔案

.};

/* i,j - color index */

/* ret - distance^2 */

long GetDist(int i,int j)

{

        long dist=0;

        dist+=(COLORS[i][0]-COLORS[j][0])*(COLORS[i][0]-COLORS[j][0]);

        dist+=(COLORS[i][1]-COLORS[j][1])*(COLORS[i][1]-COLORS[j][1]);

        dist+=(COLORS[i][2]-COLORS[j][2])*(COLORS[i][2]-COLORS[j][2]);

        return dist;

}

void main(void)

        int i, j;

        long dist,mindist=195075;

        for(i=0;i<15;i++)

        {

                for(j=i+1;j<16;j++)

                {

                        dist=GetDist(i,j);

                        if(dist<mindist)

                                mindist=dist;

                }

        }

        printf("mindis^2=%d",mindist);

繼續閱讀