如题。
解决方案 »
- 二维BYTE数组怎么快速显示为黑白图像?
- 关于子网掩码
- 项目合作,寻VC界面高手
- 求助!最近想学VC数据库编程,可是找不到相关书籍和网站啊.有谁知道吗?谢谢啦!
- 在WINDOWS 2000/NT下如何用VC++实现对端口的操作
- 数组
- 小问题,马上给分
- 请问CListBox的Column属性能定为固定的吗?
- CreateFileMapping 做的文件映像,怎样配置才可以不让文件映像不自动提交 dirty page 到磁盘,而等到我FlushViewOfFile才真正提交 dirty page 到磁盘呢?
- 标题条上面的文字是用哪个函数写出来的?
- 招聘Delphi 兼职程序员
- 救命:如何得到mfco42.dll
//保证开始小于结束坐标
//…………………………………………………………………………
int tem=0;
if(m_RegionBegin.x>m_RegionEnd.x)
{
tem=m_RegionBegin.x;
m_RegionBegin.x=m_RegionEnd.x;
m_RegionEnd.x=tem;
}
if(m_RegionBegin.y>m_RegionEnd.y)
{
tem=m_RegionBegin.y;
m_RegionBegin.y=m_RegionEnd.y;
m_RegionEnd.y=tem;
}
//................................................................
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
CCh1_1Doc* pDoc =GetDocument();
//DIB句柄
HDIB hDIB,hNewDIB;
// 指向DIB的指针
LPSTR lpDIB,lpNewDIB;
hDIB=pDoc->GetHDIB();
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL)hDIB);
// 源图像的宽度和高度
LONG lWidth;
LONG lHeight;
// 旋转后图像的宽度和高度
LONG lNewWidth;
LONG lNewHeight;
LONG lLineBytes,lNewLineBytes;
// 计算旋转后的图像实际宽度
lNewWidth = (LONG) m_RegionEnd.x-m_RegionBegin.x;
// 计算旋转后的图像高度
lNewHeight = (LONG) m_RegionEnd.y-m_RegionBegin.y;
int PictureBits;
PictureBits=DIBBits(lpDIB);
if (PictureBits/8==0)//不处理低于8位的图像格式
{
MessageBox("不支持该图像的数据格式!", "系统提示" , MB_ICONINFORMATION | MB_OK);
return;
}
// 指向源图像的指针
LPSTR lpDIBBits,lpNewDIBBits;
// 找到源DIB图像象素起始位置
lpDIBBits = ::FindDIBBits(lpDIB);
// 获取图像的宽度
lWidth = ::DIBWidth(lpDIB);
// 获取图像的高度
lHeight = ::DIBHeight(lpDIB);
if(m_RegionEnd.y>lHeight||m_RegionEnd.x>lWidth)
{
MessageBox("超出图像范围!", "系统提示" , MB_ICONINFORMATION | MB_OK);
::GlobalUnlock((HGLOBAL)hDIB);
return;
}
lLineBytes = WIDTHBYTES(PictureBits*lWidth );//将宽度转换成4的整数倍
lNewLineBytes=WIDTHBYTES(PictureBits*lNewWidth );
// 分配内存,以保存新DIB
//lNewWidth=WIDTHBYTES(PictureBits*lNewWidth );
hNewDIB = (HDIB) ::GlobalAlloc(GHND, lNewLineBytes * lNewHeight + *(LPDWORD)lpDIB + ::PaletteSize(lpDIB));
// 判断是否内存分配失败
if (hNewDIB == NULL)
{
// 分配内存失败
return ;
}
m_UnDo[++m_UnDoCount]=CopyHandle(hDIB);
m_bUnDo=true;
// 锁定内存
lpNewDIB = (LPSTR )::GlobalLock((HGLOBAL) hNewDIB);
// 复制DIB信息头和调色板
memcpy(lpNewDIB, lpDIB, *(LPDWORD)lpDIB + ::PaletteSize(lpDIB));
LPBITMAPINFOHEADER lpInfo,lpNewInfo;//位图信息头
// 读取BITMAPINFO结构,初始化指针
lpInfo = (LPBITMAPINFOHEADER)lpDIB;
lpNewInfo=(LPBITMAPINFOHEADER)lpNewDIB;
lpNewInfo->biWidth=lNewWidth;
lpNewInfo->biHeight=lNewHeight;
lpNewInfo->biSizeImage=lNewLineBytes*lNewHeight;//lNewWidth*lNewHeight;//lNewLineBytes*lNewHeight;
// 找到新DIB象素起始位置
lpNewDIBBits = ::FindDIBBits(lpNewDIB);
unsigned char* lpSrc,*lpDest;
int i,j,m,n;
switch(PictureBits)
{
case 8:
for(j=m_RegionBegin.y,n=0;j<m_RegionEnd.y,n<lNewHeight;j++,n++)
for(i=m_RegionBegin.x,m=0;i<m_RegionEnd.x,m<lNewWidth;i++,m++)
{
lpSrc = (unsigned char*)lpDIBBits + lLineBytes *(lHeight-1-j) + i;
lpDest = (unsigned char*)lpNewDIBBits + lNewLineBytes *(lNewHeight-1-n) + m;
*lpDest=*lpSrc;
}
break;
case 24:
for(j=m_RegionBegin.y,n=0;j<m_RegionEnd.y,n<lNewHeight;j++,n++)
for(i=3*m_RegionBegin.x,m=0;i<3*m_RegionEnd.x,m<3*lNewWidth;i++,m++)
{
lpSrc = (unsigned char*)lpDIBBits + lLineBytes *(lHeight-1-j) + i;
lpDest = (unsigned char*)lpNewDIBBits + lNewLineBytes *(lNewHeight-1-n) + m;
*lpDest=*lpSrc;
}
break;
case 32:
lLineBytes = WIDTHBYTES(4*lWidth * 8);
for(j=m_RegionBegin.y,n=0;j<m_RegionEnd.y;j++,n=n++)
for(i=4*m_RegionBegin.x,m=0;i<4*m_RegionEnd.x;i++,m++)
{
lpSrc = (unsigned char*)lpDIBBits + lLineBytes *(lHeight-1-j) + i;
lpDest = (unsigned char*)lpNewDIBBits + lNewLineBytes *(lNewHeight-1-n) + m;
*lpDest=*lpSrc;
}
break;
default:
MessageBox("不支持该图像的数据格式!", "系统提示" , MB_ICONINFORMATION | MB_OK);
break;
}
// 替换DIB,同时释放旧DIB对象
pDoc->ReplaceHDIB(hNewDIB);
pDoc->InitDIBData();
SetScrollSizes(MM_TEXT, pDoc->GetDocSize());
// 更新视图
pDoc->UpdateAllViews(NULL);
::GlobalUnlock((HGLOBAL)hNewDIB);
::GlobalUnlock((HGLOBAL)hDIB);
mb_RegionMeasure=mb_PictureCut=mb_PictureCopy=false;
看看这个,这是个把图像根据所选区域将外部剪掉的程序,你改动一下,将句柄返给文档保存是不是可以呀。