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

📄 myprogramm.cpp

📁 VC++数字图像处理 配套光盘
💻 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 + -