天天看点

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);

继续阅读