用C++ Builder对图像进行特殊效果处理

在Windows编程中图像处理相对比较复杂,好在C++ Builder提供了一些图形类,它们通过对Windows中的图形对象进行包装,从而大大简化了图像操作的难度。下面就通过对图像进行柔化、锐化、浮雕效果等几个特殊效果处理来具体说明一下。

一、准备工作 位图图形实际上是像素的二维数组,它记录了每个像素的颜色信息,而TCanvas类提供了Pixels属性,用它可以存取指定像素的颜色值,通过这个属性将位图图形的部分或全部像素的颜色值进行相应的变换处理,就可以实现图像的特殊效果处理。在Windows中颜色是根据红、绿、蓝三种颜色的饱和度来定义的,在这里我们要将像素颜色值的红、绿、蓝分量从像素值中分离出来,分别加以保存,所以需要定义一个结构来存放颜色分量:

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属性设为true,将OpenPictureDialog的Filter设为*.bmp。当用户选择Open命令后,打开相应的对话框,让用户选择要处理的图像文件,然后程序将图像的所有像素的颜色分量保存到rgb数组中:

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;

}

}

二、图像的柔化处理

柔化就是对图像进行平滑处理,减少相邻像素间的颜色差别,一般选用3*3像素块,将中间的像素值改成这9个像素的平均像素值,从而达到柔化效果。其代码如下:

void __fastcall TForm1::btnSmoothClick

(TObject *Sender)

int red,green,blue;

for(i=1;i< width-2;i++)

for(j=1;j< height-2;j++)

{ red=rgb[i-1][j-1].r_color+rgb[i][j-1].r

_color+rgb[i+1][j-1].r_color+

rgb[i-1][j].r_color+rgb[i][j].r

_color+rgb[i+1][j].r_color+

rgb[i-1][j+1].r_color+rgb[i][j+1].r

_color+rgb[i+1][j+1].r_color;

green=rgb[i-1][j-1].g_color+rgb[i][j-1].g

_color+rgb[i+1][j-1].g_color+

rgb[i-1][j].g_color+rgb[i][j].g

_color+rgb[i+1][j].g_color+

rgb[i-1][j+1].g_color+rgb[i][j+1].g

_color+rgb[i+1][j+1].g_color;

blue=rgb[i-1][j-1].b_color+rgb[i][j-1].b

_color+rgb[i+1][j-1].b_color+

rgb[i-1][j].b_color+rgb[i][j].b

_color+rgb[i+1][j].b_color +

rgb[i-1][j+1].b_color+rgb[i][j+1].b

_color+rgb[i+1][j+1].b_color;

bitmap- >Canvas- >Pixels[i][j]

=RGB(red/9,green/9,blue/9);

}

Image1- >Picture- >Bitmap- >Assign(bitmap);

}

三、图像的锐化处理

图像的锐化处理正好与柔化处理相反,它的目的是突出图像的变化部分,这里采用的算法是将要处理的像素与它左对角线的像素之间的差值乘上一个锐化度数,然后再加上原先的像素值:new_value=original_value+degree*difference,你可以通过改变degree的值来调节锐化效果。这里需要注意的是得到的像素新值可能会超出颜色值的有效范围(0-255),所以程序要检验结果的有效性,为此需定义两个函数:

int min(int value1,int value2)

{ if(value1 >value2)return value2;

else return value1;

}int max(int value1,int value2)

{ if(value1 >value2)return value1;

else return value2;}

锐化处理的代码如下:

void __fastcall TForm1::btnSharpeClick

(TObject *Sender)

{

float degree=0.3;

int red,green,blue;

for(i=1;i< width-1;i++)

for(j=1;j< height-1;j++)

{ red=rgb[i][j].r_color+degree*(rgb[i][j].r

_color-rgb[i-1][j-1].r_color);

green=rgb[i][j].g_color+degree*(rgb[i][j].g

_color-rgb[i-1][j-1].g_color);

blue=rgb[i][j].b_color+degree*(rgb[i][j].b

_color-rgb[i-1][j-1].b_color);

red=min(255,max(0,red));

green=min(255,max(0,green));

blue=min(255,max(0,blue));

bitmap- >Canvas->Pixels[i][j]=RGB (red,green,blue);

} Image1- >Picture- >Bitmap- >Assign(bitmap);

四、图像的浮雕效果实现

浮雕效果就是只将图像的变化部分突出出来,而相同颜色部分则被淡化,使图像出现纵深感,从而达到浮雕效果,这里采用的算法是将要处理的像素取值为与处于对角线上的另一个像素间的差值,这样只有颜色变化区才会出现色彩,而颜色平淡区因差值几乎为零则变成黑色,你可以通过加上一个常量来增加一些亮度:new_value=difference+const_value,具体代码如下:

void __fastcall TForm1::btnEmbossClick

(TObject *Sender)

{ int red,green,blue;

const int const_value=128;

for(i=0;i< width-2;i++)

for(j=0;j< height-2;j++)

{ red=abs(rgb[i][j].r_color-rgb[i+1][j+1].r

_color+const_value);
}
green=abs(rgb[i][j].g_color-rgb[i+1][j+1].g

_color+const_value);

blue=abs(rgb[i][j].b_color-rgb[i+1][j+1].b_

color+const_value);

bitmap- >Canvas- >Pixels[i][j]=RGB

(red,green,blue);

}

Image1- >Picture- >Bitmap- >Assign(bitmap);

}

