【VC开源代码栏目提醒】:网学会员在VC开源代码频道为大家收集整理了RotationImage.cpp提供大家参考,希望对大家有所帮助!
// RotationImage.cpp : implementation file
//
#include "stdafx.h"
#include "ImageHandle.h"
#include "RotationImage.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CRotationImage dialog
CRotationImage::CRotationImage(CWnd* pParent /*=NULL*/)
: CDialog(CRotationImage::IDD, pParent)
{
//{{AFX_DATA_INIT(CRotationImage)
m_SrcFile = _T("");
//}}AFX_DATA_INIT
m_hIcon = AfxGetApp()->LoadIcon(IDI_SHOWIMAGE);
m_Loaded = FALSE;
m_pBmpData = NULL;
m_RotData = NULL;
m_hGlobal = NULL;
}
void CRotationImage::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CRotationImage)
DDX_Control(pDX, IDC_IMAGE, m_Image);
DDX_Text(pDX, IDC_SRCFILE, m_SrcFile);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CRotationImage, CDialog)
//{{AFX_MSG_MAP(CRotationImage)
ON_BN_CLICKED(IDC_CHOOSE, OnChoose)
ON_BN_CLICKED(IDC_ROTATION, OnRotation)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CRotationImage message handlers
void CRotationImage::OnOK()
{
}
BOOL CRotationImage::OnInitDialog()
{
CDialog::OnInitDialog();
SetIcon(m_hIcon, TRUE);
return TRUE;
}
void CRotationImage::OnChoose()
{
CFileDialog flDlg(TRUE,"","",OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"位图文件|*.bmp||",this);
if (flDlg.DoModal()==IDOK)
{
m_SrcFile = flDlg.GetPathName();
UpdateData(FALSE);
if (m_hBmp != NULL)
{
DeleteObject(m_hBmp);
m_hBmp = NULL;
}
m_hBmp = (HBITMAP)LoadImage(NULL,m_SrcFile,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
if (m_hBmp)
{
CFile file;
file.Open(m_SrcFile,CFile::modeRead);
file.Read(&bmFileHeader,sizeof(BITMAPFILEHEADER));
file.Read(&bmInfoHeader,sizeof(BITMAPINFOHEADER));
int szPalette = 0;
if (bmInfoHeader.biBitCount != 24)
{
file.Close();
MessageBox("请选择真彩色位图!","提示");
return;
}
m_Image.SetBitmap(m_hBmp);
int szBmpData = bmInfoHeader.biSizeImage;
if (m_pBmpData != NULL)
{
delete m_pBmpData;
m_pBmpData = NULL;
}
m_pBmpData = new BYTE[szBmpData+sizeof(BITMAPINFOHEADER)];
memcpy(m_pBmpData,&bmInfoHeader,sizeof(BITMAPINFOHEADER));
BYTE* pTemp = m_pBmpData + sizeof(BITMAPINFOHEADER);
file.ReadHuge(pTemp,szBmpData);
file.Close();
m_Loaded = TRUE;
}
}
}
void CRotationImage::OnRotation()
{
if (m_Loaded)
{
if (m_hGlobal != NULL)
{
GlobalUnlock(m_hGlobal);
GlobalFree(m_hGlobal);
m_hGlobal = NULL;
m_RotData = NULL;
}
RotationImage((BITMAPINFOHEADER*)m_pBmpData);
if (m_RotData != NULL)
{
BITMAPINFOHEADER BmHeader;
memcpy(&BmHeader,m_RotData,sizeof(BITMAPINFOHEADER));
BITMAPINFO bmInfo;
bmInfo.bmiHeader = BmHeader;
BYTE* pImageData = m_RotData + sizeof(BITMAPINFOHEADER);
CDC *pDC = m_Image.GetDC();
HBITMAP hbmp = CreateDIBitmap(pDC->m_hDC,&BmHeader,CBM_INIT,pImageData,&bmInfo,DIB_RGB_COLORS);
HBITMAP hOldBmp = m_Image.GetBitmap();
if (hbmp)
m_Image.SetBitmap(hbmp);
DeleteObject(hOldBmp);
}
}
}
void CRotationImage::RotationImage(BITMAPINFOHEADER *pBmInfo)
{
//源图像宽度和高度
UINT srcWidth = pBmInfo->biWidth;
UINT srcHeight = pBmInfo->biHeight;
//90°转换后目标的宽度和高度
UINT desWidth = srcHeight;
UINT desHeight = srcWidth;
//每行字节数
UINT lineBytes = srcWidth * pBmInfo->biBitCount / 8;
//字节对齐
int mod = lineBytes % 4;
if (mod != 0)
lineBytes += 4-mod;
UINT desLineBytes = desWidth * pBmInfo->biBitCount / 8;
mod = desLineBytes % 4;
if (mod != 0)
desLineBytes += 4 - mod;
//获取源图像数据
BYTE* psrcData = (BYTE*)pBmInfo + sizeof(BITMAPINFOHEADER);
BYTE* psrcPixData = NULL;
BYTE* pdesPixData = NULL;
m_hGlobal = GlobalAlloc(GMEM_MOVEABLE,sizeof(BITMAPINFOHEADER)+desHeight*desLineBytes);
m_RotData = (BYTE*)GlobalLock(m_hGlobal);
memset(m_RotData,0,desHeight*desLineBytes);
BITMAPINFOHEADER desBmInfo = *pBmInfo;
desBmInfo.biHeight = desHeight;
desBmInfo.biWidth = desWidth;
desBmInfo.biSizeImage = sizeof(BITMAPINFOHEADER)+desHeight*desLineBytes;
memcpy(m_