首页 ┆ 网站地图 ┆ 在线留言 ┆ 游戏资讯 ┆ 资源下载 ┆ 端午节祝福 ┆ 迅雷在线影视
设为首页
加入收藏
联系我们
高级搜索
您当前的位置: 主页>C/C++>C++>c++下256色位图格式与256色位图编程
c++下256色位图格式与256色位图编程
来源: 发布时间:2008-09-23 发布人: 浏览: 人次   字体: [ ]  

 下面是一个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;
}
//-------------------------------------------------------------


相 关 文 章   发布商链接
·C++实现对八进制字符串转换为整数的...
·C语言程序设计入门学习六步曲
·C++不是万能的
·实例详细介绍各种字符集编码转换问题...
·C++实现仿Office风格的颜色选取框代...
·在Linux下验证日期是否合法
·祥解C++中的this指针
·vc读取XML文件中的文本代码
·C++程序中内存划分介绍
·C++计算含括号四则表达式的模板
 §最新评论:(评论内容只代表网友观点,与本站立场无关!)
网名: 验证码:  【所有评论】【↑返回顶部
评 分: 12 345
评论内容:(不能超过500字,请自觉遵守互联网相关政策法规。[按 Ctrl+Enter 可直接提交]
注意:请勿在本站发布政治话题、色情及违反法律的内容。
IT知道网 声明:刊登此文章是为了传递更多信息,文章内容仅供参考,转载请注明出处。
推 荐 文 章
·如何在C++中创建持久对象的方
·c++实现获取IE缓存文件夹中的
·C++中regex库中静态正则表达...
·VC++编写交互程序时将打印结...
·实例讲解C++中CopyFileEx函数
·c++获取Windows 2000/XP操作...
·C++语言中多重继承下的虚函数
·什么是单例模式?C++中单例模...
·基于C++的DES加密算法实现代...
·vc命令行调用winrar.exe进行...
·C++计算含括号四则表达式的模
·C++程序中内存划分介绍
·vc读取XML文件中的文本代码
·祥解C++中的this指针
·在Linux下验证日期是否合法
热 门 文 章
·基于C++的DES加密算法实现代...
·实例详细介绍各种字符集编码...
·vc读取XML文件中的文本代码
·祥解C++中的this指针
·vc命令行调用winrar.exe进行...
·C++中regex库中静态正则表达...
·C语言程序设计入门学习六步曲...
·VC++编写交互程序时将打印结...
·C++语言中多重继承下的虚函数...
·实例讲解C++中CopyFileEx函数...
·C++实现RGB和HSL颜色转换代码...
·C++不是万能的
·c++实现获取IE缓存文件夹中的...
·什么是单例模式?C++中单例模...
·谈谈对C和C++中include指令的...
网站首页 - 关于本站 - 加入收藏 - 网站地图 - 友情连接 - 在线留言 - 联系我们 - 返回顶部
Copyright © 2007 IT知道网.[冀ICP备07026896号]. All Rights Reserved .