且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

C语言读取和显示BMP文件

更新时间:2022-05-02 23:48:37

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