ubuntu下codeblocks起步-图像处理
这是一个简单的图像处理程序,实现了位图的透明处理。有时候我们希望只获得一幅图片的部分内容,而将其他部分进行透明处理。当然,现在的很多图像处理软件(如PhotoShop)等都能很简单地实现透明处理。下面是用程序来将一幅位图透明化的过程。
绘制"透明"位图是指绘制某一位图中除指定颜色外的其余部分,我们称这种颜色为"透明色"。通过将位图的背景色指定为"透明色",在绘制时,不绘制这部分背景,而仅绘制图像,这样就可以将位图中图像透明地绘制到窗口上。
绘制"透明"位图的关键是创建一个"掩码"位图(mask bitmap),"掩码"位图是一个单色位图,它是位图中图像的一个单色剪影。下面的程序中,我们通过双击位图实现对某一颜色的透明化。主要的实现过程如下:
1、双击位图,获得该像素点的颜色信息。相关函数:bool GetPixel(wxCoord x, wxCoord y, wxColour *colour)。x、y为像素点的坐标,colour用来保存该像素点的颜色值。
2、为图像创建一个"掩码"位图(mask bitmap)。相关函数:bool Create(const wxBitmap& bitmap, const wxColour& colour)。
3、应用mask到图像。相关函数:void SetMask(wxMask* mask)。注意:一旦这个函数被调用,位图就拥有了这个mask。
4、图像显示时会显示经过处理后的图像。
创建wxWindgets的对话框(Dialog)工程,命名为picture2。
为此Dialog添加控件,如下:
在编译器的wxSmith选项中添加一“Dialog”类。命名为“ShowDialog”。
为showDialog添加OnPaint和OnLeftDClick事件。函数如下:
void ShowDialog::OnPaint(wxPaintEvent& event)
{
wxPaintDC dc(this);
dc.DrawBitmap(m_bmp, 70, 70, true); //显示图片
}
void ShowDialog::OnLeftDClick(wxMouseEvent& event)
{
wxPaintDC dc(this);
PointX = event.GetX();
PointY = event.GetY(); //获得坐标
dc.GetPixel( PointX, PointY,&colour); //获得像素信息
mask.Create(m_bmp,colour); //创建“掩码”位图
m_bmp.SetMask(&mask); //激活mask
m_bmp.SaveFile(_T("./pictures/pro.bmp"),wxBITMAP_TYPE_BMP,NULL); //保存图片
Refresh();
Update();
}
头文件:
#include <wx/wx.h>
#include <wx/colour.h>
#include <wx/bitmap.h>
#include "picture2Main.h"
在showDialog.h文件中,为ShowDialog类添加成员变量:
public:
wxBitmap m_bmp;
int PointX,PointY;
wxColour colour;
wxMask mask;
wxString picture; //保存图片路径
并在ShowDialog的构造函数中初始化:
PointX = 0;
PointY = 0;
colour = wxColour(0,0,0);
头文件:#include <wx/wx.h>
为picture2Dialog的两个按钮添加响应,函数如下:
“选择”按钮:
void picture2Dialog::OnButton1Click(wxCommandEvent& event)
{
ShowDialog MyShowDialog(this); //创建 ShowDialog类的对象
MyShowDialog.picture = TextCtrl1->GetValue();
MyShowDialog.picture = _T("./pictures/")+MyShowDialog.picture;
(MyShowDialog.m_bmp).LoadFile( MyShowDialog.picture,wxBITMAP_TYPE_BMP); //装载图片
MyShowDialog.ShowModal(); //显示子窗体
}
“读入”按钮:
void picture2Dialog::OnButton2Click(wxCommandEvent& event)
{
ShowDialog MyShowDialog(this);
(MyShowDialog.m_bmp).LoadFile( _T("./pictures/pro.bmp"),wxBITMAP_TYPE_BMP); //装载图片
MyShowDialog.ShowModal(); //显示子窗体
}
最后,头文件:#include "ShowDialog.h",编译运行。
程序所用的图片都保存在同文件下的“pictures”文件夹中(需要自己创建)。处理后的位图保存为“pro.bmp”。点击“选择”,显示你选择的图片。下次打开程序时点击“读入”,会自动读入上次处理过的位图。
参考:
http://www.wxwidgets.org/manuals/2.8.0/wx_wxbitmap.html#wxbitmapsavefile
http://www.wxwidgets.org/manuals/2.8.0/wx_wxmask.html#wxmask
http://www.wxwidgets.org/manuals/2.8.0/wx_wxcolour.html#wxcolourconstr
为解决的问题:
在同一个窗体中,对同一幅位图连续双击实现多种颜色的透明。