⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dispdlg.cpp

📁 将JPEG图像解压为BMP图像。 内含图像处理的一些基本函数。
💻 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 + -