效果图:
实现过程:
该方法以photoshop中的图层为基本思想,对文字的处理,实际上是将图片作为一幅图像来处理的,而背景是一幅图像,即另一个图层。
1、 读取文字图片,将图片进行高斯模糊,因高斯模糊是一个卷积的过程,所以可以设定卷积因子的大小,调整这个因子的大小就可以调节文字的模糊程度。
2、 文字图层与背景图层的叠加,为实现文字由模糊到清晰过程的透明效果,所以在文字的像素值为不同范围时,要有不同的透明度,这里选取的透明比例是与文字的像素值成正比的,即当文字像素值为0,文字不透明,当文字像像素值为128,文字半透明,文字像素值为255,文字全透明。
附实现代码:
void CArcSoft_EffectDlg::OnEffct17()
{
//TODO: Add your control notification handler code here
if(img==0)return;
m_blur=99;
SetTimer(1,100,NULL);
}
void CArcSoft_EffectDlg::OnTimer(UINTnIDEvent)
{
//TODO: Add your message handler code here and/or call default
Processpro;
if(nIDEvent==1)
{
bgimg=cvLoadImage("pic4.jpg",1);
image=cvCloneImage(img);
cvSmooth(image,image,CV_GAUSSIAN,m_blur,m_blur);
pro.myTransparent(bgimg,image,0);
image=cvCloneImage(bgimg);
myShowMFC(image,(&m_pic)->GetDC(),IDC_EFFECT);
cvReleaseImage(&bgimg);
}
m_blur-=4;
if(m_blur<3)
{
KillTimer(1);
bgimg=cvLoadImage("pic4.jpg",1);
image=cvCloneImage(img);
pro.myTransparent(bgimg,image,0);
image=cvCloneImage(bgimg);
myShowMFC(image,(&m_pic)->GetDC(),IDC_EFFECT);
cvReleaseImage(&bgimg);
}
CDialog::OnTimer(nIDEvent);
}
void Process::myTransparent(IplImage *img,IplImage *img1, int ratio)
{
intwidth=img->width;
intheight=img->height;
intstep=img->widthStep;
intchannel=img->nChannels;
uchar*data=(uchar *) img->imageData;
IplImage*img2=cvCreateImage(cvSize(width,height),img->depth,img->nChannels);
cvResize(img1,img2,CV_INTER_LINEAR);
uchar*data2=(uchar *) img2->imageData;
for(int i=0;i<height;i++)
for(intj=0;j<width;j++)
for(intk=0;k<channel;k++)
{
floatm_trans=(float)data2[i*step+j*channel+k]/255;
data[i*step+j*channel+k]=data[i*step+j*channel+k]*m_trans+data2[i*step+j*channel+k]*(1-m_trans);
}
cvReleaseImage(&img2);
}