在Windows編程中圖像處理相對比較復(fù)雜,好在C++ Builder提供了一些圖形類,它們通過對Windows中的圖形對象進(jìn)行包裝,從而大大簡化了圖像操作的難度。下面就通過對圖像進(jìn)行柔化、銳化、浮雕效果等幾個特殊效果處理來具體說明一下。
一、準(zhǔn)備工作 位圖圖形實際上是像素的二維數(shù)組,它記錄了每個像素的顏色信息,而TCanvas類提供了Pixels屬性,用它可以存取指定像素的顏色值,通過這個屬性將位圖圖形的部分或全部像素的顏色值進(jìn)行相應(yīng)的變換處理,就可以實現(xiàn)圖像的特殊效果處理。在Windows中顏色是根據(jù)紅、綠、藍(lán)三種顏色的飽和度來定義的,在這里我們要將像素顏色值的紅、綠、藍(lán)分量從像素值中分離出來,分別加以保存,所以需要定義一個結(jié)構(gòu)來存放顏色分量:
struct rgb_str
{
unsigned char r_color;
unsigned char g_color;
unsigned char b_color;
};
rgb_str rgb[2000][2000];
建立全局變量:Graphics::TBitmap *bitmap;
//用來存放變換后的位圖
int i,j,width,height;
在窗體上放置一個TImage組件和OpenPictureDialog組件,將TImage的AutoSize屬性設(shè)為true,將OpenPictureDialog的Filter設(shè)為*.bmp。當(dāng)用戶選擇Open命令后,打開相應(yīng)的對話框,讓用戶選擇要處理的圖像文件,然后程序?qū)D像的所有像素的顏色分量保存到rgb數(shù)組中:
void __fastcall TForm1::mnuFileOpenClick(TObject *Sender)
{
TColor color;
if(OpenPictureDialog1- >Execute())
{
Image1- >Picture->LoadFromFile(OpenPictureDialog1- >FileName);
width=Image1- >Picture- >Width; height=Image1->Picture->Height;
for(i=0;i< width-1;i++)
for(j=0;j< height-1;j++)
{
color=Image1- >Canvas->Pixels[i][j];
rgb[i][j].r_color=GetRValue(color);
rgb[i][j].g_color=GetGValue(color);
rgb[i][j].b_color=GetBValue(color);
}
bitmap=new Graphics::TBitmap;
bitmap->Width=width;
bitmap->Height=height;
}
}
一、準(zhǔn)備工作 位圖圖形實際上是像素的二維數(shù)組,它記錄了每個像素的顏色信息,而TCanvas類提供了Pixels屬性,用它可以存取指定像素的顏色值,通過這個屬性將位圖圖形的部分或全部像素的顏色值進(jìn)行相應(yīng)的變換處理,就可以實現(xiàn)圖像的特殊效果處理。在Windows中顏色是根據(jù)紅、綠、藍(lán)三種顏色的飽和度來定義的,在這里我們要將像素顏色值的紅、綠、藍(lán)分量從像素值中分離出來,分別加以保存,所以需要定義一個結(jié)構(gòu)來存放顏色分量:
struct rgb_str
{
unsigned char r_color;
unsigned char g_color;
unsigned char b_color;
};
rgb_str rgb[2000][2000];
建立全局變量:Graphics::TBitmap *bitmap;
//用來存放變換后的位圖
int i,j,width,height;
在窗體上放置一個TImage組件和OpenPictureDialog組件,將TImage的AutoSize屬性設(shè)為true,將OpenPictureDialog的Filter設(shè)為*.bmp。當(dāng)用戶選擇Open命令后,打開相應(yīng)的對話框,讓用戶選擇要處理的圖像文件,然后程序?qū)D像的所有像素的顏色分量保存到rgb數(shù)組中:
void __fastcall TForm1::mnuFileOpenClick(TObject *Sender)
{
TColor color;
if(OpenPictureDialog1- >Execute())
{
Image1- >Picture->LoadFromFile(OpenPictureDialog1- >FileName);
width=Image1- >Picture- >Width; height=Image1->Picture->Height;
for(i=0;i< width-1;i++)
for(j=0;j< height-1;j++)
{
color=Image1- >Canvas->Pixels[i][j];
rgb[i][j].r_color=GetRValue(color);
rgb[i][j].g_color=GetGValue(color);
rgb[i][j].b_color=GetBValue(color);
}
bitmap=new Graphics::TBitmap;
bitmap->Width=width;
bitmap->Height=height;
}
}