Label ox //显示结果的标签
TextField input//输入文本框
public convertToOx(){
super("二进制转十进制") //定义窗体的标题
dec=new Label("字符")
input=new TextField(20)
Button convert=new Button("转换") //转换按钮
setLayout(new FlowLayout()) //制定按流式布局排布控件
add(input)
add(convert)
add(ox)
convert.addActionListener(this)
}
public void actionPerformed(ActionEvent e)
{
String s=input.getText()//获取文本框的输入字符串
int x=Integer.parseInt(s,16)//按十六进制分析字符串
ox.setText("结果="+x)//将分析后的十进制结果显示在标签处
}
public static void main(String args[]){
Frame x=new convertToOx()
x.setSize(450,150) //设置窗体大小
x.setVisible(true) //让窗体可见
}
}
BITMAPINFO是BMP文件信息,RGBQUAD是调色板,都定义在wingdi.h。详细可看我以前总结的BMP格式说明:- 位图(BMP)的格式
位图有1位位图(单色)、4位位图(16色)、8位位图(256色)、16位位图()、24位位图(真彩色)、32位位图()。他们都符合同样的结构。
- 总结构
- 文件头 // 1个,14个字节
- 位图信息头 // 1个,40个字节
- 调色板信息 // 可选部分,对于24位位图是没有的
- 数据区
- 文件头
用于描述整个bmp文件的情况。结构如下:
typedef struct tagBITMAPFILEHEADER // 14个字节
{
unsigned short bfType// 一定是"BM",也就是0x4D42,表示这是一个BMP文件
unsigned long bfSize// 整个文件的字节数
unsigned short bfReserved1
unsigned short bfReserved2
unsigned long bfOffBits// 位图的数据区离文件头的偏移量,以字节为单位。该值可能是54(24位,16位555),70(16位565),1078(8位),118(4位),62(1位)
} BITMAPFILEHEADER, *PBITMAPFILEHEADER
- 位图信息头
用于描述整个位图文件的情况。
typedef struct tagBITMAPINFOHEADER // 40个字节
{
unsigned long biSize// 本结构的大小,一定是40
long biWidth// 位图的宽(单位:像素)
long biHeight// 位图的高(单位:像素)
unsigned short biPlanes// 恒为1
unsigned short biBitCount// 位图的位数,可取值为1 4 8 16 24 32
unsigned long biCompression// 16位位图的格式。可取值BI_RGB(0)或BI_BITFIELDS(3)。对于非16位位图,取值BI_RGB;对16位位图,取值BI_RGB表示是555格式;取值BI_BITFIELDS则表示可能是555也可能是565,具体根据掩码判断。
unsigned long biSizeImage// 数据区大小。biSizeImage+bfOffBits==文件大小
long biXPelsPerMeter// 通常为0
long biYPelsPerMeter// 通常为0
unsigned long biClrUsed// 本图像实际使用的颜色数目。为0表示用到颜色数目为2^biBitCount
unsigned long biClrImportant// 本图像中重要颜色的数目。为0表示所有颜色都是重要的
} BITMAPINFOHEADER
- 调色板信息(可选部分)
- 对于24位位图是没有的,对于8位位图则存放调色板,16与32位位图则存放RGB颜色的掩码,这些掩码以DWORD大小来存放。
- 8位:调色板
有1024字节的调色板区。一共有256个调色板元素,每个4字节。
数据区中用8位存储的1个像素,取值范围是0~255,其实存储的就是调色板中index。
一个调色板,4个字节,是1个RGBQUAD结构体,存储的是gbr,正好和颜色的rgb相反。
- 16位的555:
如果biCompression==BI_RGB,没有掩码区。如果biCompression==BI_BITFIELDS,则有16个字节的掩码区。
前3个DWORD,分别是RGB的掩码,后1个DWORD为0.
555格式为:xrrrrrgggggbbbbb。意思是说,1个像素用16位表示,第一位不用,然后连续5位是r,连续5位是g,连续5位是b
用掩码可以判断是否是555。
- 16位的565:16个字节的掩码区
有16个字节的掩码区。
前3个DWORD,分别是RGB的掩码,后1个DWORD为0.
00 f8 00 00 e0 07 00 00 1f 00 00 00 00 00 00 00
R掩码:00 f8 00 00
G掩码:e0 07 00 00
B掩码:1f 00 00 00
565格式为:rrrrrggggggbbbbb。意思是说,1个像素用16位表示,连续5位是r,连续6位是g,连续5位是b
用R或G的掩码,可以判断当前16位是565还是555。例如用R掩码来判断:
R掩码 == f800 == 1111100000000000,头5位是1,表示是565。如果R掩码 == 0111110000000000,则表示是555。
- 数据区
- 按行存储像素。例如一个row*col的数据,首先存储第1行,再存储第2行,...,最后存储第row行
- 而且每行的数据是按4字节对齐的。如果一行的数据不足4字节,则以0在后面补齐。