当前位置:七道奇文章资讯编程技术VC/C++编程
日期:2011-03-22 13:54:00  来源:本站整理

<b>256色位图格局与256色位图编程</b>[VC/C++编程]

赞助商链接



  本文“<b>256色位图格局与256色位图编程</b>[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

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

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


  以上是“<b>256色位图格局与256色位图编程</b>[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • <b>hosts是什么 hosts文件在什么位置 若何改正hosts</b>
  • <b>在 Windows 8 中手动安装语言包</b>
  • <b>五个常见 PHP数据库问题</b>
  • Windows中Alt键的12个高效快速的利用本领介绍
  • <b>MySQL ORDER BY 的实现解析</b>
  • <b>详解MySQL存储历程参数有三种范例(in、out、inout)</b>
  • <b>Win8系统恢复出来经典的开始菜单的办法</b>
  • <b>Win8系统花屏怎么办 Win8系统花屏的办理办法</b>
  • <b>Windows 7系统下无线网卡安装</b>
  • <b>为什么 Linux不需求碎片整理</b>
  • <b>Windows 8中删除账户的几种办法(图)</b>
  • <b>教你如安在win7下配置路由器</b>
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .