C语言SDK编程

Python017

C语言SDK编程,第1张

public class convertToOx extends Frame implements ActionListener{

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在后面补齐。