您好,欢迎来电子发烧友网! ,新用户?[免费注册]

您的位置:电子发烧友网>源码下载>C/C++语言编程>

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

大小:28 人气: 2010-08-14 需要积分:0
fdjslkjd的空间

用户级别:注册会员

贡献文章:

贡献资料:

下面就一个C++程序(DrawBmp.cpp, Borland C++ Builder 6.0 编译运行通过)具体分析

 

//---------------------------------------------------------------------------

 

#include

#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) 0%

不好我反对

(1) 100%

256色位图格式与256色位图编程下载

相关电子资料下载

      发表评论

      用户评论
      评价:好评中评差评

      发表评论,获取积分! 请遵守相关规定!