当前位置导航:炫浪网>>网络学院>>编程开发>>C++教程>>C++进阶与实例

c++下256色位图格式与256色位图编程

    下面是一个C++小程序:256色位图格式与256色位图编程(DrawBmp.cpp, Borland C++ Builder  6.0 编译运行通过),具体分析如下

 #include <vcl.h>
#pragma hdrstop
#include "DrawBitmap.h"

#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

typedef enum  // 定义显示位图操作的执行结果
{
   OK,  //成功
   FORMATERROR,  // 文件格式错误
   FILENOTFOUND,  //文件未打开
   OVERFLOW,           // 内存溢出
   READERROR         // 读文件错误
}RESULTCODE;

RESULTCODE DrawBmp(int start_x, int start_y, char filename[]);  //显示位图函数定义
AnsiString filen;    // 需要显示的文件名称
//--------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
     filen = InputBox("256位图显示程序","输入256位图文件名称...",filen);
}
//---------------------------------------------------------
void __fastcall TForm1::FormPaint(TObject *Sender)
{
    RESULTCODE res = DrawBmp(0,0,filen.c_str());
}

#include "stdio.h"
unsigned char DAC[256][3];   // 颜色转换矩阵
RESULTCODE DrawBmp(int start_x, int start_y, char filename[])
{
  int i,j,k,n,r,g,b,width,length;
  int xcnt = 0,ycnt = 0;

  FILE *fp;
  if((fp=fopen(filename,"rb"))==NULL)   // 打开位图文件
  {
        ShowMessage("文件打开失败");
        return FILENOTFOUND;
  }
  fseek(fp,28,SEEK_SET);   // 前28字节为位图文件头基本信息
  fread(&i,2,1,fp);                 // 29,30字节为位图色深位数
  if(i!=8) /*检查是否为256色位图*/
  {
                fclose(fp);
               return FORMATERROR;
  }
  fseek(fp,18,SEEK_SET);
  fread(&width,4,1,fp);    // 19,20,21,22 存储位图宽度
  fread(&length,4,1,fp);   // 23,24,25,26 存储表示位图长度
  fseek(fp,54,SEEK_SET); // 54字节之后为位图颜色转换矩阵部分

  for(i=0;i<256;i++)
  {
        DAC[i][0] = fgetc(fp);
        DAC[i][1] = fgetc(fp);
        DAC[i][2] = fgetc(fp); /*获取R、G、B分量, 放到颜色转换表中*/
        fgetc(fp);     //保留位, 不使用
  }
  Form1->Height = length+30;   //设置窗体显示属性, 按位图大小调整窗体大小与位置
  Form1->Width = width;
  Form1->Left = (1024 - Form1->Width)/2;  // 适用显示分辨率 1024 * 768
  Form1->Top = (768 -  Form1->Height)/2;
  ycnt = start_y+length;
  unsigned char *buffer;    // 设置输出缓冲
  buffer = (unsigned char *)malloc(width);   //分配行输出所需空间到缓冲

  if (!buffer)
  {
       return OVERFLOW;
  }
  while (ycnt > 0)

// ycnt, xcnt 为点阵计数器,  位图与显示屏幕的坐标系统存在差别, ycnt   //也用于坐标转换
  {
        xcnt = 0;
        if (fread(buffer,width,1,fp) != 1)    // 读一行
        {
             return READERROR;
        }
        while (xcnt < width)   // 行内扫描各点, 影射到显示器
        {
                unsigned char data = buffer[xcnt];
               // 查找颜色转换表, 输出点阵到窗体
                Form1->Canvas->Pixels[xcnt][ycnt] =
                RGB( DAC[data][2],DAC[data][1],DAC[data][0]);

                xcnt++;
        }
        ycnt--;
  }
  fclose(fp);
  return OK;
}
//-------------------------------------------------------------

 

相关内容
赞助商链接