📄 dispdlg.cpp
字号:
// DispDlg.cpp : implementation file
//
#include "stdafx.h"
#include "Tran.h"
#include "DispDlg.h"
#include "TranDlg.h"
#include "Dib.h"
#include "Jpeg.h"
#include "DDib.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CDispDlg dialog
CDispDlg::CDispDlg(CWnd* pParent /*=NULL*/)
: CDialog(CDispDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CDispDlg)
m_picdir = _T("");
//}}AFX_DATA_INIT
}
void CDispDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDispDlg)
DDX_Text(pDX, IDC_EDIT1, m_picdir);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CDispDlg, CDialog)
//{{AFX_MSG_MAP(CDispDlg)
ON_BN_CLICKED(ID_Execute, OnExecute)
ON_BN_CLICKED(IDC_SelectPic, OnSelectPic)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDispDlg message handlers
void CDispDlg::OnExecute()
{
// TODO: Add your control notification handler code here
LPCSTR fileName=m_picdir;
LONG wid,hei,bits,bpp;
BYTE lpBuf,pix1[640*480],pix2[1600*1200];
LPBITMAPINFOHEADER lpbi;
CJpeg jpeg;
if (! jpeg.Load(fileName))//装入内存的BMP已经DWORD对齐,BGR已经RGB
AfxMessageBox("false");
HDIB hDIB = CopyHandle(jpeg.m_dib.GetHandle());
// m_dib.Attach(hDIB);
hDIBgray=ToGray(hDIB);//灰度化
}
void CDispDlg::OnSelectPic()
{
// TODO: Add your control notification handler code here
CFileDialog dlg(TRUE,"jpg",NULL,OFN_HIDEREADONLY |OFN_OVERWRITEPROMPT,"Jpg File(*.jpg)|*.jpg||");
if(dlg.DoModal()==IDOK)
{
m_picdir = dlg.GetPathName();
UpdateData(FALSE);
}
}
//函数实现图片从彩色到黑白的转换
HDIB CDispDlg::ToGray(HANDLE hDIB)
{
HDIB hNewDIB = NULL;
LPBITMAPINFOHEADER lpSrc,lpDest;
LPBYTE lpS,lpD;
DWORD dwBytesPerLine;
DWORD dwImgSize;
WORD wBytesPerLine;
unsigned i ,j,height,width;
if(!hDIB)
return NULL;
lpSrc = (LPBITMAPINFOHEADER)GlobalLock(hDIB);
dwBytesPerLine = WIDTHBYTES(24*(lpSrc->biWidth));
dwImgSize = lpSrc->biHeight * dwBytesPerLine;
//申请新的内存,大小等于原来图象的大小
hNewDIB = GlobalAlloc(GHND,sizeof(BITMAPINFOHEADER)+dwImgSize);
lpDest = (LPBITMAPINFOHEADER)GlobalLock(hNewDIB);
//保存图片的长宽、颜色深度等信息
memcpy((void*)lpDest,(void*)lpSrc,sizeof(BITMAPINFOHEADER));
DWORD dwSBytesPerLine;
dwSBytesPerLine = (24*(lpSrc->biWidth)+31)/32*4;
height = lpDest->biHeight;
width = lpDest->biWidth;
lpS = (LPBYTE)lpSrc;
wBytesPerLine = BytePerLine(hDIB);
lpD = (LPBYTE)lpDest;
lpS = lpS + sizeof(BITMAPINFOHEADER);
lpD = lpD + sizeof(BITMAPINFOHEADER);
unsigned r , g ,b,gray ;
//扫描整个图片,实现灰度化
for(i = 0 ;i<height; i++)
{
for(j = 0 ;j<(unsigned )lpDest->biWidth;j++)
{
//获得原来图片的颜色值
r = *(lpS++);
g = *(lpS++);
b = *(lpS++);
//计算灰度值
gray = (g*50+r*39+b*11)/100;
//保存灰度值到目标图片
*(lpD++)=gray;
*(lpD++) = gray;
*(lpD++) = gray;
}
//处理四字节对齐问题
unsigned k ;
for(k=0;k<dwSBytesPerLine-lpSrc->biWidth*3;k++)
{
lpS++;
lpD++;
}
}
GlobalUnlock(hDIB);
GlobalUnlock(hNewDIB);
return hNewDIB;
}
WORD CDispDlg::BytePerLine(HANDLE hDIB)
{
WORD i;
LPBITMAPINFOHEADER lpbi;
lpbi=(LPBITMAPINFOHEADER)GlobalLock(hDIB);
i=WIDTHBYTES(24*(lpbi->biWidth));
GlobalUnlock(hDIB);
return i;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -