给自己的大二课设存个档
可以处理8位和256位图
#2.1.1反色
反色用到的算子[0 0 0 ,系数是-1.0
0 1 0
0 0 0 ]
反色的实际含义是将R、G、B值反转。若颜色的量化级别是256,则新图的R、G、B值为255减去原图的R、G、B值。而对于本次处理的灰度图像而言,直接用255减去像素原来的灰度值即可。
BOOL WINAPI ZDYLJ(LPSTR lpDIBBits, LONG lWidth, LONG lHeight, long lLineBytes,
int iTempH, int iTempW,
int iTempMX, int iTempMY,
FLOAT* fpArray, double fCoef, int fConst)
{
// 指向复制图像的指针
LPSTR lpNewDIBBits;
HLOCAL hNewDIBBits;
// 指向源图像的指针
unsigned char* lpSrc;
// 指向要复制区域的指针
unsigned char* lpDst;
// 循环变量
LONG i;
LONG j;
LONG k;
LONG l;
// 计算结果
FLOAT fResult;
// 暂时分配内存,以保存新图像
hNewDIBBits = LocalAlloc(LHND, lLineBytes * lHeight);
// 判断是否内存分配失败
if (hNewDIBBits == NULL)
{
// 分配内存失败
return FALSE;
}
// 锁定内存
lpNewDIBBits = (char*)LocalLock(hNewDIBBits);
// 初始化图像为原始图像
memcpy(lpNewDIBBits, lpDIBBits, lLineBytes * lHeight);
// 行(除去边缘几行)
for (i = iTempMY; i < lHeight - iTempH + iTempMY + 1; i++)
{
// 列(除去边缘几列)
for (j = iTempMX; j < lWidth - iTempW + iTempMX + 1; j++)
{
// 指向新DIB第i行,第j个象素的指针
lpDst = (unsigned char*)lpNewDIBBits + lLineBytes * (lHeight - 1 - i) + j;
fResult = 0;
// 计算
for (k = 0; k < iTempH; k++)
{
for (l = 0; l < iTempW; l++)
{
// 指向DIB第i - iTempMY + k行,第j - iTempMX + l个象素的指针
lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i + iTempMY - k)
+ j - iTempMX + l;
// 保存象素值
fResult += (*lpSrc) * fpArray[k * iTempW + l];
}
}
// 乘上系数
fResult = fResult * fCoef + fConst;
// 取绝对值
fResult = (FLOAT)fabs(fResult);
// 判断是否超过255
if (fResult > 255)
{
// 直接赋值为255
*lpDst = 255;
}
else
{
// 赋值
*lpDst = (unsigned char)(fResult + 0.5);
}
}
}
// 复制变换后的图像
memcpy(lpDIBBits, lpNewDIBBits, lLineBytes * lHeight);
// 释放内存
LocalUnlock(hNewDIBBits);
LocalFree(hNewDIBBits);
// 返回
return TRUE;
}
2.1.2平滑
运用到了高斯平滑和均值平滑。两者使用的模板和原理不同,但是要实现这两种效果可以使用相同的函数ZDYLJ()处理。
均值滤波的模板是[1 1 1 ,系数是1/9
1 1 1
1 1 1 ]
高斯滤波的模板是[1 2 1 , 系数是1/16
2 4 2
1 2 1]
1.3锐化
锐化使用了拉普拉斯算子即:[ -1 -1 -1
-1 9 -1
-1 -1 -1]
拉普拉斯锐化是采用拉普拉斯算子对图像进行操作。
锐化处理的主要目的是突出图像中的细节或者增强被模糊了的细节,这种模糊不是由于错误操作,就是特殊图像获取方法的固有影响。
2.1.4 边缘检测
使用sobel算子, 其水平模板为[1 2 1 ,垂直模板为[ -1 0 1
0 0 0 -2 0 2
-1 -2 -1] -1 0 1]
使用Prewiitt算子,其水平模板为[-1 -1 -1 , 垂直模板为[ -1 0 1
0 0 0 -1 0 1
1 1 1 ] -1 0 1]
水平模板对水平边缘影响最大,垂直模板对垂直模板影响最大
边缘检测能够使图像中的物体的边缘突出
2.1.5 浮雕
用到的算子 [-2 -1 0 ,系数是1.0
-1 1 1
0 1 2 ]
2.2 阈值分割算法
2.2.1 迭代法
1) 选择灰度值的平均值作为初始阈值T0
2) 对小于T的的像素的灰度值求平均值T1, 对大于T的的像素的灰度值求平均值T2
3) 新的T=(T1+T1)/2
重复第一到三步直到T=T0
2.2.2 OTSU法
本思想是使用一个阈值将整个数据分成两个类,假如两个类之间的方差最大,那么这个阈值就是最佳的阈值。
2.2.3 自适应分割法
把图像分成四部分,求出子图像的平均值,并分别对子图像进行处理
2.3 直方图均衡化
计算每种灰度值出现的次数,求出灰度映射表和新灰度值
3 算法的实现效果
3.1 自定义滤镜
反色
均值模糊
高斯模糊
自定义滤镜
浮雕
Sobel算子
垂直:
水平:
Prewitt算子
垂直:
水平:
保存算子
装载算子
#3.2 几何变换
3.2.1图像平移
3.2.2垂直镜像
3.23水平镜像
3.2.4图像缩放
3.2.5图像旋转
#阈值分割
迭代法
结果:
OTSU法:
结果:
自适应阈值分割:
#3.4窗口变换和灰度拉伸
灰度拉伸
#3.5直方图均衡化
#3.6风格化
油画滤镜
马赛克:
水彩画滤镜:
#3.7 区域计数
先是对硬币图像使用阈值分割
8连通处理结果
还做了4连通和自动选择前景结果差不多
除了数量计算的都有问题好像是,记不清了
只能算硬币,算米粒数有问题
#3.8 Canny算子
贴部分代码
#pragma once
// MFCApplication2View.cpp: CMFCApplication2View 类的实现
#include "pch.h"
#include "framework.h"
// SHARED_HANDLERS 可以在实现预览、缩略图和搜索筛选器句柄的
// ATL 项目中进行定义,并允许与该项目共享文档代码。
#ifndef SHARED_HANDLERS
#include "MFCApplication2.h"
#endif
#include "MFCApplication2Doc.h"
#include "MFCApplication2View.h"
#include"CDlgImgInfo.h"
#include"CDlgchangelightwo.h"
#include"CDlgHistogram.h"
#include"CDlg_Inverse_V.h"
#include"PointTrans.h"
#include"CDlgLinerPara.h"
#include"TemplateTrans.h"
//#include"function.h"
#include"CDlgSmooth.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
#include "cDlgMorphErosion.h"
#include"cDlgMorphDilation.h"
#include"cDlgMorphOpen.h"
#include"cDlgMorphClose.h"
#include"morph.h"
#include"Erzhihua.h"
#include"restore.h"
#include "CDlgPointThre.h"
#include"detect.h"
#include"CDlgPointStre.h"
#include"CDlgGeoTran.h"
#include"GeoTrans.h"
#include"CDlgGeoZoom.h"
#include"CDlgPointWin.h"
#include"CDlgZdylvjing.h"
#include"CDlgGeoRota.h"
#include"ZDY.h"
#include"CDlgAREACOUNT.h"
#include"CDlgACRESULT.h"
#include"CDlgStyle.h"
#include"edgecontour.h"
//#include"GlobalApi.h"
#define WIDTHBYTES(bits) (((bits) + 31) / 32 * 4)
DECLARE_HANDLE(HDIB);
// CMFCApplication2View
IMPLEMENT_DYNCREATE(CMFCApplication2View, CView)
BEGIN_MESSAGE_MAP(CMFCApplication2View, CView)
// 标准打印命令
ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CView::OnFilePrintPreview)
ON_COMMAND(32771, &CMFCApplication2View::On32771)
ON_COMMAND(ID_changelightwo, &CMFCApplication2View::Onchangelightwo)
ON_COMMAND(ID_zhifangtu, &CMFCApplication2View::Onzhifangtu)
ON_COMMAND(ID_PointInvert, &CMFCApplication2View::OnPointinvert)
ON_COMMAND(ID_fanse, &CMFCApplication2View::Onfanse)
ON_COMMAND(ID_LINECHANGE, &CMFCApplication2View::OnLinechange)
ON_COMMAND(ID_Tran_L, &CMFCApplication2View::OnTranL)
ON_COMMAND(ID_Tran_Reverse_L, &CMFCApplication2View::OnTranReverseL)
ON_COMMAND(ID_Tran_V, &CMFCApplication2View::OnTranV)
ON_COMMAND(ID_EnHaSoomth, &CMFCApplication2View::OnEnhasoomth)
ON_COMMAND(ID_ENHA_SHARP, &CMFCApplication2View::OnEnhaSharp)
ON_COMMAND(ID_GAOSI, &CMFCApplication2View::OnGaosi)
ON_COMMAND(ID_morph, &CMFCApplication2View::Onmorph)
ON_COMMAND(ID_Dilation, &CMFCApplication2View::OnDilation)
ON_COMMAND(ID_Open, &CMFCApplication2View::OnOpen)
ON_COMMAND(ID_Close, &CMFCApplication2View::OnClose)
ON_COMMAND(ID_Erzhihua, &CMFCApplication2View::OnErzhihua)
ON_COMMAND(ID_RESTORE_SALTNOISE, &CMFCApplication2View::OnRestoreSaltnoise)
ON_COMMAND(ID_RESTORE_RANDOMNOISE, &CMFCApplication2View::OnRestoreRandomnoise)
ON_COMMAND(ID_POINT_THRE, &CMFCApplication2View::OnPointThre)
ON_COMMAND(ID_POINT_STRE, &CMFCApplication2View::OnPointStre)
ON_COMMAND(ID_GEOM_TRAN, &CMFCApplication2View::OnGeomTran)
ON_COMMAND(ID_GEOM_MIRV, &CMFCApplication2View::OnGeomMirv)
ON_COMMAND(ID_GEOM_MIRH, &CMFCApplication2View::OnGeomMirh)
ON_COMMAND(ID_GEOM_ZOOM, &CMFCApplication2View::OnGeomZoom)
ON_COMMAND(ID_POINT_WIND, &CMFCApplication2View::OnPointWind)
//ON_COMMAND(ID_POPUP_MASK, &CMFCApplication2View::OnPopupMask)
ON_COMMAND(ID_ZDYLJ, &CMFCApplication2View::OnZdylj)
ON_COMMAND(ID_GEOM_ROTA, &CMFCApplication2View::OnGeomRota)
ON_COMMAND(ID_AREAC, &CMFCApplication2View::OnAreac)
ON_COMMAND(ID_junheng, &CMFCApplication2View::Onjunheng)
ON_COMMAND(ID_Waterp, &CMFCApplication2View::OnWaterp)
ON_COMMAND(ID_Oilp, &CMFCApplication2View::OnOilp)
ON_COMMAND(ID_Selfadapt, &CMFCApplication2View::OnSelfadapt)
ON_COMMAND(ID_Canny, &CMFCApplication2View::OnCanny)
ON_COMMAND(ID_PopupMask, &CMFCApplication2View::OnPopupmask)
END_MESSAGE_MAP()
// CMFCApplication2View 构造/析构
CMFCApplication2View::CMFCApplication2View() noexcept
{
// TODO: 在此处添加构造代码
}
CMFCApplication2View::~CMFCApplication2View()
{
}
BOOL CMFCApplication2View::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: 在此处通过修改
// CREATESTRUCT cs 来修改窗口类或样式
return CView::PreCreateWindow(cs);
}
// CMFCApplication2View 绘图
void CMFCApplication2View::OnDraw(CDC* pDC)
{
CMFCApplication2Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: 在此处为本机数据添加绘制代码
HGLOBAL hDIB = pDoc->GetHObject();
// 判断DIB是否为空
if (hDIB != NULL)
{
LPSTR lpDibSection = (LPSTR) ::GlobalLock((HGLOBAL)hDIB);
// 获取DIB宽度
int cxDIB = (int)pDoc->m_dib.GetWidth(lpDibSection);
// 获取DIB高度
int cyDIB = (int)pDoc->m_dib.GetHeight(lpDibSection);
::GlobalUnlock((HGLOBAL)hDIB);
CRect rcDIB;
rcDIB.top = rcDIB.left = 0;
rcDIB.right = cxDIB;
rcDIB.bottom = cyDIB;
CRect rcDest = rcDIB;
// 输出DIB
pDoc->m_dib.DrawDib(pDC->m_hDC, &rcDest, pDoc->GetHObject(),
&rcDIB, pDoc->GetDocPal());
}
}
// CMFCApplication2View 打印
BOOL CMFCApplication2View::OnPreparePrinting(CPrintInfo* pInfo)
{
// 默认准备
return DoPreparePrinting(pInfo);
}
void CMFCApplication2View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: 添加额外的打印前进行的初始化过程
}
void CMFCApplication2View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: 添加打印后进行的清理过程
}
// CMFCApplication2View 诊断
#ifdef _DEBUG
void CMFCApplication2View::AssertValid() const
{
CView::AssertValid();
}
void CMFCApplication2View::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CMFCApplication2Doc* CMFCApplication2View::GetDocument() const // 非调试版本是内联的
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMFCApplication2Doc)));
return (CMFCApplication2Doc*)m_pDocument;
}
#endif //_DEBUG
// CMFCApplication2View 消息处理程序
void CMFCApplication2View::On32771()
{
// 显示图像基本信息
CMFCApplication2Doc* pDoc = GetDocument();// 获取文档
long lSrcLineBytes; //图象每行的字节数
long lSrcWidth; //图象的宽度和高度
long lSrcHeight;
int lpSrcBitCount; //图像的位深
LPSTR lpSrcDib; //指向源图象的指针
LPSTR lpSrcStartBits; //指向源像素的指针
lpSrcDib = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->GetHObject());// 锁定DIB
if (!lpSrcDib) return;
/*
if (pDoc->m_dib.GetColorNum(lpSrcDib) != 256)// 判断是否是8-bpp位图
{
AfxMessageBox(L"对不起,不是256色位图!");// 警告
::GlobalUnlock((HGLOBAL) pDoc->GetHObject());// 解除锁定
return; //返回
} //判断是否是8-bpp位图,不是则返回
*/
lpSrcStartBits = pDoc->m_dib.GetBits(lpSrcDib); // 找到DIB图象像素起始位置
lSrcWidth = pDoc->m_dib.GetWidth(lpSrcDib); // 获取图象的宽度
lSrcHeight = pDoc->m_dib.GetHeight(lpSrcDib); // 获取图象的高度
lpSrcBitCount = pDoc->m_dib.GetBitCount(lpSrcDib); //获取图像位深
lSrcLineBytes = pDoc->m_dib.GetReqByteWidth(lSrcWidth * lpSrcBitCount); // 计算图象每行的字节数
/
CDlgImgInfo dlgPara;// 创建对话框
dlgPara.m_Width = lSrcWidth;
dlgPara.m_Height = lSrcHeight;
dlgPara.m_bitCount = lpSrcBitCount;
if (dlgPara.DoModal() != IDOK)// 显示对话框,
{
return;
}
::GlobalUnlock((HGLOBAL)pDoc->GetHObject());// 解除锁定
}
void CMFCApplication2View::Onchangelightwo()
{
// TODO: 在此添加命令处理程序代码
// 显示图像基本信息
CMFCApplication2Doc* pDoc = GetDocument();// 获取文档
long lSrcLineBytes; //图象每行的字节数
long lSrcWidth; //图象的宽度和高度
long lSrcHeight;
int lpSrcBitCount; //图像的位深
LPSTR lpSrcDib; //指向源图象的指针
LPSTR lpSrcStartBits; //指向源像素的指针
lpSrcDib = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->GetHObject());// 锁定DIB
if (!lpSrcDib) return;
/*
if (pDoc->m_dib.GetColorNum(lpSrcDib) != 256)// 判断是否是8-bpp位图
{
AfxMessageBox(L"对不起,不是256色位图!");// 警告
::GlobalUnlock((HGLOBAL) pDoc->GetHObject());// 解除锁定
return; //返回
} //判断是否是8-bpp位图,不是则返回
*/
lpSrcStartBits = pDoc->m_dib.GetBits(lpSrcDib); // 找到DIB图象像素起始位置
lSrcWidth = pDoc->m_dib.GetWidth(lpSrcDib); // 获取图象的宽度
lSrcHeight = pDoc->m_dib.GetHeight(lpSrcDib); // 获取图象的高度
lpSrcBitCount = pDoc->m_dib.GetBitCount(lpSrcDib); //获取图像位深
lSrcLineBytes = pDoc->m_dib.GetReqByteWidth(lSrcWidth * lpSrcBitCount); // 计算图象每行的字节数
CDlgchangelightwo dig;// 创建对话框
int offset;
if (dig.DoModal() != IDOK)// 显示对话框,
{
return;
}
offset = dig.m_light;
ChangeGray(lpSrcStartBits, lpSrcBitCount, lSrcWidth, lSrcHeight, offset);
//改变亮度IDC_Light
//CString text;
//GetDlgItemText(IDC_Light,text);
//GetDlgItem(IDC_Light)->GetWindowTextW(text);
//int n = _ttoi(text);
//int n;
//ChangeGray(lpSrcDib, lpSrcBitCount, lSrcWidth, lSrcHeight, dig.m_light);
/*for (long i = 0;i < lSrcHeight;i++)
{
for (long j = 0;j < lSrcWidth;j++)
{
LPSTR lpSrc = lpSrcStartBits + lSrcLineBytes * i + j;
*lpSrc = *lpSrc + dig.m_light;
if (*lpSrc> 255)
{
*lpSrc=255;
}
if (*lpSrc <0)
{
*lpSrc = 0;
}
}
}*/
pDoc->SetModifiedFlag(true);
pDoc->UpdateAllViews(NULL);
::GlobalUnlock((HGLOBAL)pDoc->GetHObject());// 解除锁定
}
void CMFCApplication2View::Onzhifangtu()
{
// 简单显示直方图
CMFCApplication2Doc* pDoc = GetDocument();
long lSrcLineBytes; //图象每行的字节数
long lSrcWidth; //图象的宽度和高度
long lSrcHeight;
int lpSrcBitCount; //图像的位深
LPSTR lpSrcDib; //指向源图象的指针 lpDIB;
LPSTR lpSrcStartBits; //指向源像素的指针 lpDIBBits;
lpSrcDib = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->GetHObject());// 锁定DIB
if (!lpSrcDib) return;
lpSrcStartBits = pDoc->m_dib.GetBits(lpSrcDib); // 找到DIB图象像素起始位置
lSrcWidth = pDoc->m_dib.GetWidth(lpSrcDib); // 获取图象的宽度
lSrcHeight = pDoc->m_dib.GetHeight(lpSrcDib); // 获取图象的高度
lpSrcBitCount = pDoc->m_dib.GetBitCount(lpSrcDib); //获取图像位深
lSrcLineBytes = pDoc->m_dib.GetReqByteWidth(lSrcWidth * lpSrcBitCount); // 计算图象每行的字节数
LONG i, j;
LONG m_lCount[256];
unsigned char* lpSrc;
//LONG m_lWidth, m_lHeight;
// 更改光标形状
BeginWaitCursor();
//计算直方图
// 重置计数为0
/*for (i = 0; i < 256; i++)
{
// 清零
m_lCount[i] = 0;
}
for (i = 0; i < lSrcHeight; i++)
{
for (j = 0; j < lSrcWidth; j++)
{
lpSrc = (unsigned char*)lpSrcStartBits + lSrcLineBytes * i + j;
// 计数加1
m_lCount[*(lpSrc)]++;
}
}*/
// 创建对话框
CDlgHistogram dlgPara;
//显示直方图
// 初始化变量值
dlgPara.m_lpDIBBits = lpSrcStartBits;
dlgPara.m_lWidth = lSrcWidth;
dlgPara.m_lHeight = lSrcHeight;
dlgPara.m_iLowGray = 0;
dlgPara.m_iHighGray = 255;
dlgPara.m_lLineBytes = lSrcLineBytes;
for (i = 0; i < 256; i++)
{
dlgPara.m_lCount[i] = m_lCount[i];
}
// 显示对话框
if (dlgPara.DoModal() != IDOK) // 显示对话框
{
return;
}
delete dlgPara;
EndWaitCursor();
//设置文档修改标志
// pDoc->SetModifiedFlag(true);
//更新视图
pDoc->UpdateAllViews(NULL);
// 解除锁定
::GlobalUnlock((HGLOBAL)pDoc->GetHObject());
}
void CMFCApplication2View::OnPointinvert()//倒V
{
// TODO: 在此添加命令处理程序代码
CMFCApplication2Doc* pDoc = GetDocument();
long lSrcLineBytes; //图象每行的字节数
long lSrcWidth; //图象的宽度和高度
long lSrcHeight;
int lpSrcBitCount; //图像的位深
LPSTR lpSrcDib; //指向源图象的指针
LPSTR lpSrcStartBits; //指向源像素的指针
lpSrcDib = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->GetHObject());// 锁定DIB
if (!lpSrcDib) return;
/*if (pDoc->m_dib.GetColorNum(lpSrcDib) != 256)// 判断是否是8-bpp位图
{
AfxMessageBox(L"对不起,不是256色位图!");// 警告
::GlobalUnlock((HGLOBAL)pDoc->GetHObject());// 解除锁定
return; //返回
} //判断是否是8-bpp位图,不是则返回*/
lpSrcStartBits = pDoc->m_dib.GetBits(lpSrcDib); // 找到DIB图象像素起始位置
lSrcWidth = pDoc->m_dib.GetWidth(lpSrcDib); // 获取图象的宽度
lSrcHeight = pDoc->m_dib.GetHeight(lpSrcDib); // 获取图象的高度
lpSrcBitCount = pDoc->m_dib.GetBitCount(lpSrcDib); //获取图像位深
lSrcLineBytes = pDoc->m_dib.GetReqByteWidth(lSrcWidth * lpSrcBitCount); // 计算图象每行的字节数
//
//
int threshold;
CDlg_Inverse_V dlg;// 创建对话框
dlg.m_threshold = 128;
if (dlg.DoModal() != IDOK)// 显示对话框
{
return;
}
threshold = dlg.m_threshold;
int type = 1;
Segmental2_Linear_Tran(lpSrcStartBits, lSrcWidth, lSrcHeight, type, threshold);//分段线性变换
pDoc->SetModifiedFlag(TRUE);
pDoc->UpdateAllViews(NULL);
::GlobalUnlock((HGLOBAL)pDoc->GetHObject());
}
void CMFCApplication2View::Onfanse()
{
CMFCApplication2Doc* pDoc = GetDocument();
long lSrcLineBytes; //图象每行的字节数
long lSrcWidth; //图象的宽度和高度
long lSrcHeight;
int lpSrcBitCount; //图像的位深
LPSTR lpSrcDib; //指向源图象的指针
LPSTR lpSrcStartBits; //指向源像素的指针
lpSrcDib = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->GetHObject());// 锁定DIB
if (!lpSrcDib) return;
/*if (pDoc->m_dib.GetColorNum(lpSrcDib) != 256)// 判断是否是8-bpp位图
{
AfxMessageBox(L"对不起,不是256色位图!");// 警告
::GlobalUnlock((HGLOBAL)pDoc->GetHObject());// 解除锁定
return; //返回
} //判断是否是8-bpp位图,不是则返回*/
lpSrcStartBits = pDoc->m_dib.GetBits(lpSrcDib); // 找到DIB图象像素起始位置
lSrcWidth = pDoc->m_dib.GetWidth(lpSrcDib); // 获取图象的宽度
lSrcHeight = pDoc->m_dib.GetHeight(lpSrcDib); // 获取图象的高度
lpSrcBitCount = pDoc->m_dib.GetBitCount(lpSrcDib); //获取图像位深
lSrcLineBytes = pDoc->m_dib.GetReqByteWidth(lSrcWidth * lpSrcBitCount); // 计算图象每行的字节数
//调用函数处理,图像反色
FLOAT fA = -1.0;
FLOAT fB = 255;
LinerTrans(lpSrcStartBits, lSrcWidth,lSrcHeight,fA, fB);
pDoc->SetModifiedFlag(TRUE);
pDoc->UpdateAllViews(NULL);
::GlobalUnlock((HGLOBAL)pDoc->GetHObject());
}
void CMFCApplication2View::OnLinechange()
{
CMFCApplication2Doc* pDoc = GetDocument();
long lSrcLineBytes; //图象每行的字节数
long lSrcWidth; //图象的宽度和高度
long lSrcHeight;
int lpSrcBitCount; //图像的位深
LPSTR lpSrcDib; //指向源图象的指针
LPSTR lpSrcStartBits; //指向源像素的指针
lpSrcDib = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->GetHObject());// 锁定DIB
if (!lpSrcDib) return;
lpSrcStartBits = pDoc->m_dib.GetBits(lpSrcDib); // 找到DIB图象像素起始位置
lSrcWidth = pDoc->m_dib.GetWidth(lpSrcDib); // 获取图象的宽度
lSrcHeight = pDoc->m_dib.GetHeight(lpSrcDib); // 获取图象的高度
lpSrcBitCount = pDoc->m_dib.GetBitCount(lpSrcDib); //获取图像位深
lSrcLineBytes = pDoc->m_dib.GetReqByteWidth(lSrcWidth * lpSrcBitCount); // 计算图象每行的字节数
CDlgLinerPara dlg;// 创建对话框
dlg.m_fA = 1;
dlg.m_fB = 0;
if (dlg.DoModal() != IDOK)// 显示对话框
{
return;
}
FLOAT fB,fA;
fA = dlg.m_fA;
fB = dlg.m_fB;
LinerTrans(lpSrcStartBits, lSrcWidth, lSrcHeight, fA, fB);
pDoc->SetModifiedFlag(TRUE);
pDoc->UpdateAllViews(NULL);
::GlobalUnlock((HGLOBAL)pDoc->GetHObject());
}
void CMFCApplication2View::OnTranL()
{
CMFCApplication2Doc* pDoc = GetDocument();
long lSrcLineBytes; //图象每行的字节数
long lSrcWidth; //图象的宽度和高度
long lSrcHeight;
int lpSrcBitCount; //图像的位深
LPSTR lpSrcDib; //指向源图象的指针
LPSTR lpSrcStartBits; //指向源像素的指针
lpSrcDib = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->GetHObject());// 锁定DIB
if (!lpSrcDib) return;
/*if (pDoc->m_dib.GetColorNum(lpSrcDib) != 256)// 判断是否是8-bpp位图
{
AfxMessageBox(L"对不起,不是256色位图!");// 警告
::GlobalUnlock((HGLOBAL)pDoc->GetHObject());// 解除锁定
return; //返回
} //判断是否是8-bpp位图,不是则返回*/
lpSrcStartBits = pDoc->m_dib.GetBits(lpSrcDib); // 找到DIB图象像素起始位置
lSrcWidth = pDoc->m_dib.GetWidth(lpSrcDib); // 获取图象的宽度
lSrcHeight = pDoc->m_dib.GetHeight(lpSrcDib); // 获取图象的高度
lpSrcBitCount = pDoc->m_dib.GetBitCount(lpSrcDib); //获取图像位深
lSrcLineBytes = pDoc->m_dib.GetReqByteWidth(lSrcWidth * lpSrcBitCount); // 计算图象每行的字节数
//
//
int threshold;
CDlg_Inverse_V dlg;// 创建对话框
dlg.m_threshold = 128;
/*if (dlg.DoModal() != IDOK)// 显示对话框
{
return;
}*/
threshold = dlg.m_threshold;
int type = 4;
Segmental2_Linear_Tran(lpSrcStartBits, lSrcWidth, lSrcHeight, type, threshold);//分段线性变换
pDoc->SetModifiedFlag(TRUE);
pDoc->UpdateAllViews(NULL);
::GlobalUnlock((HGLOBAL)pDoc->GetHObject());
}
void CMFCApplication2View::OnTranReverseL()
{
CMFCApplication2Doc* pDoc = GetDocument();
long lSrcLineBytes; //图象每行的字节数
long lSrcWidth; //图象的宽度和高度
long lSrcHeight;
int lpSrcBitCount; //图像的位深
LPSTR lpSrcDib; //指向源图象的指针
LPSTR lpSrcStartBits; //指向源像素的指针
lpSrcDib = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->GetHObject());// 锁定DIB
if (!lpSrcDib) return;
/*if (pDoc->m_dib.GetColorNum(lpSrcDib) != 256)// 判断是否是8-bpp位图
{
AfxMessageBox(L"对不起,不是256色位图!");// 警告
::GlobalUnlock((HGLOBAL)pDoc->GetHObject());// 解除锁定
return; //返回
} //判断是否是8-bpp位图,不是则返回*/
lpSrcStartBits = pDoc->m_dib.GetBits(lpSrcDib); // 找到DIB图象像素起始位置
lSrcWidth = pDoc->m_dib.GetWidth(lpSrcDib); // 获取图象的宽度
lSrcHeight = pDoc->m_dib.GetHeight(lpSrcDib); // 获取图象的高度
lpSrcBitCount = pDoc->m_dib.GetBitCount(lpSrcDib); //获取图像位深
lSrcLineBytes = pDoc->m_dib.GetReqByteWidth(lSrcWidth * lpSrcBitCount); // 计算图象每行的字节数
//
//
int threshold;
CDlg_Inverse_V dlg;// 创建对话框
dlg.m_threshold = 128;
/*if (dlg.DoModal() != IDOK)// 显示对话框
{
return;
}*/
threshold = dlg.m_threshold;
int type = 3;
Segmental2_Linear_Tran(lpSrcStartBits, lSrcWidth, lSrcHeight, type, threshold);//分段线性变换
pDoc->SetModifiedFlag(TRUE);
pDoc->UpdateAllViews(NULL);
::GlobalUnlock((HGLOBAL)pDoc->GetHObject());
}
void CMFCApplication2View::OnTranV()
{
CMFCApplication2Doc* pDoc = GetDocument();
long lSrcLineBytes; //图象每行的字节数
long lSrcWidth; //图象的宽度和高度
long lSrcHeight;
int lpSrcBitCount; //图像的位深
LPSTR lpSrcDib; //指向源图象的指针
LPSTR lpSrcStartBits; //指向源像素的指针
lpSrcDib = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->GetHObject());// 锁定DIB
if (!lpSrcDib) return;
/*if (pDoc->m_dib.GetColorNum(lpSrcDib) != 256)// 判断是否是8-bpp位图
{
AfxMessageBox(L"对不起,不是256色位图!");// 警告
::GlobalUnlock((HGLOBAL)pDoc->GetHObject());// 解除锁定
return; //返回
} //判断是否是8-bpp位图,不是则返回*/
lpSrcStartBits = pDoc->m_dib.GetBits(lpSrcDib); // 找到DIB图象像素起始位置
lSrcWidth = pDoc->m_dib.GetWidth(lpSrcDib); // 获取图象的宽度
lSrcHeight = pDoc->m_dib.GetHeight(lpSrcDib); // 获取图象的高度
lpSrcBitCount = pDoc->m_dib.GetBitCount(lpSrcDib); //获取图像位深
lSrcLineBytes = pDoc->m_dib.GetReqByteWidth(lSrcWidth * lpSrcBitCount); // 计算图象每行的字节数
//
//
int threshold;
CDlg_Inverse_V dlg;// 创建对话框
dlg.m_threshold = 128;
/*if (dlg.DoModal() != IDOK)// 显示对话框
{
return;
}*/
threshold = dlg.m_threshold;
int type = 2;
Segmental2_Linear_Tran(lpSrcStartBits, lSrcWidth, lSrcHeight, type, threshold);//分段线性变换
pDoc->SetModifiedFlag(TRUE);
pDoc->UpdateAllViews(NULL);
::GlobalUnlock((HGLOBAL)pDoc->GetHObject());
}
void CMFCApplication2View::OnEnhasoomth()
{
CMFCApplication2Doc* pDoc = GetDocument();
long lSrcLineBytes; //图象每行的字节数
long lSrcWidth; //图象的宽度和高度
long lSrcHeight;
int lpSrcBitCount; //图像的位深
LPSTR lpSrcDib; //指向源图象的指针
LPSTR lpSrcStartBits; //指向源像素的指针
lpSrcDib = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->GetHObject());// 锁定DIB
if (!lpSrcDib) return;
/*if (pDoc->m_dib.GetColorNum(lpSrcDib) != 256)// 判断是否是8-bpp位图
{
AfxMessageBox(L"对不起,不是256色位图!");// 警告
::GlobalUnlock((HGLOBAL)pDoc->GetHObject());// 解除锁定
return; //返回
} //判断是否是8-bpp位图,不是则返回*/
lpSrcStartBits = pDoc->m_dib.GetBits(lpSrcDib); // 找到DIB图象像素起始位置
lSrcWidth = pDoc->m_dib.GetWidth(lpSrcDib); // 获取图象的宽度
lSrcHeight = pDoc->m_dib.GetHeight(lpSrcDib); // 获取图象的高度
lpSrcBitCount = pDoc->m_dib.GetBitCount(lpSrcDib); //获取图像位深
lSrcLineBytes = pDoc->m_dib.GetReqByteWidth(lSrcWidth * lpSrcBitCount); // 计算图象每行的字节数
//
int iTempH;
int iTempW;
int iTempMX;
int iTempMY;
FLOAT fTempC;
FLOAT aValue[25];
// 给模板数组赋初值(为平均模板)
/*aValue[0] = 1;
aValue[1] = 1;
aValue[2] = 1;
aValue[3] = 1;
aValue[4] = 1;
aValue[5] = 1;
aValue[6] = 1;
aValue[7] = 1;
aValue[8] = 1;
// 设定平移量(3*3)
iTempH = 3;
iTempW = 3;
iTempMX = 1;
iTempMY = 1;
fTempC = (FLOAT)(1.0 / 9.0);*/
/*CDlgSmooth dlgPara;
if (dlgPara.DoModal() != IDOK)// 显示对话框
{
return;
}*/
CDlgSmooth dlgPara;
// 给模板数组赋初值(为平均模板)
aValue[0] = 1.0;
aValue[1] = 1.0;
aValue[2] = 1.0;
aValue[3] = 0.0;
aValue[4] = 0.0;
aValue[5] = 1.0;
aValue[6] = 1.0;
aValue[7] = 1.0;
aValue[8] = 0.0;
aValue[9] = 0.0;
aValue[10] = 1.0;
aValue[11] = 1.0;
aValue[12] = 1.0;
aValue[13] = 0.0;
aValue[14] = 0.0;
aValue[15] = 0.0;
aValue[16] = 0.0;
aValue[17] = 0.0;
aValue[18] = 0.0;
aValue[19] = 0.0;
aValue[20] = 0.0;
aValue[21] = 0.0;
aValue[22] = 0.0;
aValue[23] = 0.0;
aValue[24] = 0.0;
// 初始化对话框变量值
dlgPara.m_intType = 0;
dlgPara.m_iTempH = 3;
dlgPara.m_iTempW = 3;
dlgPara.m_iTempMX = 1;
dlgPara.m_iTempMY = 1;
dlgPara.m_fTempC = (FLOAT)(1.0 / 9.0);
dlgPara.m_fpArray = aValue;
// 显示对话框,提示用户设定平移量
if (dlgPara.DoModal() != IDOK)
{
// 返回
return;
}
// 获取用户设定的平移量
iTempH = dlgPara.m_iTempH;
iTempW = dlgPara.m_iTempW;
iTempMX = dlgPara.m_iTempMX;
iTempMY = dlgPara.m_iTempMY;
fTempC = dlgPara.m_fTempC;
// 删除对话框
delete dlgPara;
BeginWaitCursor();
if (Template(lpSrcStartBits, lSrcWidth, lSrcHeight,
iTempH, iTempW, iTempMX, iTempMY, aValue, fTempC))
// 调用Template()函数平滑DIB
{
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
// 更新视图
pDoc->UpdateAllViews(NULL);
}
else
{
// 提示用户
MessageBox(L"分配内存失败!", L"系统提示", MB_ICONINFORMATION | MB_OK);
}
::GlobalUnlock((HGLOBAL)pDoc->GetHObject());
// 恢复光标
EndWaitCursor();
}
void CMFCApplication2View::OnEnhaSharp()//图像锐化 中值滤波
{
CMFCApplication2Doc* pDoc = GetDocument();
long lSrcLineBytes; //图象每行的字节数
long lSrcWidth; //图象的宽度和高度
long lSrcHeight;
int lpSrcBitCount; //图像的位深
LPSTR lpSrcDib; //指向源图象的指针
LPSTR lpSrcStartBits; //指向源像素的指针
lpSrcDib = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->GetHObject());// 锁定DIB
if (!lpSrcDib) return;
/*if (pDoc->m_dib.GetColorNum(lpSrcDib) != 256)// 判断是否是8-bpp位图
{
AfxMessageBox(L"对不起,不是256色位图!");// 警告
::GlobalUnlock((HGLOBAL)pDoc->GetHObject());// 解除锁定
return; //返回
} //判断是否是8-bpp位图,不是则返回*/
lpSrcStartBits = pDoc->m_dib.GetBits(lpSrcDib); // 找到DIB图象像素起始位置
lSrcWidth = pDoc->m_dib.GetWidth(lpSrcDib); // 获取图象的宽度
lSrcHeight = pDoc->m_dib.GetHeight(lpSrcDib); // 获取图象的高度
lpSrcBitCount = pDoc->m_dib.GetBitCount(lpSrcDib); //获取图像位深
lSrcLineBytes = pDoc->m_dib.GetReqByteWidth(lSrcWidth * lpSrcBitCount); // 计算图象每行的字节数
//
// 模板高度
int iTempH;
// 模板宽度
int iTempW;
// 模板系数
FLOAT fTempC;
// 模板中心元素X坐标
int iTempMX;
// 模板中心元素Y坐标
int iTempMY;
// 模板元素数组
FLOAT aValue[9];
// 更改光标形状
BeginWaitCursor();
// 设置拉普拉斯模板参数
iTempW = 3;
iTempH = 3;
fTempC = 1.0;
iTempMX = 1;
iTempMY = 1;
aValue[0] = -1.0;
aValue[1] = -1.0;
aValue[2] = -1.0;
aValue[3] = -1.0;
aValue[4] = 9.0;
aValue[5] = -1.0;
aValue[6] = -1.0;
aValue[7] = -1.0;
aValue[8] = -1.0;
// 调用Template()函数用拉普拉斯模板锐化DIB
if (Template(lpSrcStartBits, lSrcWidth, lSrcHeight,
iTempH, iTempW, iTempMX, iTempMY, aValue, fTempC))
{
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
// 更新视图
pDoc->UpdateAllViews(NULL);
}
else
{
// 提示用户
MessageBox(L"分配内存失败!", L"系统提示", MB_ICONINFORMATION | MB_OK);
}
::GlobalUnlock((HGLOBAL)pDoc->GetHObject());
// 恢复光标
EndWaitCursor();
}
void CMFCApplication2View::OnGaosi()
{
CMFCApplication2Doc* pDoc = GetDocument();
long lSrcLineBytes; //图象每行的字节数
long lSrcWidth; //图象的宽度和高度
long lSrcHeight;
int lpSrcBitCount; //图像的位深
LPSTR lpSrcDib; //指向源图象的指针
LPSTR lpSrcStartBits; //指向源像素的指针
lpSrcDib = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->GetHObject());// 锁定DIB
if (!lpSrcDib) return;
/*if (pDoc->m_dib.GetColorNum(lpSrcDib) != 256)// 判断是否是8-bpp位图
{
AfxMessageBox(L"对不起,不是256色位图!");// 警告
::GlobalUnlock((HGLOBAL)pDoc->GetHObject());// 解除锁定
return; //返回
} //判断是否是8-bpp位图,不是则返回*/
lpSrcStartBits = pDoc->m_dib.GetBits(lpSrcDib); // 找到DIB图象像素起始位置
lSrcWidth = pDoc->m_dib.GetWidth(lpSrcDib); // 获取图象的宽度
lSrcHeight = pDoc->m_dib.GetHeight(lpSrcDib); // 获取图象的高度
lpSrcBitCount = pDoc->m_dib.GetBitCount(lpSrcDib); //获取图像位深
lSrcLineBytes = pDoc->m_dib.GetReqByteWidth(lSrcWidth * lpSrcBitCount); // 计算图象每行的字节数
//
int iTempH;
int iTempW;
int iTempMX;
int iTempMY;
FLOAT fTempC;
FLOAT aValue[9];
// 给模板数组赋初值
aValue[0] = 1;
aValue[1] = 2;
aValue[2] = 1;
aValue[3] = 2;
aValue[4] = 4;
aValue[5] = 2;
aValue[6] = 1;
aValue[7] = 2;
aValue[8] = 1;
// 设定平移量(3*3)
iTempH = 3;
iTempW = 3;
iTempMX = 1;
iTempMY = 1;
fTempC = (FLOAT)(1.0 / 16.0);
BeginWaitCursor();
if (Template(lpSrcStartBits, lSrcWidth, lSrcHeight,
iTempH, iTempW, iTempMX, iTempMY, aValue, fTempC))
// 调用Template()函数平滑DIB
{
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
// 更新视图
pDoc->UpdateAllViews(NULL);
}
else
{
// 提示用户
MessageBox(L"分配内存失败!", L"系统提示", MB_ICONINFORMATION | MB_OK);
}
::GlobalUnlock((HGLOBAL)pDoc->GetHObject());
// 恢复光标
EndWaitCursor();
}
void CMFCApplication2View::Onmorph()
{
CMFCApplication2Doc* pDoc = GetDocument();
long lSrcLineBytes; //图象每行的字节数
long lSrcWidth; //图象的宽度和高度
long lSrcHeight;
int lpSrcBitCount; //图像的位深
LPSTR lpSrcDib; //指向源图象的指针
LPSTR lpSrcStartBits; //指向源像素的指针
lpSrcDib = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->GetHObject());// 锁定DIB
if (!lpSrcDib) return;
/*if (pDoc->m_dib.GetColorNum(lpSrcDib) != 256)// 判断是否是8-bpp位图
{
AfxMessageBox(L"对不起,不是256色位图!");// 警告
::GlobalUnlock((HGLOBAL)pDoc->GetHObject());// 解除锁定
return; //返回
} //判断是否是8-bpp位图,不是则返回*/
lpSrcStartBits = pDoc->m_dib.GetBits(lpSrcDib); // 找到DIB图象像素起始位置
lSrcWidth = pDoc->m_dib.GetWidth(lpSrcDib); // 获取图象的宽度
lSrcHeight = pDoc->m_dib.GetHeight(lpSrcDib); // 获取图象的高度
lpSrcBitCount = pDoc->m_dib.GetBitCount(lpSrcDib); //获取图像位深
lSrcLineBytes = pDoc->m_dib.GetReqByteWidth(lSrcWidth * lpSrcBitCount); // 计算图象每行的字节数
//
int nMode;
// 创建对话框
cDlgMorphErosion dlgPara;
// 初始化变量值
dlgPara.m_nMode = 0;
// 显示对话框,提示用户设定腐蚀方向
if (dlgPara.DoModal() != IDOK)
{
// 返回
return;
}
// 获取用户设定的腐蚀方向
nMode = dlgPara.m_nMode;
int structure[3][3];
if (nMode == 2)
{
structure[0][0] = dlgPara.m_nStructure1;
structure[0][1] = dlgPara.m_nStructure2;
structure[0][2] = dlgPara.m_nStructure3;
structure[1][0] = dlgPara.m_nStructure4;
structure[1][1] = dlgPara.m_nStructure5;
structure[1][2] = dlgPara.m_nStructure6;
structure[2][0] = dlgPara.m_nStructure7;
structure[2][1] = dlgPara.m_nStructure8;
structure[2][2] = dlgPara.m_nStructure9;
}
// 删除对话框
delete dlgPara;
// 更改光标形状
BeginWaitCursor();
if (ErosionDIB(lpSrcStartBits, WIDTHBYTES(lSrcWidth * 8), lSrcHeight, nMode, structure))
{
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
// 更新视图
pDoc->UpdateAllViews(NULL);
}
else
{
// 提示用户
MessageBox(L"分配内存失败或者图像中含有0和255之外的像素值!",L"系统提示", MB_ICONINFORMATION | MB_OK);
}
::GlobalUnlock((HGLOBAL)pDoc->GetHObject());
// 恢复光标
EndWaitCursor();
}
void CMFCApplication2View::OnDilation()
{
CMFCApplication2Doc* pDoc = GetDocument();
long lSrcLineBytes; //图象每行的字节数
long lSrcWidth; //图象的宽度和高度
long lSrcHeight;
int lpSrcBitCount; //图像的位深
LPSTR lpSrcDib; //指向源图象的指针
LPSTR lpSrcStartBits; //指向源像素的指针
lpSrcDib = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->GetHObject());// 锁定DIB
if (!lpSrcDib) return;
/*if (pDoc->m_dib.GetColorNum(lpSrcDib) != 256)// 判断是否是8-bpp位图
{
AfxMessageBox(L"对不起,不是256色位图!");// 警告
::GlobalUnlock((HGLOBAL)pDoc->GetHObject());// 解除锁定
return; //返回
} //判断是否是8-bpp位图,不是则返回*/
lpSrcStartBits = pDoc->m_dib.GetBits(lpSrcDib); // 找到DIB图象像素起始位置
lSrcWidth = pDoc->m_dib.GetWidth(lpSrcDib); // 获取图象的宽度
lSrcHeight = pDoc->m_dib.GetHeight(lpSrcDib); // 获取图象的高度
lpSrcBitCount = pDoc->m_dib.GetBitCount(lpSrcDib); //获取图像位深
lSrcLineBytes = pDoc->m_dib.GetReqByteWidth(lSrcWidth * lpSrcBitCount); // 计算图象每行的字节数
//
int nMode;
cDlgMorphDilation dlgPara;
// 初始化变量值
dlgPara.m_nMode = 0;
// 显示对话框,提示用户设定膨胀方向
if (dlgPara.DoModal() != IDOK)
{
// 返回
return;
}
// 获取用户设定的膨胀方向
nMode = dlgPara.m_nMode;
int structure[3][3];
if (nMode == 2)
{
structure[0][0] = dlgPara.m_nStructure1;
structure[0][1] = dlgPara.m_nStructure2;
structure[0][2] = dlgPara.m_nStructure3;
structure[1][0] = dlgPara.m_nStructure4;
structure[1][1] = dlgPara.m_nStructure5;
structure[1][2] = dlgPara.m_nStructure6;
structure[2][0] = dlgPara.m_nStructure7;
structure[2][1] = dlgPara.m_nStructure8;
structure[2][2] = dlgPara.m_nStructure9;
}
// 删除对话框
delete dlgPara;
// 更改光标形状
BeginWaitCursor();
if (DilationDIB(lpSrcStartBits, WIDTHBYTES(lSrcWidth * 8), lSrcHeight, nMode, structure))
{
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
// 更新视图
pDoc->UpdateAllViews(NULL);
}
else
{
// 提示用户
MessageBox(L"分配内存失败或者图像中含有0和255之外的像素值!",L"系统提示", MB_ICONINFORMATION | MB_OK);
}
::GlobalUnlock((HGLOBAL)pDoc->GetHObject());
// 恢复光标
EndWaitCursor();
}
void CMFCApplication2View::OnOpen()
{
CMFCApplication2Doc* pDoc = GetDocument();
long lSrcLineBytes; //图象每行的字节数
long lSrcWidth; //图象的宽度和高度
long lSrcHeight;
int lpSrcBitCount; //图像的位深
LPSTR lpSrcDib; //指向源图象的指针
LPSTR lpSrcStartBits; //指向源像素的指针
lpSrcDib = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->GetHObject());// 锁定DIB
if (!lpSrcDib) return;
/*if (pDoc->m_dib.GetColorNum(lpSrcDib) != 256)// 判断是否是8-bpp位图
{
AfxMessageBox(L"对不起,不是256色位图!");// 警告
::GlobalUnlock((HGLOBAL)pDoc->GetHObject());// 解除锁定
return; //返回
} //判断是否是8-bpp位图,不是则返回*/
lpSrcStartBits = pDoc->m_dib.GetBits(lpSrcDib); // 找到DIB图象像素起始位置
lSrcWidth = pDoc->m_dib.GetWidth(lpSrcDib); // 获取图象的宽度
lSrcHeight = pDoc->m_dib.GetHeight(lpSrcDib); // 获取图象的高度
lpSrcBitCount = pDoc->m_dib.GetBitCount(lpSrcDib); //获取图像位深
lSrcLineBytes = pDoc->m_dib.GetReqByteWidth(lSrcWidth * lpSrcBitCount); // 计算图象每行的字节数
//
int nMode;
// 创建对话框
cDlgMorphOpen dlgPara;
// 初始化变量值
dlgPara.m_nMode = 0;
// 显示对话框,提示用户设定开运算方向
if (dlgPara.DoModal() != IDOK)
{
// 返回
return;
}
// 获取用户设定的开运算方向
nMode = dlgPara.m_nMode;
int structure[3][3];
if (nMode == 2)
{
structure[0][0] = dlgPara.m_nStructure1;
structure[0][1] = dlgPara.m_nStructure2;
structure[0][2] = dlgPara.m_nStructure3;
structure[1][0] = dlgPara.m_nStructure4;
structure[1][1] = dlgPara.m_nStructure5;
structure[1][2] = dlgPara.m_nStructure6;
structure[2][0] = dlgPara.m_nStructure7;
structure[2][1] = dlgPara.m_nStructure8;
structure[2][2] = dlgPara.m_nStructure9;
}
// 删除对话框
delete dlgPara;
// 更改光标形状
BeginWaitCursor();
if (OpenDIB(lpSrcStartBits, lSrcWidth , lSrcHeight, nMode, structure))
{
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
// 更新视图
pDoc->UpdateAllViews(NULL);
}
else
{
// 提示用户
MessageBox(L"分配内存失败或者图像中含有0和255之外的像素值!",L"系统提示", MB_ICONINFORMATION | MB_OK);
}
::GlobalUnlock((HGLOBAL)pDoc->GetHObject());
// 恢复光标
EndWaitCursor();
}
void CMFCApplication2View::OnClose()
{
CMFCApplication2Doc* pDoc = GetDocument();
long lSrcLineBytes; //图象每行的字节数
long lSrcWidth; //图象的宽度和高度
long lSrcHeight;
int lpSrcBitCount; //图像的位深
LPSTR lpSrcDib; //指向源图象的指针
LPSTR lpSrcStartBits; //指向源像素的指针
lpSrcDib = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->GetHObject());// 锁定DIB
if (!lpSrcDib) return;
/*if (pDoc->m_dib.GetColorNum(lpSrcDib) != 256)// 判断是否是8-bpp位图
{
AfxMessageBox(L"对不起,不是256色位图!");// 警告
::GlobalUnlock((HGLOBAL)pDoc->GetHObject());// 解除锁定
return; //返回
} //判断是否是8-bpp位图,不是则返回*/
lpSrcStartBits = pDoc->m_dib.GetBits(lpSrcDib); // 找到DIB图象像素起始位置
lSrcWidth = pDoc->m_dib.GetWidth(lpSrcDib); // 获取图象的宽度
lSrcHeight = pDoc->m_dib.GetHeight(lpSrcDib); // 获取图象的高度
lpSrcBitCount = pDoc->m_dib.GetBitCount(lpSrcDib); //获取图像位深
lSrcLineBytes = pDoc->m_dib.GetReqByteWidth(lSrcWidth * lpSrcBitCount); // 计算图象每行的字节数
//
int nMode;
cDlgMorphClose dlgPara;
// 初始化变量值
dlgPara.m_nMode = 0;
// 显示对话框,提示用户设定闭运算方向
if (dlgPara.DoModal() != IDOK)
{
// 返回
return;
}
// 获取用户设定的闭运算方向
nMode = dlgPara.m_nMode;
int structure[3][3];
if (nMode == 2)
{
structure[0][0] = dlgPara.m_nStructure1;
structure[0][1] = dlgPara.m_nStructure2;
structure[0][2] = dlgPara.m_nStructure3;
structure[1][0] = dlgPara.m_nStructure4;
structure[1][1] = dlgPara.m_nStructure5;
structure[1][2] = dlgPara.m_nStructure6;
structure[2][0] = dlgPara.m_nStructure7;
structure[2][1] = dlgPara.m_nStructure8;
structure[2][2] = dlgPara.m_nStructure9;
}
// 删除对话框
delete dlgPara;
// 更改光标形状
BeginWaitCursor();
if (CloseDIB(lpSrcStartBits, WIDTHBYTES(lSrcWidth * 8), lSrcHeight, nMode, structure))
{
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
// 更新视图
pDoc->UpdateAllViews(NULL);
}
else
{
// 提示用户
MessageBox(L"分配内存失败或者图像中含有0和255之外的像素值!", L"系统提示", MB_ICONINFORMATION | MB_OK);
}
// 解除锁定
::GlobalUnlock((HGLOBAL)pDoc->GetHObject());
// 恢复光标
EndWaitCursor();
}
void CMFCApplication2View::OnErzhihua()
{
CMFCApplication2Doc* pDoc = GetDocument();
long lSrcLineBytes; //图象每行的字节数
long lSrcWidth; //图象的宽度和高度
long lSrcHeight;
int lpSrcBitCount; //图像的位深
LPSTR lpSrcDib; //指向源图象的指针
LPSTR lpSrcStartBits; //指向源像素的指针
lpSrcDib = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->GetHObject());// 锁定DIB
if (!lpSrcDib) return;
/*if (pDoc->m_dib.GetColorNum(lpSrcDib) != 256)// 判断是否是8-bpp位图
{
AfxMessageBox(L"对不起,不是256色位图!");// 警告
::GlobalUnlock((HGLOBAL)pDoc->GetHObject());// 解除锁定
return; //返回
} //判断是否是8-bpp位图,不是则返回*/
lpSrcStartBits = pDoc->m_dib.GetBits(lpSrcDib); // 找到DIB图象像素起始位置
lSrcWidth = pDoc->m_dib.GetWidth(lpSrcDib); // 获取图象的宽度
lSrcHeight = pDoc->m_dib.GetHeight(lpSrcDib); // 获取图象的高度
lpSrcBitCount = pDoc->m_dib.GetBitCount(lpSrcDib); //获取图像位深
lSrcLineBytes = pDoc->m_dib.GetReqByteWidth(lSrcWidth * lpSrcBitCount); // 计算图象每行的字节数
//
int bThre;
CDlgErzhihua dlgPara;
dlgPara.m_fazhi = 0;
if (dlgPara.DoModal() != IDOK)
{
// 返回
return;
}
bThre = dlgPara.m_fazhi;
ThresholdTrans(lpSrcStartBits, lSrcWidth, lSrcHeight, bThre);
pDoc->SetModifiedFlag(TRUE);
pDoc->UpdateAllViews(NULL);
::GlobalUnlock((HGLOBAL)pDoc->GetHObject());
}
void CMFCApplication2View::OnRestoreSaltnoise()
{
CMFCApplication2Doc* pDoc = GetDocument();
long lSrcLineBytes; //图象每行的字节数
long lSrcWidth; //图象的宽度和高度
long lSrcHeight;
int lpSrcBitCount; //图像的位深
LPSTR lpSrcDib; //指向源图象的指针
LPSTR lpSrcStartBits; //指向源像素的指针
lpSrcDib = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->GetHObject());// 锁定DIB
if (!lpSrcDib) return;
lpSrcStartBits = pDoc->m_dib.GetBits(lpSrcDib); // 找到DIB图象像素起始位置
lSrcWidth = pDoc->m_dib.GetWidth(lpSrcDib); // 获取图象的宽度
lSrcHeight = pDoc->m_dib.GetHeight(lpSrcDib); // 获取图象的高度
lpSrcBitCount = pDoc->m_dib.GetBitCount(lpSrcDib); //获取图像位深
lSrcLineBytes = pDoc->m_dib.GetReqByteWidth(lSrcWidth * lpSrcBitCount); // 计算图象每行的字节数
//
// 更改光标形状
BeginWaitCursor();
// 找到DIB图像象素起始位置
// 调用SaltNoiseDIB()函数对DIB进行加噪处理
if (SaltNoiseDIB(lpSrcStartBits, lSrcWidth, lSrcHeight))
{
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
// 更新视图
pDoc->UpdateAllViews(NULL);
}
else
{
// 提示用户
MessageBox(L"分配内存失败!", L"系统提示", MB_ICONINFORMATION | MB_OK);
}
// 解除锁定
::GlobalUnlock((HGLOBAL)pDoc->GetHObject());
// 恢复光标
EndWaitCursor();
}
void CMFCApplication2View::OnRestoreRandomnoise()
{
CMFCApplication2Doc* pDoc = GetDocument();
long lSrcLineBytes; //图象每行的字节数
long lSrcWidth; //图象的宽度和高度
long lSrcHeight;
int lpSrcBitCount; //图像的位深
LPSTR lpSrcDib; //指向源图象的指针
LPSTR lpSrcStartBits; //指向源像素的指针
lpSrcDib = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->GetHObject());// 锁定DIB
if (!lpSrcDib) return;
lpSrcStartBits = pDoc->m_dib.GetBits(lpSrcDib); // 找到DIB图象像素起始位置
lSrcWidth = pDoc->m_dib.GetWidth(lpSrcDib); // 获取图象的宽度
lSrcHeight = pDoc->m_dib.GetHeight(lpSrcDib); // 获取图象的高度
lpSrcBitCount = pDoc->m_dib.GetBitCount(lpSrcDib); //获取图像位深
lSrcLineBytes = pDoc->m_dib.GetReqByteWidth(lSrcWidth * lpSrcBitCount); // 计算图象每行的字节数
//
// 更改光标形状
BeginWaitCursor();
// 找到DIB图像象素起始位置
// 调用SaltNoiseDIB()函数对DIB进行加噪处理
if (RandomNoiseDIB(lpSrcStartBits, lSrcWidth, lSrcHeight))
{
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
// 更新视图
pDoc->UpdateAllViews(NULL);
}
else
{
// 提示用户
MessageBox(L"分配内存失败!", L"系统提示", MB_ICONINFORMATION | MB_OK);
}
// 解除锁定
::GlobalUnlock((HGLOBAL)pDoc->GetHObject());
// 恢复光标
EndWaitCursor();
}
void CMFCApplication2View::OnPointThre()
{
CMFCApplication2Doc* pDoc = GetDocument();
long lSrcLineBytes; //图象每行的字节数
long lSrcWidth; //图象的宽度和高度
long lSrcHeight;
int lpSrcBitCount; //图像的位深
LPSTR lpSrcDib; //指向源图象的指针
LPSTR lpSrcStartBits; //指向源像素的指针
lpSrcDib = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->GetHObject());// 锁定DIB
if (!lpSrcDib) return;
lpSrcStartBits = pDoc->m_dib.GetBits(lpSrcDib); // 找到DIB图象像素起始位置
lSrcWidth = pDoc->m_dib.GetWidth(lpSrcDib); // 获取图象的宽度
lSrcHeight = pDoc->m_dib.GetHeight(lpSrcDib); // 获取图象的高度
lpSrcBitCount = pDoc->m_dib.GetBitCount(lpSrcDib); //获取图像位深
lSrcLineBytes = pDoc->m_dib.GetReqByteWidth(lSrcWidth * lpSrcBitCount); // 计算图象每行的字节数
//
CDlgPointThre dlgPara;
// 阈值
BYTE bThre;
int s=0;
// 初始化变量值
dlgPara.m_bThre = 128;
dlgPara.m_lpSrcStartBits = lpSrcStartBits;
dlgPara.m_lSrcHeight = lSrcHeight;
dlgPara.m_lSrcWidth = lSrcWidth;
// 显示对话框,提示用户设定阈值
if (dlgPara.DoModal() != IDOK)
{
// 返回
return;
}
bThre = dlgPara.m_bThre;
BeginWaitCursor();
// 删除对话框
delete dlgPara;
// 更改光标形状
BeginWaitCursor();
// 调用ThresholdTrans()函数进行阈值变换
ThresholdTrans(lpSrcStartBits, lSrcWidth, lSrcHeight, bThre);
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
// 更新视图
pDoc->UpdateAllViews(NULL);
// 解除锁定
::GlobalUnlock((HGLOBAL)pDoc->GetHObject());
// 恢复光标
EndWaitCursor();
}
void CMFCApplication2View::OnPointStre()
{
CMFCApplication2Doc* pDoc = GetDocument();
long lSrcLineBytes; //图象每行的字节数
long lSrcWidth; //图象的宽度和高度
long lSrcHeight;
int lpSrcBitCount; //图像的位深
LPSTR lpSrcDib; //指向源图象的指针
LPSTR lpSrcStartBits; //指向源像素的指针
lpSrcDib = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->GetHObject());// 锁定DIB
if (!lpSrcDib) return;
lpSrcStartBits = pDoc->m_dib.GetBits(lpSrcDib); // 找到DIB图象像素起始位置
lSrcWidth = pDoc->m_dib.GetWidth(lpSrcDib); // 获取图象的宽度
lSrcHeight = pDoc->m_dib.GetHeight(lpSrcDib); // 获取图象的高度
lpSrcBitCount = pDoc->m_dib.GetBitCount(lpSrcDib); //获取图像位深
lSrcLineBytes = pDoc->m_dib.GetReqByteWidth(lSrcWidth * lpSrcBitCount); // 计算图象每行的字节数
//
CDlgPointStre dlgPara;
// 点1坐标
BYTE bX1;
BYTE bY1;
// 点2坐标
BYTE bX2;
BYTE bY2;
// 初始化变量值
dlgPara.m_bX1 = 50;
dlgPara.m_bY1 = 30;
dlgPara.m_bX2 = 200;
dlgPara.m_bY2 = 220;
// 显示对话框,提示用户设定拉伸位置
if (dlgPara.DoModal() != IDOK)
{
// 返回
return;
}
// 获取用户的设定
bX1 = dlgPara.m_bX1;
bY1 = dlgPara.m_bY1;
bX2 = dlgPara.m_bX2;
bY2 = dlgPara.m_bY2;
// 删除对话框
delete dlgPara;
// 更改光标形状
BeginWaitCursor();
// 调用GrayStretch()函数进行灰度拉伸
GrayStretch(lpSrcStartBits, lSrcWidth, lSrcHeight, bX1, bY1, bX2, bY2);
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
// 更新视图
pDoc->UpdateAllViews(NULL);
// 解除锁定
::GlobalUnlock((HGLOBAL)pDoc->GetHObject());
// 恢复光标
EndWaitCursor();
}
void CMFCApplication2View::OnGeomTran()
{
CMFCApplication2Doc* pDoc = GetDocument();
long lSrcLineBytes; //图象每行的字节数
long lSrcWidth; //图象的宽度和高度
long lSrcHeight;
int lpSrcBitCount; //图像的位深
LPSTR lpSrcDib; //指向源图象的指针
LPSTR lpSrcStartBits; //指向源像素的指针
lpSrcDib = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->GetHObject());// 锁定DIB
if (!lpSrcDib) return;
lpSrcStartBits = pDoc->m_dib.GetBits(lpSrcDib); // 找到DIB图象像素起始位置
lSrcWidth = pDoc->m_dib.GetWidth(lpSrcDib); // 获取图象的宽度
lSrcHeight = pDoc->m_dib.GetHeight(lpSrcDib); // 获取图象的高度
lpSrcBitCount = pDoc->m_dib.GetBitCount(lpSrcDib); //获取图像位深
lSrcLineBytes = pDoc->m_dib.GetReqByteWidth(lSrcWidth * lpSrcBitCount); // 计算图象每行的字节数
//
LONG lXOffset;
LONG lYOffset;
// 创建对话框
CDlgGeoTran dlgPara;
// 初始化变量值
dlgPara.m_XOffset = 100;
dlgPara.m_YOffset = 100;
// 显示对话框,提示用户设定平移量
if (dlgPara.DoModal() != IDOK)
{
// 返回
return;
}
// 获取用户设定的平移量
lXOffset = dlgPara.m_XOffset;
lYOffset = dlgPara.m_YOffset;
// 删除对话框
delete dlgPara;
// 更改光标形状
BeginWaitCursor();
if (lpSrcBitCount == 8)// 判断是否是8-bpp位图
{
if (TranslationDIB(lpSrcStartBits, lSrcWidth, lSrcHeight, lXOffset, lYOffset))
{
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
// 更新视图
pDoc->UpdateAllViews(NULL);
}
else
{
// 提示用户
MessageBox(L"分配内存失败!", L"系统提示", MB_ICONINFORMATION | MB_OK);
}
}
if (lpSrcBitCount == 24)// 判断是否是24-bpp位图
{
if (TranslationDIB24(lpSrcStartBits, lSrcWidth, lSrcHeight, lXOffset, lYOffset))
{
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
// 更新视图
pDoc->UpdateAllViews(NULL);
}
else
{
// 提示用户
MessageBox(L"分配内存失败!", L"系统提示", MB_ICONINFORMATION | MB_OK);
}
}
// 解除锁定
::GlobalUnlock((HGLOBAL)pDoc->GetHObject());
// 恢复光标
EndWaitCursor();
}
void CMFCApplication2View::OnGeomMirv()
{
CMFCApplication2Doc* pDoc = GetDocument();
long lSrcLineBytes; //图象每行的字节数
long lSrcWidth; //图象的宽度和高度
long lSrcHeight;
int lpSrcBitCount; //图像的位深
LPSTR lpSrcDib; //指向源图象的指针
LPSTR lpSrcStartBits; //指向源像素的指针
lpSrcDib = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->GetHObject());// 锁定DIB
if (!lpSrcDib) return;
lpSrcStartBits = pDoc->m_dib.GetBits(lpSrcDib); // 找到DIB图象像素起始位置
lSrcWidth = pDoc->m_dib.GetWidth(lpSrcDib); // 获取图象的宽度
lSrcHeight = pDoc->m_dib.GetHeight(lpSrcDib); // 获取图象的高度
lpSrcBitCount = pDoc->m_dib.GetBitCount(lpSrcDib); //获取图像位深
lSrcLineBytes = pDoc->m_dib.GetReqByteWidth(lSrcWidth * lpSrcBitCount); // 计算图象每行的字节数
//
LONG lXOffset;
LONG lYOffset;
// 更改光标形状
BeginWaitCursor();
// 调用MirrorDIB()函数垂直镜像DIB
if (MirrorDIB(lpSrcStartBits, lSrcWidth, lSrcHeight, FALSE))
{
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
// 更新视图
pDoc->UpdateAllViews(NULL);
}
else
{
// 提示用户
MessageBox(L"分配内存失败!", L"系统提示", MB_ICONINFORMATION | MB_OK);
}
// 解除锁定
::GlobalUnlock((HGLOBAL)pDoc->GetHObject());
// 恢复光标
EndWaitCursor();
}
void CMFCApplication2View::OnGeomMirh()
{
CMFCApplication2Doc* pDoc = GetDocument();
long lSrcLineBytes; //图象每行的字节数
long lSrcWidth; //图象的宽度和高度
long lSrcHeight;
int lpSrcBitCount; //图像的位深
LPSTR lpSrcDib; //指向源图象的指针
LPSTR lpSrcStartBits; //指向源像素的指针
lpSrcDib = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->GetHObject());// 锁定DIB
if (!lpSrcDib) return;
lpSrcStartBits = pDoc->m_dib.GetBits(lpSrcDib); // 找到DIB图象像素起始位置
lSrcWidth = pDoc->m_dib.GetWidth(lpSrcDib); // 获取图象的宽度
lSrcHeight = pDoc->m_dib.GetHeight(lpSrcDib); // 获取图象的高度
lpSrcBitCount = pDoc->m_dib.GetBitCount(lpSrcDib); //获取图像位深
lSrcLineBytes = pDoc->m_dib.GetReqByteWidth(lSrcWidth * lpSrcBitCount); // 计算图象每行的字节数
//
LONG lXOffset;
LONG lYOffset;
// 更改光标形状
BeginWaitCursor();
if (lpSrcBitCount == 8)// 判断是否是8-bpp位图
{
if (MirrorDIB(lpSrcStartBits, lSrcWidth, lSrcHeight, TRUE))
{
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
// 更新视图
pDoc->UpdateAllViews(NULL);
}
else
{
// 提示用户
MessageBox(L"分配内存失败!", L"系统提示", MB_ICONINFORMATION | MB_OK);
}
}
if (lpSrcBitCount == 24)// 判断是否是24-bpp位图
{
if (MirrorDIB24(lpSrcStartBits, lSrcWidth, lSrcHeight, TRUE))
{
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
// 更新视图
pDoc->UpdateAllViews(NULL);
}
else
{
// 提示用户
MessageBox(L"分配内存失败!", L"系统提示", MB_ICONINFORMATION | MB_OK);
}
}
// 调用MirrorDIB()函数垂直镜像DIB
// 解除锁定
::GlobalUnlock((HGLOBAL)pDoc->GetHObject());
// 恢复光标
EndWaitCursor();
}
void CMFCApplication2View::OnGeomZoom()
{
CMFCApplication2Doc* pDoc = GetDocument();
long lSrcLineBytes; //图象每行的字节数
long lSrcWidth; //图象的宽度和高度
long lSrcHeight;
int lpSrcBitCount; //图像的位深
LPSTR lpSrcDib; //指向源图象的指针
LPSTR lpSrcStartBits; //指向源像素的指针
lpSrcDib = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->GetHObject());// 锁定DIB
if (!lpSrcDib) return;
lpSrcStartBits = pDoc->m_dib.GetBits(lpSrcDib); // 找到DIB图象像素起始位置
lSrcWidth = pDoc->m_dib.GetWidth(lpSrcDib); // 获取图象的宽度
lSrcHeight = pDoc->m_dib.GetHeight(lpSrcDib); // 获取图象的高度
lpSrcBitCount = pDoc->m_dib.GetBitCount(lpSrcDib); //获取图像位深
lSrcLineBytes = pDoc->m_dib.GetReqByteWidth(lSrcWidth * lpSrcBitCount); // 计算图象每行的字节数
//
// 缩放比率
float fXZoomRatio;
float fYZoomRatio;
// 创建对话框
CDlgGeoZoom dlgPara;
// 初始化变量值
dlgPara.m_XZoom = 0.5;
dlgPara.m_YZoom = 0.5;
// 显示对话框,提示用户设定平移量
if (dlgPara.DoModal() != IDOK)
{
// 返回
return;
}
// 获取用户设定的平移量
fXZoomRatio = dlgPara.m_XZoom;
fYZoomRatio = dlgPara.m_YZoom;
// 删除对话框
delete dlgPara;
// 创建新DIB
HDIB hNewDIB = NULL;
// 更改光标形状
BeginWaitCursor();
if (lpSrcBitCount == 8)// 判断是否是8-bpp位图
{
hNewDIB = (HDIB)ZoomDIB(lpSrcDib, lpSrcStartBits, lSrcWidth, lSrcHeight, fXZoomRatio, fYZoomRatio);
}
if (lpSrcBitCount == 24)// 判断是否是24-bpp位图
{
hNewDIB = (HDIB)ZoomDIB24(lpSrcDib, lpSrcStartBits, lSrcWidth, lSrcHeight, fXZoomRatio, fYZoomRatio);
}
// 调用ZoomDIB()函数转置DIB
//hNewDIB = (HDIB)ZoomDIB(lpSrcDib, lpSrcStartBits,lSrcWidth, lSrcHeight,fXZoomRatio, fYZoomRatio);
// 判断缩放是否成功
if (hNewDIB != NULL)
{
pDoc->UpdateObject(hNewDIB);
// 更新DIB大小和调色板
pDoc->SetDib();
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
// 重新设置滚动视图大小
//SetScrollSizes(MM_TEXT, pDoc->GetDocSize());
// 更新视图
pDoc->UpdateAllViews(NULL);
}
else
{
// 提示用户
MessageBox(L"分配内存失败!", L"系统提示", MB_ICONINFORMATION | MB_OK);
}
// 解除锁定
::GlobalUnlock((HGLOBAL)pDoc->GetHObject());
// 恢复光标
EndWaitCursor();
}
void CMFCApplication2View::OnPointWind()
{
CMFCApplication2Doc* pDoc = GetDocument();
long lSrcLineBytes; //图象每行的字节数
long lSrcWidth; //图象的宽度和高度
long lSrcHeight;
int lpSrcBitCount; //图像的位深
LPSTR lpSrcDib; //指向源图象的指针
LPSTR lpSrcStartBits; //指向源像素的指针
lpSrcDib = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->GetHObject());// 锁定DIB
if (!lpSrcDib) return;
lpSrcStartBits = pDoc->m_dib.GetBits(lpSrcDib); // 找到DIB图象像素起始位置
lSrcWidth = pDoc->m_dib.GetWidth(lpSrcDib); // 获取图象的宽度
lSrcHeight = pDoc->m_dib.GetHeight(lpSrcDib); // 获取图象的高度
lpSrcBitCount = pDoc->m_dib.GetBitCount(lpSrcDib); //获取图像位深
lSrcLineBytes = pDoc->m_dib.GetReqByteWidth(lSrcWidth * lpSrcBitCount); // 计算图象每行的字节数
//
// 创建对话框
CDlgPointWin dlgPara;
// 窗口下限
BYTE bLow;
// 窗口上限
BYTE bUp;
// 初始化变量值
dlgPara.m_bLow = 0;
dlgPara.m_bUp = 255;
// 显示对话框,提示用户设定窗口上下限
if (dlgPara.DoModal() != IDOK)
{
// 返回
return;
}
// 获取用户设定的窗口上下限
bLow = dlgPara.m_bLow;
bUp = dlgPara.m_bUp;
// 删除对话框
delete dlgPara;
// 更改光标形状
BeginWaitCursor();
// 调用WindowTrans()函数进行窗口变换
WindowTrans(lpSrcStartBits, lSrcWidth, lSrcHeight, bLow, bUp);
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
// 更新视图
pDoc->UpdateAllViews(NULL);
// 解除锁定
::GlobalUnlock((HGLOBAL)pDoc->GetHObject());
// 恢复光标
EndWaitCursor();
}
void CMFCApplication2View::OnZdylj()
{
CMFCApplication2Doc* pDoc = GetDocument();
long lSrcLineBytes; //图象每行的字节数
long lSrcWidth; //图象的宽度和高度
long lSrcHeight;
int lpSrcBitCount; //图像的位深
LPSTR lpSrcDib; //指向源图象的指针
LPSTR lpSrcStartBits; //指向源像素的指针
lpSrcDib = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->GetHObject());// 锁定DIB
if (!lpSrcDib) return;
lpSrcStartBits = pDoc->m_dib.GetBits(lpSrcDib); // 找到DIB图象像素起始位置
lSrcWidth = pDoc->m_dib.GetWidth(lpSrcDib); // 获取图象的宽度
lSrcHeight = pDoc->m_dib.GetHeight(lpSrcDib); // 获取图象的高度
lpSrcBitCount = pDoc->m_dib.GetBitCount(lpSrcDib); //获取图像位深
lSrcLineBytes = pDoc->m_dib.GetReqByteWidth(lSrcWidth * lpSrcBitCount); // 计算图象每行的字节数
//
// 模板元素数组
FLOAT aValue[9];
int type;
CDlgZdylvjing dlgPara;
aValue[0] = 1.0;
aValue[1] = 1.0;
aValue[2] = 1.0;
aValue[3] = 0.0;
aValue[4] = 0.0;
aValue[5] = 1.0;
aValue[6] = 1.0;
aValue[7] = 1.0;
aValue[8] = 0.0;
dlgPara.m_fTempC = (FLOAT)(1.0 / 9.0);
dlgPara.m_fpArray = aValue;
dlgPara.m_pDoc = pDoc;
dlgPara.m_bThre = 128;
// 显示对话框,提示用户设定窗口上下限
if (dlgPara.DoModal() != IDOK)
{
// 返回
return;
}
// 更改光标形状
BeginWaitCursor();
//ZDYLJ(lpSrcStartBits, lSrcWidth, lSrcHeight, dlgPara.m_intType);
delete dlgPara;
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
// 更新视图
pDoc->UpdateAllViews(NULL);
// 解除锁定
::GlobalUnlock((HGLOBAL)pDoc->GetHObject());
// 恢复光标
EndWaitCursor();
}
void CMFCApplication2View::OnGeomRota()
{
CMFCApplication2Doc* pDoc = GetDocument();
long lSrcLineBytes; //图象每行的字节数
long lSrcWidth; //图象的宽度和高度
long lSrcHeight;
int lpSrcBitCount; //图像的位深
LPSTR lpSrcDib; //指向源图象的指针
LPSTR lpSrcStartBits; //指向源像素的指针
lpSrcDib = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->GetHObject());// 锁定DIB
if (!lpSrcDib) return;
lpSrcStartBits = pDoc->m_dib.GetBits(lpSrcDib); // 找到DIB图象像素起始位置
lSrcWidth = pDoc->m_dib.GetWidth(lpSrcDib); // 获取图象的宽度
lSrcHeight = pDoc->m_dib.GetHeight(lpSrcDib); // 获取图象的高度
lpSrcBitCount = pDoc->m_dib.GetBitCount(lpSrcDib); //获取图像位深
lSrcLineBytes = pDoc->m_dib.GetReqByteWidth(lSrcWidth * lpSrcBitCount); // 计算图象每行的字节数
//
// 缩放比率
int iRotateAngle;
// 创建对话框
CDlgGeoRota dlgPara;
// 初始化变量值
dlgPara.m_iRotateAngle = 90;
// 显示对话框,提示用户设定旋转角度
if (dlgPara.DoModal() != IDOK)
{
// 返回
return;
}
// 获取用户设定的平移量
iRotateAngle = dlgPara.m_iRotateAngle;
// 删除对话框
delete dlgPara;
// 创建新DIB
HDIB hNewDIB = NULL;
// 更改光标形状
BeginWaitCursor();
if (lpSrcBitCount == 8)// 判断是否是8-bpp位图
{
hNewDIB = (HDIB)RotateDIB(lpSrcDib, iRotateAngle);
}
if (lpSrcBitCount == 24)// 判断是否是24-bpp位图
{
hNewDIB = (HDIB)RotateDIB24(lpSrcDib, iRotateAngle);
}
// 调用RotateDIB()函数旋转DIB
//hNewDIB = (HDIB)RotateDIB(lpSrcDib, iRotateAngle);
// 判断旋转是否成功
if (hNewDIB != NULL)
{
pDoc->UpdateObject(hNewDIB);
// 更新DIB大小和调色板
pDoc->SetDib();
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
// 重新设置滚动视图大小
//SetScrollSizes(MM_TEXT, pDoc->GetDocSize());
// 更新视图
pDoc->UpdateAllViews(NULL);
}
else
{
// 提示用户
MessageBox(L"分配内存失败!", L"系统提示", MB_ICONINFORMATION | MB_OK);
}
// 解除锁定
::GlobalUnlock((HGLOBAL)pDoc->GetHObject());
// 恢复光标
EndWaitCursor();
}
void CMFCApplication2View::OnAreac()
{
CMFCApplication2Doc* pDoc = GetDocument();
long lSrcLineBytes; //图象每行的字节数
long lSrcWidth; //图象的宽度和高度
long lSrcHeight;
int lpSrcBitCount; //图像的位深
LPSTR lpSrcDib; //指向源图象的指针
LPSTR lpSrcStartBits; //指向源像素的指针
lpSrcDib = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->GetHObject());// 锁定DIB
if (!lpSrcDib) return;
lpSrcStartBits = pDoc->m_dib.GetBits(lpSrcDib); // 找到DIB图象像素起始位置
lSrcWidth = pDoc->m_dib.GetWidth(lpSrcDib); // 获取图象的宽度
lSrcHeight = pDoc->m_dib.GetHeight(lpSrcDib); // 获取图象的高度
lpSrcBitCount = pDoc->m_dib.GetBitCount(lpSrcDib); //获取图像位深
lSrcLineBytes = pDoc->m_dib.GetReqByteWidth(lSrcWidth * lpSrcBitCount); // 计算图象每行的字节数
//
int my_number = 0;
double my_area = 0;
double my_meter;
double my_circle;
double my_square;
// 更改光标形状
BeginWaitCursor();
int colo, lian;
CDlgAREACOUNT dlgPara;
if (dlgPara.DoModal() != IDOK)
{
// 返回
return;
}
delete dlgPara;
lian = dlgPara.m_lian;
colo = dlgPara.m_color;
int s = 1;
if (lian == 4 )
{
/*FLOAT fA = -1.0;
FLOAT fB = 255;
LinerTrans(lpSrcStartBits, lSrcWidth, lSrcHeight, fA, fB);*/
if(colo == 1)
{
my_number = dealer_four(lpSrcStartBits, lSrcWidth, lSrcHeight, 0);
my_area = getArea_four(lpSrcStartBits, lSrcWidth, lSrcHeight, 0);
my_meter = sqrt(my_area / 3.14) * 2 * 3.14;
my_circle = (4 * PI * my_area) / (my_meter * my_meter); //0.6868*my_meter*my_meter / my_area;
my_square = 0.5483*my_circle;
}
if(colo == 2)
{
my_number = dealer_four(lpSrcStartBits, lSrcWidth, lSrcHeight, 255);
my_area = getArea_four(lpSrcStartBits, lSrcWidth, lSrcHeight, 255);
my_meter = sqrt(my_area / 3.14) * 2 * 3.14;
my_circle =( 4 * PI * my_area) / (my_meter * my_meter);
my_square = 0.5483*my_circle;
}
if (colo == 3)
{
unsigned char* img;
int black = 0, white = 0;
for (int i = 0; i < lSrcHeight; i++) {
for (int j = 0; j < lSrcWidth; j++) {
img = (unsigned char*)lpSrcStartBits + lSrcLineBytes * (lSrcHeight - 1 - i) + j;//i行j列
if (*img == 0)
black++;
else
white++;
}
}
if (black >= white)//白
{
my_number = dealer_four(lpSrcStartBits, lSrcWidth, lSrcHeight, 255);
my_area = getArea_four(lpSrcStartBits, lSrcWidth, lSrcHeight, 255);
my_meter = sqrt(my_area / 3.14) * 2 * 3.14;
my_circle =( 4 * PI* my_area )/ (my_meter * my_meter);
my_square = 0.5483 * my_circle;
}
else//黑
{
my_number = dealer_four(lpSrcStartBits, lSrcWidth, lSrcHeight, 0);
my_area = getArea_four(lpSrcStartBits, lSrcWidth, lSrcHeight, 0);
my_meter = sqrt(my_area / 3.14) * 2 * 3.14;
my_circle = 4 * PI * my_area / (my_meter * my_meter);
my_square = 0.5483 * my_circle;
}
}
}
if (lian == 8)
{
if (colo == 1)
{
my_number = dealer_eight(lpSrcStartBits, lSrcWidth, lSrcHeight, 0);
my_area = getArea_eight(lpSrcStartBits, lSrcWidth, lSrcHeight, 0);
my_meter = sqrt(my_area / 3.14) * 2 * 3.14;
my_circle = 4 * PI * my_area / (my_meter * my_meter);
my_square = 0.5483 * my_circle;
}
if (colo == 2)
{
my_number = dealer_eight(lpSrcStartBits, lSrcWidth, lSrcHeight, 255);
my_area = getArea_eight(lpSrcStartBits, lSrcWidth, lSrcHeight, 255);
my_meter = sqrt(my_area / 3.14) * 2 * 3.14;
my_circle = 4 * PI * my_area / (my_meter * my_meter);
my_square = 0.5483 * my_circle;
}
if (colo == 3)
{
unsigned char* img;
int black = 0, white = 0;
for (int i = 0; i < lSrcHeight; i++) {
for (int j = 0; j < lSrcWidth; j++) {
img = (unsigned char*)lpSrcStartBits + lSrcLineBytes * (lSrcHeight - 1 - i) + j;//i行j列
if (*img == 0)
black++;
else
white++;
}
}
if (black >= white)//白
{
my_number = dealer_eight(lpSrcStartBits, lSrcWidth, lSrcHeight, 255);
my_area = getArea_eight(lpSrcStartBits, lSrcWidth, lSrcHeight, 255);
my_meter = sqrt(my_area / 3.14) * 2 * 3.14;
my_circle = 4 * PI * my_area / (my_meter * my_meter);
my_square = 0.5483 * my_circle;
}
else//黑
{
my_number = dealer_eight(lpSrcStartBits, lSrcWidth, lSrcHeight, 0);
my_area = getArea_eight(lpSrcStartBits, lSrcWidth, lSrcHeight, 0);
my_meter = sqrt(my_area / 3.14) * 2 * 3.14;
my_circle = 4 * PI * my_area / (my_meter * my_meter);
my_square = 0.5483 * my_circle;
}
}
}
//分割迭代法 反色 提取 生长
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
// 更新视图
pDoc->UpdateAllViews(NULL);
// 解除锁定
::GlobalUnlock((HGLOBAL)pDoc->GetHObject());
// 恢复光标
EndWaitCursor();
BeginWaitCursor();
CDlgACRESULT dlg;
dlg.m_Num = my_number;
dlg.m_mSquare = my_area;
dlg.m_mCmeter =my_meter;
dlg.m_circle = my_circle;
dlg.m_square = my_square;
dlg.m_x = heartx(lSrcWidth, lSrcHeight, my_area);
dlg.m_y = gethearty(lSrcWidth, lSrcHeight, my_area);
if (dlg.DoModal() != IDOK)
{
// 返回
return;
}
// 解除锁定
::GlobalUnlock((HGLOBAL)pDoc->GetHObject());
}
void CMFCApplication2View::Onjunheng()
{
CMFCApplication2Doc* pDoc = GetDocument();
long lSrcLineBytes; //图象每行的字节数
long lSrcWidth; //图象的宽度和高度
long lSrcHeight;
int lpSrcBitCount; //图像的位深
LPSTR lpSrcDib; //指向源图象的指针
LPSTR lpSrcStartBits; //指向源像素的指针
lpSrcDib = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->GetHObject());// 锁定DIB
if (!lpSrcDib) return;
lpSrcStartBits = pDoc->m_dib.GetBits(lpSrcDib); // 找到DIB图象像素起始位置
lSrcWidth = pDoc->m_dib.GetWidth(lpSrcDib); // 获取图象的宽度
lSrcHeight = pDoc->m_dib.GetHeight(lpSrcDib); // 获取图象的高度
lpSrcBitCount = pDoc->m_dib.GetBitCount(lpSrcDib); //获取图像位深
lSrcLineBytes = pDoc->m_dib.GetReqByteWidth(lSrcWidth * lpSrcBitCount); // 计算图象每行的字节数
//
// 更改光标形状
BeginWaitCursor();
InteEqualize(lpSrcStartBits, lSrcWidth, lSrcHeight);
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
// 更新视图
pDoc->UpdateAllViews(NULL);
// 解除锁定
::GlobalUnlock((HGLOBAL)pDoc->GetHObject());
// 恢复光标
EndWaitCursor();
}
void CMFCApplication2View::OnWaterp()
{
CMFCApplication2Doc* pDoc = GetDocument();
long lSrcLineBytes; //图象每行的字节数
long lSrcWidth; //图象的宽度和高度
long lSrcHeight;
int lpSrcBitCount; //图像的位深
LPSTR lpSrcDib; //指向源图象的指针
LPSTR lpSrcStartBits; //指向源像素的指针
lpSrcDib = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->GetHObject());// 锁定DIB
if (!lpSrcDib) return;
lpSrcStartBits = pDoc->m_dib.GetBits(lpSrcDib); // 找到DIB图象像素起始位置
lSrcWidth = pDoc->m_dib.GetWidth(lpSrcDib); // 获取图象的宽度
lSrcHeight = pDoc->m_dib.GetHeight(lpSrcDib); // 获取图象的高度
lpSrcBitCount = pDoc->m_dib.GetBitCount(lpSrcDib); //获取图像位深
lSrcLineBytes = pDoc->m_dib.GetReqByteWidth(lSrcWidth * lpSrcBitCount); // 计算图象每行的字节数
//
// 更改光标形状
BeginWaitCursor();
CDlgStyle dlg;
dlg.m_style = 40;
if (dlg.DoModal() != IDOK)
{
// 返回
return;
}
int s = dlg.m_style;
Waterpaint(lpSrcStartBits, lSrcWidth, lSrcHeight,s);
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
// 更新视图
pDoc->UpdateAllViews(NULL);
// 解除锁定
::GlobalUnlock((HGLOBAL)pDoc->GetHObject());
// 恢复光标
EndWaitCursor();
}
void CMFCApplication2View::OnOilp()
{
CMFCApplication2Doc* pDoc = GetDocument();
long lSrcLineBytes; //图象每行的字节数
long lSrcWidth; //图象的宽度和高度
long lSrcHeight;
int lpSrcBitCount; //图像的位深
LPSTR lpSrcDib; //指向源图象的指针
LPSTR lpSrcStartBits; //指向源像素的指针
lpSrcDib = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->GetHObject());// 锁定DIB
if (!lpSrcDib) return;
lpSrcStartBits = pDoc->m_dib.GetBits(lpSrcDib); // 找到DIB图象像素起始位置
lSrcWidth = pDoc->m_dib.GetWidth(lpSrcDib); // 获取图象的宽度
lSrcHeight = pDoc->m_dib.GetHeight(lpSrcDib); // 获取图象的高度
lpSrcBitCount = pDoc->m_dib.GetBitCount(lpSrcDib); //获取图像位深
lSrcLineBytes = pDoc->m_dib.GetReqByteWidth(lSrcWidth * lpSrcBitCount); // 计算图象每行的字节数
//
// 更改光标形状
BeginWaitCursor();
CDlgStyle dlg;
dlg.m_style = 30;
if (dlg.DoModal() != IDOK)
{
// 返回
return;
}
int s = dlg.m_style;
Oilpaint(lpSrcStartBits, lSrcWidth, lSrcHeight,s);
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
// 更新视图
pDoc->UpdateAllViews(NULL);
// 解除锁定
::GlobalUnlock((HGLOBAL)pDoc->GetHObject());
// 恢复光标
EndWaitCursor();
}
void CMFCApplication2View::OnSelfadapt()
{
CMFCApplication2Doc* pDoc = GetDocument();
long lSrcLineBytes; //图象每行的字节数
long lSrcWidth; //图象的宽度和高度
long lSrcHeight;
int lpSrcBitCount; //图像的位深
LPSTR lpSrcDib; //指向源图象的指针
LPSTR lpSrcStartBits; //指向源像素的指针
lpSrcDib = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->GetHObject());// 锁定DIB
if (!lpSrcDib) return;
lpSrcStartBits = pDoc->m_dib.GetBits(lpSrcDib); // 找到DIB图象像素起始位置
lSrcWidth = pDoc->m_dib.GetWidth(lpSrcDib); // 获取图象的宽度
lSrcHeight = pDoc->m_dib.GetHeight(lpSrcDib); // 获取图象的高度
lpSrcBitCount = pDoc->m_dib.GetBitCount(lpSrcDib); //获取图像位深
lSrcLineBytes = pDoc->m_dib.GetReqByteWidth(lSrcWidth * lpSrcBitCount); // 计算图象每行的字节数
//
// 更改光标形状
BeginWaitCursor();
Selfadapt(lpSrcStartBits, lSrcWidth, lSrcHeight);
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
// 更新视图
pDoc->UpdateAllViews(NULL);
// 解除锁定
::GlobalUnlock((HGLOBAL)pDoc->GetHObject());
// 恢复光标
EndWaitCursor();
}
void CMFCApplication2View::OnCanny()
{
CMFCApplication2Doc* pDoc = GetDocument();
long lSrcLineBytes; //图象每行的字节数
long lSrcWidth; //图象的宽度和高度
long lSrcHeight;
int lpSrcBitCount; //图像的位深
LPSTR lpSrcDib; //指向源图象的指针
LPSTR lpSrcStartBits; //指向源像素的指针
lpSrcDib = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->GetHObject());// 锁定DIB
if (!lpSrcDib) return;
lpSrcStartBits = pDoc->m_dib.GetBits(lpSrcDib); // 找到DIB图象像素起始位置
lSrcWidth = pDoc->m_dib.GetWidth(lpSrcDib); // 获取图象的宽度
lSrcHeight = pDoc->m_dib.GetHeight(lpSrcDib); // 获取图象的高度
lpSrcBitCount = pDoc->m_dib.GetBitCount(lpSrcDib); //获取图像位深
lSrcLineBytes = pDoc->m_dib.GetReqByteWidth(lSrcWidth * lpSrcBitCount); // 计算图象每行的字节数
//
// 更改光标形状
BeginWaitCursor();
// 循环控制变量
int y;
int x;
// 开辟内存,存储图像数据
unsigned char* pUnchImage = new unsigned char[lSrcWidth * lSrcHeight];
for (y = 0; y < lSrcHeight; y++)
{
for (x = 0; x < lSrcWidth; x++)
{
pUnchImage[y * lSrcWidth + x] = lpSrcStartBits[y * lSrcLineBytes + x];
}
}
// canny 算子计算后的结果
unsigned char* pUnchEdge = new unsigned char[lSrcWidth * lSrcHeight];
// 调用 canny 函数进行边界提取
Canny(pUnchImage, lSrcWidth, lSrcHeight, 0.4, 0.4, 0.79, pUnchEdge);
for (y = 0; y < lSrcHeight; y++)
{
for (x = 0; x < lSrcWidth; x++)
{
lpSrcStartBits[y * lSrcWidth + x] = (unsigned char)(255 - pUnchEdge[y * lSrcWidth + x]);
}
}
// 释放内存
delete[]pUnchImage;
pUnchImage = NULL;
delete[]pUnchEdge;
pUnchEdge = NULL;
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
// 更新视图
pDoc->UpdateAllViews(NULL);
// 解除锁定
::GlobalUnlock((HGLOBAL)pDoc->GetHObject());
// 恢复光标
EndWaitCursor();
}
void CMFCApplication2View::OnPopupmask()
{
CMFCApplication2Doc* pDoc = GetDocument();
long lSrcLineBytes; //图象每行的字节数
long lSrcWidth; //图象的宽度和高度
long lSrcHeight;
int lpSrcBitCount; //图像的位深
LPSTR lpSrcDib; //指向源图象的指针
LPSTR lpSrcStartBits; //指向源像素的指针
lpSrcDib = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->GetHObject());// 锁定DIB
if (!lpSrcDib) return;
lpSrcStartBits = pDoc->m_dib.GetBits(lpSrcDib); // 找到DIB图象像素起始位置
lSrcWidth = pDoc->m_dib.GetWidth(lpSrcDib); // 获取图象的宽度
lSrcHeight = pDoc->m_dib.GetHeight(lpSrcDib); // 获取图象的高度
lpSrcBitCount = pDoc->m_dib.GetBitCount(lpSrcDib); //获取图像位深
lSrcLineBytes = pDoc->m_dib.GetReqByteWidth(lSrcWidth * lpSrcBitCount); // 计算图象每行的字节数
//
int i, j, ii, jj;
LPSTR lpDst1;
for (i = 0; i <lSrcHeight; i++)
{
for (j = 0; j <lSrcWidth; j++)
{
ii = int(i / 8) * 8;
jj = int(j / 8) * 8;
lpDst1 = lpSrcStartBits+ii * lSrcWidth + jj;
lpSrcDib = (char*)lpSrcStartBits + lSrcWidth * i + j;
*lpSrcDib = *lpDst1;
}
}
pDoc->SetModifiedFlag(TRUE);
pDoc->UpdateAllViews(NULL);
::GlobalUnlock((HGLOBAL)pDoc->GetHObject());
}