ubuntu下codeblocks起步(九)-bmp位图
下面的程序实现了对位图的基本操作,程序的功能很简单,就是将窗体中的内容保存为一个位图。实现此功能的方法有很多,这里用的是最基本的方法,即对该窗体的每个像素点进行处理,获得它们的颜色值并写入到已创建的bmp文件中。
在上一篇中介绍了bmp位图文件的格式,写入位图文件可以大体上分为下面几步:
1、创建空的bmp位图文件;
2、打开此位图文件;
3、写入bmp文件头信息;
4、通过循环写入每个像素点的颜色值;
5、关闭文件。
为了体现这种方法与直接保存图片不文件的不同,程序中还有一个保存图片为位图文件的例子。它与直接处理像素点的程序相比要简单的多。我们知道,bmp文件是windows下的位图文件。如果要在linux下用就要自己定义响应的文件头信息的结构体。在这里,我们将结构体作为类的成员变量定义在头文件中。可以参见上一篇文章来了解相应的结构体。
新建一个wxwidgets的frame工程。
修改窗体的菜单项,添加“位图”和“像素”两个菜单。如下:
头文件修改如下(红色为添加的内容):
/***************************************************************
* Name: OSImageMain.h
* Purpose: Defines Application Frame
* Author: ()
* Created: 2007-10-23
* Copyright: ()
* License:
**************************************************************/
#ifndef OSIMAGEMAIN_H
#define OSIMAGEMAIN_H
//(*Headers(OSImageFrame)
#include <wx/frame.h>
#include <wx/menu.h>
#include <wx/statusbr.h>
//*)
#include <wx/file.h>
#include <wx/bitmap.h>
//bitmap structor
#define BYTE unsigned char
#define DWORD unsigned int
#define LONG int
#define UINT unsigned int
#define WORD unsigned short int
#define LPSTR char*
#define BOOL int
#define FALSE 0
#define TRUE 1
class OSImageFrame: public wxFrame
{
public:
OSImageFrame(wxWindow* parent,wxWindowID id = -1);
virtual ~OSImageFrame();
private:
wxString OFileName;
wxBitmap m_bmp;
wxBitmap bmp ;
int height,width;
private:
// MS-Windows bitmaps' definition:
#pragma pack(push,2)
typedef struct tagBITMAPFILEHEADER
{
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
} BITMAPFILEHEADER;
typedef struct tagBITMAPINFOHEADER
{
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BITMAPINFOHEADER;
typedef struct tagRGBQUAD
{
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
} RGBQUAD;
typedef struct tagBITMAPINFO
{
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[1];
} BITMAPINFO;
#pragma pack(pop) // 还原
private:
RGBQUAD m_BMPRgbQuad;
BITMAPINFOHEADER m_BMPInfoHeader;
BITMAPINFO m_BMPInfo;
BITMAPFILEHEADER m_BMPHeader;
FILE* fp; //定义文件指针
public:
struct MyPixel //颜色结构体
{//注意这些域的类型,
public:
BYTE b; //代表blue
BYTE g; //代表green
BYTE r; //代表red
};
MyPixel c1; //定义了一个象素点的结构
private:
//(*Handlers(OSImageFrame)
void OnQuit(wxCommandEvent& event);
void OnAbout(wxCommandEvent& event);
void OnMenuItem3Selected(wxCommandEvent& event);
void OnPaint(wxPaintEvent& event);
void OnMenuItem6Selected(wxCommandEvent& event);
void OnMenuItem4Selected(wxCommandEvent& event);
void OnMenuItem5Selected(wxCommandEvent& event);
//*)
//(*Identifiers(OSImageFrame)
static const long idMenuQuit;
static const long idMenuOpen;
static const long idMenuPSave;
static const long idMenuDraw;
static const long idMenuBSave;
static const long idMenuAbout;
static const long ID_STATUSBAR1;
//*)
//(*Declarations(OSImageFrame)
wxMenu* Menu3;
wxMenuItem* MenuItem3;
wxMenuItem* MenuItem4;
wxMenuItem* MenuItem5;
wxStatusBar* StatusBar1;
//*)
DECLARE_EVENT_TABLE()
};
#endif // OSIMAGEMAIN_H