256色位图格式与256色位图编程.

下面就一个C++程序(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;
}
//---------------------------------------------------------------------------

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值