CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  GAME,图形处理/多媒体

BMP文件的处理!

楼主jtg98g3(跳舞的青蛙)2005-06-02 19:51:22 在 Delphi / GAME,图形处理/多媒体 提问

这是数据结构:  
   
      BITMAPFILEHEADER=tagBITMAPFILEHEADER;  
      tagBITMAPFILEHEADER=RECORD   //BMP文件头结构  
          bfType:word;                 //位图文件类型,必须为BM  
          bfSize:LongWord;         //位图文件大小,以字节为单位  
          bfReserved1:word;       //位图文件保留字,必须为0  
          bfReserved2:word;       //位图文件保留字,必须为0  
          bfOffBits:Longword;   //位图文件的起始位置,以相对于位图文件头的偏移量表示,以字节为单位  
      END;  
      BITMAPINFOHEADER=tagBITMAPINFOHEADER;  
      tagBITMAPINFOHEADER=RECORD       //位图信息头结构  
          biSize:longword;                     //本结构所占用字节数  
          biWidth:longint;                     //位图的宽度,以像素为单位  
          biHeight:longint;                   //位图的高度,以像素为单位  
          biPlanes:word;                         //目标设备的级别,必须为0  
          biBitCount:word;                     //每个像素所需的位数,必须是1(双色),4(16色),8(256色),24(真彩色)之一  
          biCompression:longword;       //   位图压缩类型,必须是0(不压缩),1(BI_RLE8压缩类型)或者2(BI_RLE4压缩类型)之一  
          biSezeImage:longword;           //位图的大小,以字节为单位  
          biXPelsPerMeter:Longword;   //位图水平分辨率,每米像素  
          biYPelsPerMeter:Longword;   //位图垂直分辨率,每米像素  
          biClrUsed:longword;               //位图实际使用的颜色表中的颜色数  
          biClrImportant:longword;     //位图显示过程中重要的颜色数。  
      END;  
      RGBQUAD=tagRGBQUAD;  
      tagRGBQUAD=RECORD           //颜色表结构  
          rgbBlue:Byte;               //蓝色的亮度(0-255)  
          rgbGreen:Byte;             //绿色的亮度(0-255)  
          rgbRed:Byte;                 //红色的亮度(0-255)  
          rgbReserved:Byte;       //保留,必须为0  
      END;  
      TFileHeader=Record  
          Header:BITMAPFILEHEADER;  
          InfoHeader:BITMAPINFOHEADER;  
      End;  
      BmpFileInfo=Record  
          FileHeader:TFileHeader;  
          ColorTable:Array   [0..255]   Of   RGBQUAD;  
          ColorCount:Word;  
          Data:byte;  
      End;  
  var  
      FBMP:   TFBMP;  
      FpHeader:file   of   TFileHeader;//   BITMAPFILEHEADER;  
      FPColorTable:File   Of   RGBQUAD;  
      FPData:File   Of   Byte;  
      BmpFile:BmpFileInfo;  
      BitMapBuffer:Array   [1..800*3,1..600*3]   Of   Byte;  
      ColorTable:Array[1..16777216]   Of   TColor; 问题点数:0、回复次数:3Top

1 楼jtg98g3(跳舞的青蛙)回复于 2005-06-02 19:52:24 得分 0

