数字图像典型特效算法-"雕刻"图像

 上面讲述了通过求一个像素和它左上方像素之间的差值并加上一个常数的方法生成"浮雕"效果的灰度图像,"雕刻"图像与之相反,它是通过取一个像素和它右下方的像素之间的差值并加上一个常数,这里我也取128,经过这样处理,就可以得到"雕刻"图像,这时候图像的前景凹陷进背景之中。同样需要读者注意的是为了避免重复使用处理过的图像像素,处理图像时要从图像的左上方的像素开始处理。实现代码如下:

void CDibView::OnDKImage()
{
  // TODO: Add your command handler code here
  HANDLE data1handle;
  LPBITMAPINFOHEADER lpBi;
  CDibDoc *pDoc=GetDocument();
  HDIB hdib;
  unsigned char *hData;
  unsigned char *data;
  hdib=pDoc->GetHDIB();
  BeginWaitCursor();
  lpBi=(LPBITMAPINFOHEADER)GlobalLock((HGLOBAL)hdib);
  hData=(unsigned char*)FindDIBBits((LPSTR)lpBi);
  pDoc->SetModifiedFlag(TRUE);
  data1handle=GlobalAlloc(GMEM_SHARE,WIDTHBYTES(lpBi->biWidth*8)*lpBi->biHeight);
  data=(unsigned char*)GlobalLock((HGLOBAL)data1handle);
  AfxGetApp()->BeginWaitCursor();
  int i,j,buf;
  //图像的"雕刻"处理
  for( i=0;i<=lpBi->biHeight-2; i++)
   for( j=0;j<=lpBi->biWidth-2; j++)
   {
    buf=*(hData+(lpBi->biHeight-i)*WIDTHBYTES(lpBi->biWidth*8)+j)-*(hData+(lpBi->biHeight-i-1)*WIDTHBYTES(lpBi->biWidth*8)+j+1)+128;
    if(buf>255) buf=255;
    if(buf<0)buf=0;
    *(data+(lpBi->biHeight-i)*WIDTHBYTES(lpBi->biWidth*8)+j)=(BYTE)buf;
   }
  for( j=0; jbiHeight; j++)
  for( i=0; ibiWidth; i++)
   //重新将处理后的图像数据写入原始的图像缓冲区内
   *(hData+i*WIDTHBYTES(lpBi->biWidth*8)+j)=*(data+i*WIDTHBYTES(lpBi->biWidth*8)+j);
   AfxGetApp()->EndWaitCursor();
   GlobalUnlock((HGLOBAL)hdib);
   GlobalUnlock(data1handle);
   EndWaitCursor();
   Invalidate(TRUE);
  }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值