上面介绍了图像处理中的几个常见操作,所采用的算法相对比较简单,感兴趣的朋友可以举一返三,通过改进上述算法,达到更好的特殊效果。以上代码在C++ Builder3、Pwin98下编译、运行通过。

用C++ Builder对图像进行特殊效果处理相关推荐

  1. 强大的图像查看器:EdgeView mac中文

    EdgeView mac中文版是mac上一款强大的图像查看软件,可以处理一些最流行的图像文件格式,同时还提供对导航杂志或漫画书的支持.EdgeView能够打开著名的图像文件格式主要包括JPG,GIF, ...

  2. 图形用户界面(GUI)编程可以学习C++ Builder,架构先进(和C#一样拖控件)

    图形用户界面(GUI)编程可以学习C++ Builder,架构先进(和C#一样拖控件),入门比较容易. -------------------- C++ Builder是真正的可视化的开发工具.C++ ...

  3. 【渝粤教育】广东开放大学 Photoshop 图像处理 形成性考核 (24)

    选择题 题目: 使用变换命令中的缩放命令时,按住哪个键可以保证等比例缩放?( ) 答案:看左侧 题目:  将前景色和背景色恢复为默认颜色的快捷键是()? 答案:看左侧 题目: Photoshop中&q ...

  4. 计算机平面设计教材,《计算机平面设计软件应用——全国中等职业技术学校计算机教材》低价购书_教材教辅考试_孔网...

    本书是根据劳动和社会保障部培训就业司颁发的<计算机专业教学计划>和<计算机平面设计软件应用教学大纲>编写的.主要内容有:Photoshop 6.0,CoreIDRAW 10,A ...

  5. PS图层混合算法之四(亮光, 点光, 线性光, 实色混合)

    亮光模式: 根据绘图色通过增加或降低"对比度",加深或减淡颜色.如果绘图色比50%的灰亮,图像通过降低对比度被照亮,如果绘图色比50%的灰暗,图像通过增加对比度变暗. 线性光模式: ...

  6. PS混合模式图文详解

    如果你要经常使用Photoshop,那么你需要了解Photoshop一个简单却不容易理解的特性混合模式 如果你要经常使用Photoshop,那么你需要了解Photoshop一个简单却不容易理解的特性- ...

  7. Photoshop PS图层混合模式详解

    Photoshop 7.0的图层混合选项中增添了"线性加深"模式."线性减淡"模式."亮光"模式."线性光"模式和&qu ...

  8. Photoshop----图层混合模式详解

    [PS图层混合模式详解] 图层的混合模式决定其像素如何与图像中的下层像素进行混合.使用混合模式可以创建各种特殊效果. 默认情况下,图层组的混合模式是"穿透",表示图层组没有自己的混 ...

  9. 「Adobe国际认证」关于Adobe Photoshop,创建和修改画笔教程?

    注意:对称绘画和图案预览不支持实时笔尖画笔.请为对称和图案绘画选择一个普通画笔. "画笔设置"面板概述 "画笔设置"面板允许您修改现有画笔并设计新的自定义画笔. ...

  10. 如何使用计算机蓝色,电脑中如何用Word的红绿蓝三原色配出天蓝色?

    回答: 透明度不为100%时,根据像素的不透明度随机替换基色和混合色. "清除"和"背后"仅用于颜色混合模式中. "清除"模式:编辑或绘制每 ...

最新文章

  1. python 获取方法名_python 动态获取当前运行的类名和函数名的方法
  2. 大型网站演化发展历程之二
  3. linux编译避免污染源码分离,如何避免linux上的系统标准C/C++库?
  4. ubuntu 使用apt-get install 安装php5.6--php7
  5. Java把时间毫秒数转换成日期和时间
  6. IE6layout元素自动包含浮动元素
  7. 教你如何拒绝带病毒的恶意网页陷阱
  8. 统计函数应用之SQL 分析函数
  9. 游戏目标的三个核心组成部分
  10. python添加环境变量代码_Maya中的PYTHONPATH 环境变量
  11. 米思齐MT1637简单显示字符串和时间
  12. 分享图片至Facebook与Twitter
  13. Hexo之NexT主题设置背景图片
  14. 操作系统:七种进程调度算法
  15. 线性代数 | (1) 矩阵Part One
  16. Do You Kown Asp.Net Core -- Asp.Net Core 2.0 未来web开发新趋势 Razor Page
  17. scheduler_tick函数详解
  18. 微软股价 2019 年飙升 55.3%,创十年来最佳表现!
  19. nn.BatchNorm2d() 手推计算步骤
  20. Ubuntu16.04开启多个工作桌面,以及不同桌面之间的切换,Ubuntu进行同一桌面分屏,Terminal分屏

热门文章

  1. curlopt_ssl_verifypeer后https还是验证不过_为什么 HTTPS 需要 7 次握手和 9 倍时延
  2. 从 Promise、Async/Await 、Generator等角度实现一个 sleep 函数
  3. SeaweedFS上手使用指南
  4. Qpython实现命令行的贪吃蛇
  5. Node.js学习之路04——Buffer对象与字符串
  6. 再也不学AJAX了!(三)跨域获取资源 ② - JSONP CORS
  7. spring @Bean注解的使用
  8. ubuntu启动时的初始化信息二
  9. Xslt中的Xsl:copy与Xsl:copy-of的区别
  10. python 遍历_python dict 两种遍历方式的比较