这是处理代码:  
   
  procedure   TFBMP.Button1Click(Sender:   TObject);  
  Var  
      ColorIndex,ColorCount:Integer;  
      X1,Y1:LongWord;  
  begin  
      If   OPD.Execute   Then  
          Begin  
          assignfile(FpHeader,OPD.FileName);  
          Reset(FpHeader);  
          Read(FpHeader,BMPFile.FileHeader);  
          closeFile(FpHeader);  
          case   BMPFile.FileHeader.InfoHeader.biBitCount   of  
              1:   BMPFile.ColorCount:=2;  
              4:   BMPFile.ColorCount:=16;  
              8:   BMPFile.ColorCount:=256;  
              24:   BMPFile.ColorCount:=0   ;  
          else   ;  
          end;  
          assignfile(FPColorTable,OPD.FileName);  
          Reset(FPColorTable);  
          For   ColorIndex:=0   To   BMPFile.ColorCount-1   Do  
              Begin  
              Read(FPColorTable,BMPFile.ColorTable[colorIndex]);  
              End;//For   ColorIndex=1   To   ColorCountDo  
          closeFile(FPColorTable);  
          AssignFile(FPData,OPD.FileName);  
          Reset(FPData);  
          Seek(FPData,BMPFile.FileHeader.Header.bfOffBits+1);  
          For   Y1:=1   To   BMPFile.FileHeader.InfoHeader.biHeight       Do  
              Begin  
              For   X1:=1   To   BMPFile.FileHeader.InfoHeader.biWidth*(BMPFile.FileHeader.InfoHeader.biBitCount   div   8)   Do  
                  Begin  
                  Application.ProcessMessages;  
                  If   Eof(FPData)   Then  
                      Begin  
                      self.Caption   :='File   End.'+'Form   Width:'+IntToStr(Self.Width)+'   Height:'+IntToStr(Self.Height);  
                      End  
                  Else  
                      Begin  
                      Read(FPData,BitMapBuffer[X1,Y1]);  
                      End;  
                  End;//For   X  
              End;//For   Y  
          For   Y1:=1   To   BMPFile.FileHeader.InfoHeader.biHeight     Do  
              Begin  
              For   X1:=1   To   BMPFile.FileHeader.InfoHeader.biWidth*(BMPFile.FileHeader.InfoHeader.biBitCount   div   8)   Do  
                  Begin  
                  Application.ProcessMessages;  
                  self.SetFocus;  
                  case   BMPFile.FileHeader.InfoHeader.biBitCount   of  
                      8:  
                          Begin  
                          With   BMPFile.ColorTable[BitMapBuffer[X1,BMPFile.FileHeader.InfoHeader.biHeight-Y1+1]]   Do  
                              begin  
                              Self.Canvas.Pixels[X1,Y1]:=RGB(rgbRed,rgbGreen,rgbBlue);  
                              Self.Canvas.Pixels[X1+1,Y1]:=RGB(BMPFile.ColorTable[0].rgbRed,BMPFile.ColorTable[0].rgbGreen,BMPFile.ColorTable[0].rgbBlue);  
                              End;  
                          End;  
                      24:  
                          Begin  
                          If   (X1   Mod   3=0)   Then  
                                Begin  
                                Self.Canvas.Pixels[(X1   div   3),Y1   ]:=RGB(BitMapBuffer[X1-1,BMPFile.FileHeader.InfoHeader.biHeight-Y1+1],BitMapBuffer[X1-2,BMPFile.FileHeader.InfoHeader.biHeight-Y1+1],BitMapBuffer[X1,BMPFile.FileHeader.InfoHeader.biHeight-Y1+1]);  
                                End;  
                          End;  
                  end;  
                  End;//For   X  
              End;//For   Y  
          CloseFile(FPData);  
          End;//If   OPD.Execute   Then  
  end;Top

2 楼jtg98g3(跳舞的青蛙)回复于 2005-06-02 19:55:42 得分 0

是在delphi7.0   ,win2000pro下编程的。  
  结果在处理8位(256色)bmp图像的时候,出现了问题。不能正常显示。颜色偏红色!  
  每个像素的rgb值都跟看图软件上的像素的rgb值不同!  
  请问这是什么问题?是调色板用错了吗?调色板是直接从位图数据中读取到的。听说要用系统的调色板!?请问该怎么用?  
  Top

3 楼jtg98g3(跳舞的青蛙)回复于 2005-06-03 09:46:47 得分 0

斑竹在吗?能帮我个忙,帮我看看吗?在delphi中,如何将bmp的调色板转换成系统的调色板?  
  Top

相关问题

  • bmp 文件处理
  • VC++处理BMP图象文件
  • 求处理bmp文件的原代码.
  • 求处理bmp文件的原代码.
  • BMP文件处理的问题
  • 请教处理BMP图象文件时,遇到16M色的BMP文件如何处理,
  • 急!急!急!关于BMP文件处理的问题(有难度)
  • BMP文件?
  • 谁会8位bmp文件的阀值化处理?恳请帮忙!
  • bmp文件处理,24位真彩色转换成黑白的?急!

关键词

  • 像素
  • 文件
  • 结构
  • word
  • longword
  • fpheader
  • 调色板
  • tfileheader
  • 图
  • bmp

得分解答快速导航

  • 帖主:jtg98g3

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo