?? jihebianhuandib.cpp
字號:
#include "stdafx.h"
#include "windowsx.h"
#include "math.h"
#include "JiHeBianHuanDib.h"
#include "MainFrm.h"
#include "DynSplitView2.h"
#define PI 3.1415926535
#define WIDTHBYTES(bits) (((bits) + 31) / 32 * 4)
#define RADIAN(angle) ((angle)*PI/180.0) //角度到弧度轉化的宏
JiHeBianHuanDib::JiHeBianHuanDib()
{
}
JiHeBianHuanDib::~JiHeBianHuanDib()
{
}
///***************************************************************/
/*函數(shù)名稱:JingXiang(bool fangshi)
/*函數(shù)類型:void
/*參數(shù)說明:fangshi --判斷標志為 true 水平鏡像,為 false 垂直鏡像
/*功能:對圖像進行鏡像顯示。
/***************************************************************/
void JiHeBianHuanDib::JingXiang(bool fangshi)
{
// 指向源圖像的指針
LPBYTE lpSrc;
LPBYTE p_data;
// 指向要復制區(qū)域的指針
LPBYTE lpDst;
// 指向復制圖像的指針
LPBYTE temp;
// 循環(huán)變量
LONG i;
LONG j;
//圖像的高與寬
long height=this->GetHeight();
long wide=this->GetWidth();
p_data=this->GetData();
// 暫時分配內存,以保存一行圖像
temp = new BYTE[wide*height];
// 判斷鏡像方式
if (fangshi) // 水平鏡像
{
if (m_pBitmapInfoHeader->biBitCount<9) //灰度圖像
{
// 針對圖像每行進行操作
for(j = 0; j < height; j++)
{
for(i = 0; i < wide;i++)
{
lpSrc = (LPBYTE)p_data +wide *j + i;
lpDst = (LPBYTE)temp + wide* j+ wide - i;
*lpDst = *lpSrc;
}
}
memcpy(p_data,temp, wide*height);
}
else //24位彩色
{
wide=this->GetDibWidthBytes();
temp=new BYTE[height*wide];
// 針對圖像每行進行操作
for(j = 0; j < height; j++)
{
for(i = 0; i < wide;i=i+3)
{
lpSrc = (LPBYTE)(p_data +wide *j + i);
lpDst = (LPBYTE)temp + wide* j+ wide - i;
*(lpDst) = *lpSrc;
*(lpDst+1) = *(lpSrc+1);
*(lpDst+2) = *(lpSrc+2);
}
}
memcpy(p_data,temp, wide*height);
}
}
else // 垂直鏡像
{
if (m_pBitmapInfoHeader->biBitCount<9) //灰度圖像
{
// 針對上半圖像進行操作
for(i = 0; i < wide;i++)
{
for(j = 0; j < height; j++)
{
lpSrc = (LPBYTE)p_data + wide * j+i;
lpDst = (LPBYTE)temp + wide * (height - j - 1)+i;
*lpDst = *lpSrc;
}
}
memcpy(p_data,temp, wide*height);
}
else //24位彩色
{
wide=this->GetDibWidthBytes();
temp=new BYTE[height*wide];
// 針對上半圖像進行操作
for(i = 0; i < wide;i++)
{
for(j = 0; j < height; j++)
{
lpSrc = (LPBYTE)p_data + wide * j+i;
lpDst = (LPBYTE)temp + wide * (height - j - 1)+i;
*lpDst = *lpSrc;
}
}
memcpy(p_data,temp, wide*height);
// 釋放內存
delete temp;
}
}
}
///***************************************************************/
/*函數(shù)名稱:Zhuanzhi()
/*函數(shù)類型:void
/*功能:對圖像進行轉置處理。
/***************************************************************/
void JiHeBianHuanDib::Zhuanzhi()
{
// 圖像的寬度和高度
LONG wide=this->GetWidth();
LONG height=this->GetHeight();
//圖像每行字節(jié)數(shù)
LONG lLineBytes=(((wide*8)+31)/32*4);
//新圖像每行字節(jié)數(shù)
LONG lNewLineBytes=(((height*8)+31)/32*4);
// 指向源圖像的指針
LPBYTE p_data=this->GetData();
// 指向源象素的指針
LPBYTE lpSrc;
// 指向轉置圖像對應象素的指針
LPBYTE lpDst;
// 指向轉置圖像的指針
LPBYTE temp;
// 循環(huán)變量
LONG i;
LONG j;
if (m_pBitmapInfoHeader->biBitCount<9) //灰度圖像
{
//分配內存
temp=new BYTE[wide*lNewLineBytes];
// 針對圖像每行進行操作
for(j = 0; j < height; j++)
{
// 針對每行圖像每列進行操作
for(i = 0; i < wide;i++)
{
// 指向源DIB第j行,第i個象素的指針
lpSrc = (LPBYTE)p_data+ lLineBytes * j + i;
// 指向轉置DIB第i行,第j個象素的指針
// 注意此處wide和height是源DIB的寬度和高度,應該互換
lpDst = (LPBYTE)temp + lNewLineBytes* i+ j;
// 復制象素
*lpDst = *lpSrc;
}
}
m_pBitmapInfoHeader->biHeight=wide;
m_pBitmapInfoHeader->biWidth=height;
// 復制轉置后的圖像
memcpy(p_data, temp, wide* height);
// 釋放內存
delete temp;
}
else //24位彩色
{
lLineBytes=wide*3;
lNewLineBytes=height*3;
temp=new BYTE[wide*lNewLineBytes];
// 針對圖像每行進行操作
for(j = 0; j < height; j++)
{
// 針對每行圖像每列進行操作
for(i = 0; i < wide;i++)
{
// 指向源DIB第j行,第i個象素的指針
lpSrc = (LPBYTE)p_data+ lLineBytes * j + i*3;
// 指向轉置DIB第i行,第j個象素的指針
// 注意此處wide和height是源DIB的寬度和高度,應該互換
lpDst = (LPBYTE)temp +lNewLineBytes* i+ j*3;
// 復制象素
*lpDst++ = *lpSrc++;
*lpDst++ = *lpSrc++;
*lpDst = *lpSrc;
}
}
m_pBitmapInfoHeader->biHeight=wide;
m_pBitmapInfoHeader->biWidth=height;
// 復制轉置后的圖像
memcpy(p_data, temp, wide* height*3);
// 釋放內存
delete temp;
}
}
///***************************************************************/
/*函數(shù)名稱:Xuanzhuan(int RotateAngle)
/*函數(shù)類型:void
/*參數(shù)說明:RotateAngle --旋轉角度
/*功能:對圖像進行旋轉處理。
/*****************************************************************/
void JiHeBianHuanDib::Xuanzhuan(double RotateAngle)
{
DWORD OffBits,SrcBufSize,DstBufSize,DstLineBytes;
LPBYTE lpTempPtr,lpPtr,lpSrc,lpTemp;
double SrcX1,SrcY1,SrcX2,SrcY2;
double SrcX3,SrcY3,SrcX4,SrcY4;
double DstX1,DstY1,DstX2,DstY2;
double DstX3,DstY3,DstX4,DstY4;
DWORD x0,y0,x1,y1;
double cosa,sina;
double num1,num2;
int LineBytes;
//角度到弧度的轉化
RotateAngle=(double)RADIAN(RotateAngle);
cosa=(double)cos((double)RotateAngle);
sina=(double)sin((double)RotateAngle);
//原圖的寬度和高度
lpSrc=this->GetData();
int Wold=this->GetWidth();
int Hold=this->GetHeight();
//原圖的四個角的坐標
SrcX1=(double)(-0.5*Wold);
SrcY1=(double)(0.5*Hold);
SrcX2=(double)(0.5*Wold);
SrcY2=(double)(0.5*Hold);
SrcX3=(double)(-0.5*Wold);
SrcY3=(double)(-0.5*Hold);
SrcX4=(double)(0.5*Wold);
SrcY4=(double)(-0.5*Hold);
//新圖四個角的坐標
DstX1=cosa*SrcX1+sina*SrcY1;
DstY1=-sina*SrcX1+cosa*SrcY1;
DstX2=cosa*SrcX2+sina*SrcY2;
DstY2=-sina*SrcX2+cosa*SrcY2;
DstX3=cosa*SrcX3+sina*SrcY3;
DstY3=-sina*SrcX3+cosa*SrcY3;
DstX4=cosa*SrcX4+sina*SrcY4;
DstY4=-sina*SrcX4+cosa*SrcY4;
//計算新圖的寬度,高度
int Wnew = (DWORD)(max(fabs(DstX4-DstX1), fabs(DstX3-DstX2))+0.5);
int Hnew = (DWORD)(max(fabs(DstY4-DstY1), fabs(DstY3-DstY2))+0.5);
//計算矩陣(2.9)中的兩個常數(shù),這樣不用以后每次都計算了
num1=(double)( -0.5*Wnew*cosa-0.5*Hnew*sina+0.5*Wold);
num2=(double)(0.5*Wnew*sina-0.5*Hnew*cosa+0.5*Hold);
if(m_pBitmapInfoHeader->biBitCount<9) //灰度圖像
{
//將新的緩沖區(qū)中的每個字節(jié)都填成255,這樣以后未處理的象素就是白色
DstBufSize=Wnew*Hnew;
lpTempPtr=new BYTE[Wnew*Hnew];
memset(lpTempPtr,(BYTE)255,Wnew*Hnew);
lpTemp=lpTempPtr;
for(y1=0;y1<Hnew;y1++)
{
for(x1=0;x1<Wnew;x1++)
{
//x0,y0為對應的原圖上的坐標
x0= (DWORD)(x1*cosa+y1*sina+num1);
y0= (DWORD)(-1.0f*x1*sina+y1*cosa+num2);
if( (x0>=0) && (x0<Wold) && (y0>=0) && (y0<Hold)) //在原圖范圍內
{
lpPtr=lpSrc+y0*Wold+x0;
lpTempPtr=lpTemp+y1*Wnew+x1;
*lpTempPtr=*lpPtr; //進行象素的復制
lpTempPtr=lpTemp;
}
}
}
this->SetWidth(Wnew);
this->SetHeight(Hnew);
this->m_pData=lpTemp;
}
else //24位彩色
{
//將新的緩沖區(qū)中的每個字節(jié)都填成255,這樣以后未處理的象素就是白色
DstBufSize=Wnew*Hnew*3;
lpTempPtr=new BYTE[Wnew*Hnew*3];
memset(lpTempPtr,(BYTE)255,Wnew*Hnew*3);
lpTemp=lpTempPtr;
for(y1=0;y1<Hnew;y1++)
{
for(x1=0;x1<Wnew;x1++)
{
//x0,y0為對應的原圖上的坐標
x0= (DWORD)(x1*cosa+y1*sina+num1);
y0= (DWORD)(-1.0f*x1*sina+y1*cosa+num2);
if((x0>=0) && (x0<Wold) && (y0>=0) && (y0<Hold)) //在原圖范圍內
{
lpPtr=lpSrc+y0*Wold*3+x0*3;
lpTempPtr=lpTemp+y1*Wnew*3+x1*3;
*lpTempPtr++=*lpPtr++; //進行象素的復制
*lpTempPtr++=*lpPtr++; //進行象素的復制
*lpTempPtr=*lpPtr; //進行象素的復制
lpTempPtr=lpTemp;
}
}
}
this->SetWidth(Wnew);
this->SetHeight(Hnew);
this->m_pData=lpTemp;
}
}
void JiHeBianHuanDib::clearmem2()
{
LONG temp;
temp=m_pBitmapInfoHeader->biHeight;
m_pBitmapInfoHeader->biHeight=m_pBitmapInfoHeader->biWidth;
m_pBitmapInfoHeader->biWidth=temp;
}
///***************************************************************/
/*函數(shù)名稱:Suofang(float xzoom, float yzoom)
/*函數(shù)類型:void
/*參數(shù)說明:xzoom --水平縮小的比率
/* yzoom --垂直縮小的比率
/*功能:對圖像進行縮放處理。
/*****************************************************************/
void JiHeBianHuanDib::SuoXiao(float xzoom, float yzoom)
{
// 源圖像的寬度和高度
LONG wide;
LONG height;
LONG LineBytes;
// 縮放后圖像的寬度和高度
LONG newwide;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -