?? myprogramm.cpp
字號:
/*************************************************************************
*
* 函數名稱
* AutoRotateDIB()
*
* 參數
* Cfile&file - DIB圖像所在的文件Cfile
* Float Pre - 傾斜調整的精度
*
* 返回值
* BOOL - 旋轉成功返回1,否則為0
*
* 說明
************************************************************************/
#include "stdafx.h"
#include "dibapi.h"
#include <io.h>
#include <errno.h>
#include <math.h>
#include <direct.h>
BOOL WINAPI AutoRotateDIB(CFile &file,float Pre)
{
//圖像傾斜角度
double Angle;
//指向原DIB的指針
LPSTR lpDIB;
//旋轉后新的DIB句柄
HDIB hDIB;
//圖像是否旋轉成功的信息
BOOL SuccessInfor;
//蔣圖像從指定文件中讀到內存
IpDIB=(LPSTR)::ReadDIBFile(file);
//計算圖像傾斜角度
Angle=CalculateAngle(IpDIB,Pre);
//對圖像進行旋轉
hDIB=::RotateDIB(IpDIB, Angle);
//將旋轉后的圖像存入原來的文件中,并返回成功與否信息
SuccessInfor=::SaveDIB(hDIB,Cfile&file)
//返回圖像是否旋轉成功
return SuccessInfor;
}
double CalculateAngle(LPSTR IpDIB,float Pre)
{
//原圖像的寬度和高度
LONG IWidth;
LONG IHeight;
//心圖像的寬度和高度
LONG INewWidth;
LONG INewHeight;
//指向原圖像的指針
LPSTR IpDIBBits;
//指向新圖像的指針
LPSTR IpNewDIB;
LPSTR IpNewDIBBits;
//獲取圖像的高度
IHeight=::DIBHeight(IpDIB);
//獲取圖像的寬度
IWidth=::DIBWidth(IpDIB);
//獲取原DIB圖像像素初始位置
IpDIBBits=::FindDIBBits(IpDIB);
INewHeight=IHeight;
INewWidth=IWidth;
IpNewDIBBits=IpDIBBits;
//初始傾斜角度
double Angle=-2*Pre;
//初始當前的空白行數和之前的空白行數
int CurLineNum=0;
int PreLineNum=0;
//比較空白行數的大小,判斷傾斜度數
do
{ //蔣當前空白行數值付給之前空白行數值
PreLineNum=CurLineNum;
//進行列空白行數累加
for(int i=0;i<=INewHeight;i++)
{
//初始任意行內像素值的和
int Mum=0;
//將指針指向要處理的圖像行首地址
IpNewDIBBits=IpNewDIBBits+IWidth;
//某一行像素的累加
for(int j=0;j<=INewWidth;j++)
{ Mum=Mum+ *(IpNewDIBBits+j);}
//判斷是否為空白行
if(255*INewWidth+a>=Mum>=255*INewWidth-a)
//當前空白行加一
CurLineNum++;
}
//以精度為單位對圖像進行旋轉
IpNewDIB=(LPSTR)::RotateDIB(IpNewDIB, Pre);
INewHeight=::DIBHeight(IpNewDIB);
INewWidth=::DIBWidth(IpNewDIB);
IpNewDIBBits=::FindDIBBits(IpNewDIB);
Angle=Angle+Pre;
}
while(PreLineNum<CurLineNum);
if(Angle>0)
{return Angle;}
INewHeight=IHeight;
INewWidth=IWidth;
IpNewDIB=IpDIB;
IpNewDIBBits=IpDIBBits;
Angle=Angle+2*Pre;
do
{ //蔣當前空白行數值付給之前空白行數值
PreLineNum=CurLineNum;
//進行列空白行數累加
for(int i=0;i<=INewHeight;i++)
{
//初始任意行內像素值的和
int Mum=0;
//將指針指向要處理的圖像行首地址
IpNewDIBBits=IpNewDIBBits+INewWidth;
//某一行像素的累加
for(int j=0;j<=INewWidth;j++)
{ Mum=Mum+(*(IpNewDIBBits+j));}
//判斷是否為空白行
if(255*INewWidth+a>=Mum>=255*INewWidth-a)
//當前空白行加一
{CurLineNum++;}
}
//以精度為單位對圖像進行旋轉
IpNewDIB=(LPSTR)::RotateDIB(IpNewDIB, -Pre);
INewHeight=::DIBHeight(IpNewDIB);
INewWidth=::DIBWidth(IpNewDIB);
IpNewDIBBits=::FindDIBBits(IpNewDIB);
Angle=Angle-Pre;
}
while(PreLineNum<CurLineNum);
return Angle;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -