📄 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 + -