雕刻技术.txt

来自「19Kinds_image_arithmath 19种图像基本算法」· 文本 代码 · 共 51 行

TXT
51
字号
void CDibView::OnDKImage() 
{
	CDibDoc *pDoc=GetDocument();
	//文件数据句柄
	HANDLE data1handle;
	//文件信息头指针
	LPBITMAPINFOHEADER lpBi;
	//文件数据句柄
	HDIB hdib;
	//数据区指针
	unsigned char *hData;
	unsigned char *data;
	//得到数据句柄
	hdib=pDoc->GetHDIB();
	//设定鼠标形状为等待
	BeginWaitCursor();
	//锁定内存
	lpBi=(LPBITMAPINFOHEADER)GlobalLock((HGLOBAL)hdib);
	//使得hData指向数据去开始
	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);
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?