表删除包括表的定义和关联对象(规则、索引、约、触发器、主键,等)。很明显,一旦表被删除,那么表中包含的所有的数据行都会被一同删除。
截断truncate < table >命令则仅仅删除了表中所有的数据行。表的结构和所有的索引仍然继续存在,直到你输入删除表的命令(如上所述)。绑定到列上的规则、默认值、约束仍然继续绑定,并且触发器也仍然起作用。
截断表命令还会回收所有索引的分配页。
截断表的执行速度与不带where子句的delete(删除)命令相同,甚至比它还要快。delete(删除) 一次删除一行数据,并且将每一行被删除的数据都作为一个事务记录日志;而truncate (截断)表则回收整个数据页,只记录很少的日志项。delete(删除)和truncate(截断)都会回收被数据占用的空间,以及相关的索引。只有表的拥有者可以截断表。
2. oracle 序列相关问题
http://zhidao.baidu.com/question/81767491.html?si=2
主要是通过veryCD版本的emule的学习来研究p2p
1. 用vs2008 编译emule工程
理解emule的全局运作流程 (20090504 一直无法用2008编译完成,只好使用推荐的vs2003 完成编译)
2. kademlia网络部分研究
- kad网络的生成
- kad结点之间的计算
- kad网络中文件的存储
- contact-tree研究
- kademlia协议
3. nat穿透研究
- nat类型
- nat穿透协议分析
4. emule协议研究
5. emule配置文件研究
6. emule辅助部分研究自动更新
- crashreporter upnp支持
- 资源dll封装: 国旗dll,语言dll
- ip过滤
- 查找信息文字过滤
- zlib压缩库
- Crypto++加密库
- cximage库
- id3lib库
- webserver部分
- ICS/ICF研究
1. 在项目属性中添加GDI+静态链接库
右键项目 点属性,打开项目属性对话框,展开【配置属性】,选择【链接器】下的【输入】,然后在【附加依赖项】中添加"gdiplus.lib",注意要给所有要用的模式都加上(左上角)。
2. 添加头文件
#include<> #include<> 其中afxdtctl.h一般在afxstd.h中包含,需要把#include<>放在其后,重要
3. 使用命名空间
using namespace Gdiplus;
4. 使用GDI+之前,还要记得的初始化
GdiplusStartupInput m_GdiplusStartupInput;
ULONG_PTR m_GdiplusToken;
GdiplusStartup(&m_GdiplusToken, &m_GdiplusStartupInput, NULL);
5. 用完了释放GDI+
GdiplusShutdown(m_GdiplusToken);
关于无法使用new 来创建bitmap或者image对象
解决方法如下:
查询msdn后,发现这是 GDI+的bug,需要改写一个头文件,微软msdn上有下载,http://support.microsoft.com/kb/317799/zh-cn
- 方法一 在PreCreateWindow中更改:
在View::PreCreateWindow(CREATESTRUCT& cs)中加入:HBRUSH hbkbrush=CreateSolidBrush(RGB(192,192,192));//创建灰色背景刷
LPCSTR lpMyOwnClass=AfxRegisterWndClass(CS_HREDRAWCS_VREDRAWCS_OWNDC,0,hbkbrush);//注册新类
cs.lpszClass=lpMyOwnClass;//修改缺省的类风格 - 方法二 在消息处理函数OnEraseBkgnd中贴bmp位图作为背景色
// TODO: Add your message handler code here and/or call default
CBitmap bmInvader;
bmInvader.LoadBitmap(IDB_BITMAP1);
CBrush brInvader(&bmInvader);
CRect rcClient;
GetClientRect(&rcClient);
pDC->FillRect(&rcClient,&brInvader);
return true;
// return CView::OnEraseBkgnd(pDC); - 方法三 在运行时使用SetClassLong更改
static CBrush brush(RGB(255,0,255));
SetClassLong(this->m_hWnd,GCL_HBRBACKGROUND,(LONG)(HBRUSH)brush);
错误 80048820:无法登录 Windows Live Messenger
由于 Internet 连接、防火墙 (旨在帮助保护计算机免受未经授权的外部访问的一项安全功能。它可以是硬件、软件或两者的组合。) 、日期和时间设置、代理设置、安全设置或 SSL 安全出现问题而无法登录。服务器可能暂时不可用。
但事实上时因为教育网无法登陆一个页面造成的,这个页面在你更改了某个设置的时候就会登陆,具体哪个设置我也不知道,反正每次改了一些设置 msn就开始莫名其妙登陆不了了.
在system32/drivers/etc/host 里面增加
127.0.0.1 crl.microsoft.com
立刻就能上了 呵呵
如果是live message 则在添加删除程序里 删掉live登陆助手
我的记性很不好,自从和老婆在一起后,仿佛都忘了以前一个人是咋样无聊的度过了这么多年,但有些事情却记得很清楚,现在回到外婆家,总是下意思的往门槛边上看一眼,然后傻傻的一笑,连外公都不在了,岁月无痕,却偏偏刻在了我这健忘的木头上。
岁月就像那一圈一圈刻下的年轮,在不知不觉之间在两个人的心上烙下了幸福的回忆,下午老婆靠在我怀里,一起看《机器人瓦力》,我突然冒出来一句:“老婆,要一辈子做我的小猫咪哦!” 老婆点了点头:)然后我满足的紧了紧怀抱。好像回到了童年里,在一个人的下午,总是期盼着可以捉到她。
如今午后的阳光也是一样的温暖,我们不知不觉的就快走遍了学校的角角落落,综体门前的长凳载着我们的书声笑语,近春园里发现孔雀的惊喜,天文台下崇拜的惊叹,仿佛每一件最最普通的事情,在和你一起的时候都变的如此的神秘而有趣,清晰的留在每个午后的阳光里。
在应用程序类的InitInstance函数中,有这么两句:
// 分析标准外壳命令、DDE、打开文件操作的命令行
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
//添加下面这句话,即可
cmdInfo.m_nShellCommand = CCommandLineInfo::FileNothing;
后续待添加:)
每个应用程序都有自己的调色板,使用调色板时要先向系统申请,调色板分为前台调色板和后台调色板,windows为优先级高的程序分配前台调色板.我们经常会发现当启动一个大一点的程序时,桌面和其他应用程序的颜色变得粗糙起来,就是因为其他应用程序的调色板正在转为后台调色板.
Windows系统内部保留了一个20种颜色的调色板,用来显示窗口,菜单等通用界面每个设备上下文都拥有一个逻辑调色板,如果要使用内部系统调色板(20种颜色)之外的颜色,则应该创建一个新的逻辑调色板并将其选入到设备上下文中.再把设备上下文中的逻辑调色板实现到系统调色板中,新的颜色才能实现.
在逻辑调色板被实现到系统调色板时,Windows会建立一个调色板映射表,当设备上下文用逻辑调色板中的颜色绘图时,GDI绘图函数会查询调色板映射表以把像素值从逻辑调色板的索引转换成系统调色板的索引.
创建调色板BOOL CreatePalette(LPLOGPALETTE lpLogPalette );
其中lpLogPalette是一个指向LOGPALETTE 结构的指针
typedef struct tagLOGPALETTE {
WORD palVersion; //windows版本号,一般是0x300
WORD palNumEntries; //调色板中颜色表项的数目
PALETTEENTRY palPalEntry[1]; //每个表项的颜色和使用方法
} LOGPALETTE;
typedef struct tagPALETTEENTRY {
BYTE peRed; //红(0-255)
BYTE peGreen;// 绿
BYTE peBlue; //蓝
BYTE peFlags; //一般为0
} PALETTEENTRY;
上面只是建立了一个逻辑调色板,而逻辑调色板只是一张孤立的颜色表,并不能对系统产生影响,所以要使用调色板还需要下面这些函数CPalette* SelectPalette(CPalette* pPalette,BOOL bForceBackground );
这个函数用来将一个调色板载入设备上下文,第一个参数是一个调色板指针,第二个参数用来指定调色板作为前景色还是背景色使用,为TURE时,作为背景色使用,为FALSE时,当窗口是活动窗口或活动窗口的子窗口是,调色板将做为前景色使用,否则做为背景色来使用.如果使用调色板的是一个内存设备上下文,则该参数被忽略.UINT RealizePalette( );该函数把设备上下文中的逻辑调色板实现到系统调色板中, 函数的返回值表明调色板映射表中有多少项被改变了
这两个函数的使用如下:
CPalette *pOldPalette ;
CWindowDC dc(this) ;
pOldPalette=dc.SelectPalette(&pal, FALSE) ;
dc.RealizePalette() ;
dc.SelectPalette(pOldPalette, FALSE) ;
如果某一个窗口要显示特殊的颜色,那么一般应该在处理WM_PAINT消息时实现自己的逻辑调色板,也就是说,在OnPaint或OnDraw函数中重绘以前,要调用SelectPalette和RealizePalette,如果窗口显示的颜色比较重要,则要在调用SelectPalette时指定bForceBackground参数为FALSE.
创建调色板的一般步骤:
1 建立一个LOGPALETTE结构和PALETTEENTRY数组
2 对PALETTEENTRY数组进行赋值,即创建调色板颜色表
3 建立CPalette对象并使用CreatePalette函数初始化调色板对象
4 使用SelectPalette函数将设备描述表和调色板联系起来
5 使用CDC中的RealizePalette函数使调色板生效
为了协调各个窗口对系统调色板的使用,Windows在必要的时候会向顶层窗口和重绘窗口发送消息WM_QUERYNEWPALETTE和WM_PALETTECHANGED.当某一顶层或重叠窗口被激活时,会收到WM_QUERYNEWPALETTE消息,在窗口的创建之处也会收到该消息,该消息先于WM_PAINT消息到达窗口,如果活动窗口要使用特殊的颜色,则在收到该消息时应该实现自己的逻辑调色板并重绘窗口.
http://hi.baidu.com/liuhuishan/blog/item/245c774ef477ff01b3de0524.html
滑动条控制(Slider Control)也叫轨道条控制,其主要是用一个带有轨道和滑标的小窗口以及窗口上的刻度,来让用户选择一个离散数据或一个连续的数值区间。通过鼠标或键盘来进行数据的选择操作,这在WIN98/95中的很多应用程序中都可以看到,如控制面板中的鼠标等,滑动条既可以是水平方式的也可以是垂直方式的。滑动条控制的风格如下:
TBS_HORZ 滑动条是水平方向的 TBS_VERT 滑动条是垂直方向的
TBS_LEFT 滑动条位于窗口左侧 TBS_RIGHT 滑动条位于窗口右侧
TBS_TOP 滑动条位于窗口顶部 TBS_BOTTOM 滑动条位于窗口底部
TBS_BOTH 滑动条位于窗口两侧 TBS_AUTOTICKS滑动条具有刻度,默认
TBS_NOTICKS 滑动条不具有刻度
滑动条的刻度条在每一个数值位置显示一个刻度标记,如果在滑动条上显示某一数值选择区间,则应使用风格TBS_ENABLESELRANGE,此时选择区间两个不再是刻度标记,而是一个小的三角形符号。另外,使用风格TBS_NOTHUMB会使滑标消隐起来。
滑动条控制在MFC类库中被封装为CSliderCtrl控制,其主要操作是设置刻度范围、绘制刻度标记、设置选择范围和当前滑标位置等。当用户进行交互操作时,滑动条控制将向其父窗口发送消息WM_HSCROLL,所以在应用程序中应重载父窗口的OnHScroll()成员函数,以便对消息进行正确处理系统发送的通知代码、滑标位置和指向CSliderCtrl对象的指针等。由于考虑到和水平卷动杆公用同一个成员函数,OnHScroll()函数参数表中的指针变量被定义为CScrollBar*类型,由于实际上消息是由滑动条产生的,所以在程序中必须把这个指针变量强制转换为CSliderCtrl*类型。滑动条和卷动杆的消息代码和含义都非常类似如TB_BOTTOM等,所以这种处理方法比较合理。SetRange()函数用来设置范围,SetPos()函数用来设置当前位置。
(二)滑动条控制的对象结构
滑动条控制的建立方法
CsliderCtrl &SliderCtrl 建立滑动条控制对象结构;Create 建立滑动条控制对象并绑定对象
滑动条控制类CSliderCtrl::Create的调用格式如下:
BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );
其中参数dwStyle用来确定滑动条控制风格;参数rect用来确定滑动条控制的大小和位置;参数pParentWnd用来确定滑动条控制的父窗口指针;参数nID用来确定滑动条控制的控制符ID值。
2、滑动条控制的类属性
滑动条控制对象的类属性包括取得滑动条大小GetLineSize、设置滑动条大小SetLineSize、取得滑动条页大小GetPageSize、设置滑动条页大小SetPageSize、取得滑动条最大位置GetRangeMax、取得滑动条最小位置GetRangeMin、取得滑动条范围GetRange、设置滑块最小位置SetRangeMin、设置滑块最大位置SetRangeMax、设置滑动条范围SetRange、取得滑块当前位置GetSelection、设置滑块当前位置SetSelection、取得滑动条当前位置GetPos和设置滑动条当前位置SetPos等。
3、滑动条控制的操作方法
滑动条控制的操作方法包括清除滑动条当前选择ClearSel、验证滑动条当前位置是否在最大最小位置之间VerifyPos和清除当前刻度标志ClearTics。
滑动条控制的应用技巧示例
1、利用应用程序向导AppWizard生成基于对象框的应用程序CSlidDlg;
2、在对话框中设置滑动条控制,其ID为IDC_SLIDER;
3、在对话框初始代码中增加控制的范围和位置:
(1)在SlidDlg.h中设置数据成员,用来表示滑动条的当前值:
//SlidDlg.h
class CSlidDlg:public Cdialog
{ ......//其它代码
public:
int m_nCur;
......//其它代码
}
(2)在SlidDlg.cpp中设置初始状态
BOOL CSlidDlg::OnInitDialog()
{ Cdialog::OnInitDialog();
......//其它代码
//TODO:Add extra initialization here
CSliderCtrl *pSlidCtrl=(CSliderCtrl*)GetDlgItem(IDC_SLLIDER);
pSlidCtrl->SetRange(1,5,TRUE);//设置滑动条范围
pSlidCtrl->SetPos(2);//设置滑动条位置
......//其它代码
return TRUE;
}
(3)完善滑动条的消息处理,利用类向导ClassWizard增加对话框窗口的WM_HSCROLL消息处理函数,并取得滑标所指位置值:
void CSlidDlg::OnHScroll(UINT nSBCode,UINT nPos,CScrollBar *pScrollBar)
{ //TODO:Add your message handler?
Cdialog::OnHScroll(nSBCode,nPos,pScrollBar);
CSliderCtrl *pSlidCtrl=(CSliderCtrl*)GetDlgItem(IDC_SLLIDER);
m_nCur=pSlidCtrl->GetPos();//取得当前位置值
}
本地调试运行都会出现这样的问题,即使是想方设法的把浏览器的安全级别降下来了,也不行的,很麻烦。每次调试java程序都要点一下允许,浏览器实在太傻了。。。
按如下修改ie的设置就不会弹出了
把ie设置->高级->安全 中的“允许活动内容在我的计算机上的文件中运行”这一项打上钩就行了
附:如何修改ie的默认安全等级
很多朋友发现在安装SP2后,我们在修改IE的安全设置低于其默认设置时,系统会提示“无法修改……”的错误,这是由于SP2对用户设置较低的安全级别有所限制。不过这样可能会让我们在访问某些站点的时候失败,我们可以用如下方法修改其默认安全级别:运行 “Regedit”命令打开注册表编辑器,依次定位到“[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\3]”,在窗口右边将“MinLevel”修改为“10000”(十六进制),这样大家就可以设置更低的安全级别了。
先学java吧,想做背单词的网站只能从java着手
看完图书馆借的 java程序设计教程
这学期的课程还是压力蛮大的,愁啊,啥时候可以去实习
CFileDialog dlg(TRUE,
"rtf",
"*.rtf",
OFN_HIDEREADONLY OFN_OVERWRITEPROMPT,
"*.rtf",
this);
dlg.m_ofn.lpstrTitle="请选择文本文件";
char szCurDir[255];
GetCurrentDirectory(255,szCurDir);
dlg.m_ofn.lpstrInitialDir=CString(szCurDir);
if(IDOK!=dlg.DoModal())
return FALSE;
如果用系统的重载,可以省掉写这写代码,而且重载的打开对话框的功能和windows一模一样,比较健全。
但是扩展名匹配就比较麻烦,以前只知道要在向导中填好。
那么万一忘了呢?
还可以这样修改
修改字符串资源
IDR_MAINFRAME为
myTitle\n\n新文件\nmyFile文件 (*.txt)\n.txt\nmyFileID\nDoc Document
关键是中间带.txt的两部分
恩 这个就很方便了:) MFC就是适合傻瓜化操作
关于IDR_MAINFRAME的详细定义可以查看
浩瀚的知识海洋,渺小的我们穷尽一生也只能取其一粟;但是正是这些千千万万的渺小,才能汇积成沧海。我总是羡慕于巅峰的秀丽,在惊叹中梦呓、自卑,却忘了这最基本的道理。不要再被形形色色的名目牵着走,一步一步来吧,人所能成就的,其实始终在自己的脚下,在滴答声中前行或溜走,或者弯弯曲曲的始终走不直。
千里之行,始于足下。
本周及下周任务
到下周六之前,继续完善图像编辑软件。
学习oracle的 sql语法和函数
多媒体编程
实验一 报告 2008212519_王俊华
多媒体编程实验一报告
实验过程
分析bmp文件格式
,格式见附录一
以最精简最实用的结构定义CBmp类,将作业中所需的操作封装到该类
实现文档/视图结构
在实验中记录遇到的问题
程序框架
文档/视图结构
CBmp类封装了对Bmp文件的读操作和显示,以及将当前取得的RGB值转化为亮度值
详细结构如图一
图一
CBmpViewerDoc 中添加
CBmp *bmp 成员,作为载入的位图对象存储,实现如下两个成员函数:
菜单
作业->信息头分析
OnToText(); //解析bmp文件头信息,并写入文本
菜单
作业->RGB转成YUV
OnToYUV(); //按bmp图片像素阵列输出亮度值到文本
CBmpViewerview
中修改OnDraw()
函数,以显示bmp图片;
CBmpViewerview
中修改OnInitialUpdate()
函数,以实现滚屏视图;
软件操作方法
显示
通过文件->打开
bmp图片即可
读取头文件
菜单 作业->信息头分析
然后在打开的文件夹里
选择合适的txt文本
或者直接新建
按bmp图片像素阵列输出亮度值到文本
菜单 作业->RGB转成YUV
实验中遇到的问题及相关解决方法
CString的格式化输出
%c 单个字符
%d 十进制整数
%f 十进制浮点数
%o 八进制数
%s 字符串
%u 无符号十进制数
%x 十六进制数
%% 输出百分号%
一个格式说明可以带有几个修饰符,用来指定显示宽度,小数尾数及左对齐等:
- 左对齐
+ 在一个带符号数前加'+'或'-'号
域宽用前导零来填充,而不是用空白符
域宽是一个整数,设置了打印一个格式化字符串的最小域。精度使用小数点后加数字表示的,给出每个转换说明符所要输出的字符个数。
注意:带修饰符的显示可能不正常。
数据格式说明由“%”开头,形式为
%<数据输出宽度说明><格式符>,数据格式说明用在需要输出变量或运算数值结果的时候,它的个数与输出表列的个数一一对应。
数据宽度说明中如果实际数据小于宽度,则根据宽度是否大于零而左补空格或右补空格。如果实际数据大于宽度,按实际位数输出。如果缺省宽度说明,则按实际宽度输出。
CString.format('%10f',
a);
10表示把a以10个字符宽度格式化
%f形式输出,则小数部分为6位;
例
%10f
若a的整数部分位数+小数点(1位)+小数部分位数大于等于10,则按实际a的形式格式化;
若a的整数部分位数+小数点(1位)+小数部分位数小于10,则在前面补空格,补足10位;
例
%.7f 则
a的小数部分位数若大于7,则截取7位小数,整数部分不变;
a的小数部分位数若小于等于7,则不满7位的部分后面以0补足;
str.Format(_T('Left-justified
integer: %.6d\n'), b);
%.6d
若整数b不满6位则在最高为前面补0;
若整数b大于等于6位则形式不变;
%6d
若整数b不满6位,则在最高位前面补上空格,是之格式化为6个字符宽度;
若整数b大于等于6位则形式不变。
CFile 遇到的文件读写错误和指针定位
CFile定义的文件,在读写操作结束的时候一定要close(),否则会造成文件共享错误;
文件读写是从类型或者结构的末端开始的。
CFile->Read()
读取文件结束后,指针就停留在结构末端,下一次读取的时候不用调用seek
重新定位文件指针。
指针转换的学习
ptrHeader
= (BITMAPFILEHEADER*) bmPtr;
ptrInfo
= (BITMAPINFO*) &bmPtr[sizeof(BITMAPFILEHEADER)];
ptrBits
= &bmPtr[ptrHeader->bfOffBits];
指针可以根据结构的长度
自动截断原指针所指向结构的长度
可以方便的把某个指针的一部分快速的赋给另一个指针
Dib位图显示
int
StretchDIBits(
HDC
hdc, // handle to DC
int
XDest, // x-coord of destination upper-left corner
int
YDest, // y-coord of destination upper-left corner
int
nDestWidth, // width of destination rectangle
int
nDestHeight, // height of destination rectangle
int
XSrc, // x-coord of source upper-left corner
int
YSrc, // y-coord of source upper-left corner
int
nSrcWidth, // width of source rectangle
int
nSrcHeight, // height of source rectangle
CONST
VOID *lpBits, // bitmap bits
CONST
BITMAPINFO *lpBitsInfo, // bitmap data
UINT
iUsage, // usage options
DWORD
dwRop // raster operation code
);
int
SetDIBitsToDevice(
HDC
hdc, // handle to DC
int
XDest, // x-coord of destination upper-left corner
int
YDest, // y-coord of destination upper-left corner
DWORD
dwWidth, // source rectangle width
DWORD
dwHeight, // source rectangle height
int
XSrc, // x-coord of source lower-left corner
int
YSrc, // y-coord of source lower-left corner
UINT
uStartScan, // first scan line in array
UINT
cScanLines, // number of scan lines
CONST
VOID *lpvBits, // array of DIB bits
CONST
BITMAPINFO *lpbmi, // bitmap information
UINT
fuColorUse // RGB or palette indexes
);
调色板的创建
调色板的存在到底有什么用处,还不是很清楚,只是猜测可能每次在dc上画图,用逻辑调色板修改系统调色板,可以将系统调色板缺少的颜色都补上,使得图片显色的时候保真。
调色板是通过logPalette创建的。把代码贴在这里,以防遗忘……
附录一
位图文件分为四部分:
(1)位图文件头BITMAPFILEHEADER
位图文件头BITMAPFILEHEADER是一个结构体,长度为14字节,定义为:
typedef struct
tagBITMAPFILEHEADER
{
WORD
bfType; //文件类型,必须是0x424D,即字符串"BM"
DWORD
bfSize; //文件大小,包括BITMAPFILEHEADER的14个字节
WORD
bfReserved1; //保留字
WORD
bfReserved2; //保留字
DWORD
bfOffBits; //从文件头到实际的位图数据的偏移字节数
} BITMAPFILEHEADER;
(2)位图信息头BITMAPINFOHEADER
位图信息头BITMAPINFOHEADER也是一个结构体,长度为40字节,定义为:
typedef struct
tagBITMAPINFOHEADER
{
DWORD
biSize; //本结构的长度,为40
LONG
biWidth; //图象的宽度,单位是象素
LONG
biHeight; //图象的高度,单位是象素
WORD
biPlanes; //必须是1
WORD
biBitCount;
//表示颜色时要用到的位数,1(单色),
4(16色),
8(256色),
24(真彩色)
DWORD
biCompression;
//指定位图是否压缩,有效的值为BI_RGB,BI_RLE8,BI_RLE4,BI_BITFIELDS等,BI_RGB表示不压缩
DWORD
biSizeImage;
//实际的位图数据占用的字节数,即
biSizeImage=biWidth’ ×
biHeight,biWidth’是biWidth
按照4的整倍数调整后的结果
LONG
biXPelsPerMeter; //目标设备的水平分辨率,单位是每米的象素个数
LONG
biYPelsPerMeter; //目标设备的垂直分辨率,单位是每米的象素个数
DWORD
biClrUsed; //位图实际用到的颜色数,0表示颜色数为2biBitCount
DWORD
biClrImportant; //位图中重要的颜色数,0表示所有颜色都重要
} BITMAPINFOHEADER;
(3)调色板Palette
调色板Palette针对的是需要调色板的位图,即单色、16色和256色位图。对于不以调色板方式存储的位图,则无此项信息。调色板是一个数组,共有biClrUsed个元素(如果该值为0,则有2biBitCount个元素)。数组中每个元素是一个RGBQUAD结构体,长度为4个字节,定义为:
typedef struct
tagRGBQUAD
{
BYTE
rgbBlue; //蓝色分量
BYTE
rgbGreen; //绿色分量
BYTE
rgbRed; //红色分量
BYTE
rgbReserved; //保留值
} RGBQUAD;
(4)实际的位图数据ImageDate
对于用到调色板的位图,实际的图象数据ImageDate为该象素的颜色在调色板中的索引值;对于真彩色图,图象数据则为实际的R、G、B值:
a.单色位图:用1bit就可以表示象素的颜色索引值;
b.16色位图:用4bit可以表示象素的颜色索引值;
c.
256色位图:1个字节表示1个象素的颜色索引值;
d.真彩色:3个字节表示1个象素的颜色R,G,B值。
此外,位图数据每一行的字节数必须为4的整倍数,如果不是,则需要补齐。奇怪的是,位图文件中的数据是从下到上(而不是从上到下)、从左到右方式存储的。
详细位移结构见表01
表01
位图文件结构内容摘要
| 偏移量 | 域的名称 | 大小 | 内容 |
| 0000h | 文件标识 | 2 |
|
| 0002h | File | 1 | 用字节表示的整个文件的大小 |
| 0006h | Reserved | 1 | 保留,必须设置为0 |
| 000Ah | Bitmap | 1 | 从文件开始到位图数据开始之间的数据(bitmap |
| 000Eh | Bitmap | 1 |
|
| 0012h | Width | 1 | 位图的宽度,以象素为单位 |
| 0016h | Height | 1 | 位图的高度,以象素为单位 |
| 001Ah | Planes | 1 | 位图的位面数(注:该值将总是1) |
| 001Ch | Bits | 1 |
|
| 001Eh | Compression | 1 |
|
| 0022h | Bitmap | 1 | 用字节数表示的位图数据的大小。该数必须是4的倍数 |
| 0026h | HResolution | 1 | 用象素/米表示的水平分辨率 |
| 002Ah | VResolution | 1 | 用象素/米表示的垂直分辨率 |
| 002Eh | Colors | 1 | 位图使用的颜色数。如8-比特/象素表示为100h或者 |
| 0032h | Important | 1 | 指定重要的颜色数。当该域的值等于颜色数时(或者等于0时),表示所有颜色都一样重要 |
调色板数据 | 根据BMP版本的不同而不同 | Palette | N |
|
图象数据 | 根据BMP版本及调色板尺寸的不同而不同 | Bitmap | xxx | 该域的大小取决于压缩方法及图像的尺寸和图像的位深度,它包含所有的位图数据字节,这些数据可能是彩色调色板的索引号,也可能是实际的RGB值,这将根据图像信息头中的位深度值来决定。 |
~
1
~
没有她,不论身后跟着多少人,他都只能感受到一个人默默地在跑,跑过时间,跑过等待。
死,并不可怕,真正可怕的是没有真正爱过就死了··· 出自电影<<安娜·卡列尼娜>>
