自从上一篇做完,一直在玩,今天稍微对程序改了改,实现0.25~1倍的缩放,其中 I 的值应该是大于240小于480的值
代码:
#include <iostream>
#include <fstream>
using namespace std;
#define N 480 // 原始宽度
#define I 245 // 改变后宽度
#define M 640 // 原始长度
unsigned char b[960][1920];
int main()
{
unsigned char a[54];
unsigned char zhongzhi;
unsigned char *pt1;
float ni=(float)N/(float)I; // N/I的值
int m=(int)((float)M/ni)/1+1; // 改变后的长度值,包括边缘
float py1,py2,py3,hx1,hx2,hx3; //竖着与横着分量的值,应该小于ni
float hx4,hx5; //
int y1,y2,x1,x2; //取整的值,用来定位新像素占原像素的位置。
ifstream infile("11.bmp",ios::binary); //打开11.bmp。
if(!infile)
{cout<<"open 11.bmp error!"<<endl;
abort();
}
infile.read((char *)a,54); //读取文件头存入数组a中。
infile.seekg(54); //定位
infile.read((char *)b,921600); //读取数据存入二维数组b中。
infile.close(); //关闭
int i;
int j;
ofstream outfile("12.bmp",ios::binary); //打开12.bmp写数据
if(!outfile)
{cout<<"open 12.bmp error!"<<endl;
abort();
}
pt1=(unsigned char *)b;
pt1+=921600; //准备在数组下半部分写入新数据。
outfile.write((char *)a,54); //写入文件头。
outfile.seekp(54); //定位。
for(i=0;i<I;i++)
{
y1=(int)(ni*i)/1;
y2=(int)(ni*(i+1))/1; //进度取整
if((y2-y1)>1)
{
py1=y1+1-ni*i;
py2=1.0;
py3=ni-1-py1;
for(j=0;j<m;j++)
{
x1=(int)(ni*j)/1;
x2=(int)(ni*(j+1))/1;
if(j<m-1)
{
if((x2-x1)>1)
{
// 此时为9个原像素
hx1=x1+1-ni*j;
hx2=1.0;
hx3=ni-1-hx1;
//此处添加像素处理:
zhongzhi=(int)((
b[y1][3*x1]*py1*hx1+b[y1][3*(x1+1)]*py1*hx2+b[y1][3*(x1+2)]*py1*hx3+
b[y1+1][3*x1]*py2*hx1+b[y1+1][3*(x1+1)]*py2*hx2+b[y1+1][3*(x1+2)]*py2*hx3+
b[y1+2][3*x1]*py3*hx1+b[y1+2][3*(x1+1)]*py3*hx2+b[y1+2][3*(x1+2)]*py3*hx3)/(ni*ni)); //blue 新
*pt1++=zhongzhi;
zhongzhi=(int)((
b[y1][3*x1+1]*py1*hx1+b[y1][3*(x1+1)+1]*py1*hx2+b[y1][3*(x1+2)+1]*py1*hx3+
b[y1+1][3*x1+1]*py2*hx1+b[y1+1][3*(x1+1)+1]*py2*hx2+b[y1+1][3*(x1+2)+1]*py2*hx3+
b[y1+2][3*x1+1]*py3*hx1+b[y1+2][3*(x1+1)+1]*py3*hx2+b[y1+2][3*(x1+2)+1]*py3*hx3)/(ni*ni));//green新
*pt1++=zhongzhi;
zhongzhi=(int)((
b[y1][3*x1+2]*py1*hx1+b[y1][3*(x1+1)+2]*py1*hx2+b[y1][3*(x1+2)+2]*py1*hx3+
b[y1+1][3*x1+2]*py2*hx1+b[y1+1][3*(x1+1)+2]*py2*hx2+b[y1+1][3*(x1+2)+2]*py2*hx3+
b[y1+2][3*x1+2]*py3*hx1+b[y1+2][3*(x1+1)+2]*py3*hx2+b[y1+2][3*(x1+2)+2]*py3*hx3)/(ni*ni));//red新
*pt1++=zhongzhi;
}
else
{
//此时为6个原像素,相当于[3][2]
hx1=x1+1-ni*j;
hx2=ni-hx1;
//此处添加像素处理:
zhongzhi=(int)((
b[y1][3*x1]*py1*hx1+b[y1][3*(x1+1)]*py1*hx2+
b[y1+1][3*x1]*py2*hx1+b[y1+1][3*(x1+1)]*py2*hx2+
b[y1+2][3*x1]*py3*hx1+b[y1+2][3*(x1+1)]*py3*hx2)/(ni*ni)); //blue新
*pt1++=zhongzhi;
zhongzhi=(int)((
b[y1][3*x1+1]*py1*hx1+b[y1][3*(x1+1)+1]*py1*hx2+
b[y1+1][3*x1+1]*py2*hx1+b[y1+1][3*(x1+1)+1]*py2*hx2+
b[y1+2][3*x1+1]*py3*hx1+b[y1+2][3*(x1+1)+1]*py3*hx2)/(ni*ni)); //green新
*pt1++=zhongzhi;
zhongzhi=(int)((
b[y1][3*x1+2]*py1*hx1+b[y1][3*(x1+1)+2]*py1*hx2+
b[y1+1][3*x1+2]*py2*hx1+b[y1+1][3*(x1+1)+2]*py2*hx2+
b[y1+2][3*x1+2]*py3*hx1+b[y1+2][3*(x1+1)+2]*py3*hx2)/(ni*ni)); //red新
*pt1++=zhongzhi;
}
} //对应小于638的判断
else
{
//此处补充边缘
hx5=ni*(j+1)-M;
hx4=ni-hx5;
zhongzhi=(int)((
b[y1][3*x1]*py1*hx4+(float)(255)*py1*hx5+
b[y1+1][3*x1]*py2*hx4+(float)(255)*py2*hx5+
b[y1+2][3*x1]*py3*hx4+(float)(255)*py3*hx5)/(ni*ni)); //blue新
*pt1++=zhongzhi;
zhongzhi=(int)((
b[y1][3*x1+1]*py1*hx4+(float)(255)*py1*hx5+
b[y1+1][3*x1+1]*py2*hx4+(float)(255)*py2*hx5+
b[y1+2][3*x1+1]*py3*hx4+(float)(255)*py3*hx5)/(ni*ni)); //green新
*pt1++=zhongzhi;
zhongzhi=(int)((
b[y1][3*x1+2]*py1*hx4+(float)(255)*py1*hx5+
b[y1+1][3*x1+2]*py2*hx4+(float)(255)*py2*hx5+
b[y1+2][3*x1+2]*py3*hx4+(float)(255)*py3*hx5)/(ni*ni)); //red新
*pt1++=zhongzhi;
} //if语句结束
}// j的for循环结束
}// 对应if((y2-y1)>1)的括号
else
{
py1=y1+1-ni*i;
py2=ni-py1;
for(j=0;j<m;j++)
{
x1=(int)(ni*j)/1;
x2=(int)(ni*(j+1))/1;
if(j<m-1)
{
if((x2-x1)>1)
{
//此时为6个像素,相当于[2][3]
hx1=x1+1-ni*j;
hx2=1.0;
hx3=ni-1-hx1;
//此处添加像素处理:
zhongzhi=(int)((
b[y1][3*x1]*py1*hx1+b[y1][3*(x1+1)]*py1*hx2+b[y1][3*(x1+2)]*py1*hx3+
b[y1+1][3*x1]*py2*hx1+b[y1+1][3*(x1+1)]*py2*hx2+b[y1+1][3*(x1+2)]*py2*hx3)/(ni*ni)); //blue 新
*pt1++=zhongzhi;
zhongzhi=(int)((
b[y1][3*x1+1]*py1*hx1+b[y1][3*(x1+1)+1]*py1*hx2+b[y1][3*(x1+2)+1]*py1*hx3+
b[y1+1][3*x1+1]*py2*hx1+b[y1+1][3*(x1+1)+1]*py2*hx2+b[y1+1][3*(x1+2)+1]*py2*hx3)/(ni*ni));//green新
*pt1++=zhongzhi;
zhongzhi=(int)((
b[y1][3*x1+2]*py1*hx1+b[y1][3*(x1+1)+2]*py1*hx2+b[y1][3*(x1+2)+2]*py1*hx3+
b[y1+1][3*x1+2]*py2*hx1+b[y1+1][3*(x1+1)+2]*py2*hx2+b[y1+1][3*(x1+2)+2]*py2*hx3)/(ni*ni));//red新
*pt1++=zhongzhi;
}
else
{
//此时为4个像素
hx1=x1+1-ni*j;
hx2=ni-hx1;
//此处添加像素处理:
zhongzhi=(int)((
b[y1][3*x1]*py1*hx1+b[y1][3*(x1+1)]*py1*hx2+
b[y1+1][3*x1]*py2*hx1+b[y1+1][3*(x1+1)]*py2*hx2)/(ni*ni)); //blue新
*pt1++=zhongzhi;
zhongzhi=(int)((
b[y1][3*x1+1]*py1*hx1+b[y1][3*(x1+1)+1]*py1*hx2+
b[y1+1][3*x1+1]*py2*hx1+b[y1+1][3*(x1+1)+1]*py2*hx2)/(ni*ni)); //green新
*pt1++=zhongzhi;
zhongzhi=(int)((
b[y1][3*x1+2]*py1*hx1+b[y1][3*(x1+1)+2]*py1*hx2+
b[y1+1][3*x1+2]*py2*hx1+b[y1+1][3*(x1+1)+2]*py2*hx2)/(ni*ni)); //red新
*pt1++=zhongzhi;
}
}
else
{
hx5=ni*(j+1)-M;
hx4=ni-hx5;
zhongzhi=(int)((
b[y1][3*x1]*py1*hx4+(float)(255)*py1*hx5+
b[y1+1][3*x1]*py2*hx4+(float)(255)*py2*hx5)/(ni*ni)); //blue新
*pt1++=zhongzhi;
zhongzhi=(int)((
b[y1][3*x1+1]*py1*hx4+(float)(255)*py1*hx5+
b[y1+1][3*x1+1]*py2*hx4+(float)(255)*py2*hx5)/(ni*ni)); //green新
*pt1++=zhongzhi;
zhongzhi=(int)((
b[y1][3*x1+2]*py1*hx4+(float)(255)*py1*hx5+
b[y1+1][3*x1+2]*py2*hx4+(float)(255)*py2*hx5)/(ni*ni)); //red新
*pt1++=zhongzhi;
}
}// j的for循环结束
}//对应else的花括号
for(j=0;j<3*(M-m);j++)
{
*pt1++=(unsigned char)(0); //补充每行末尾数据
}
}// i的for循环结束
for(i=0;i<1920;i++) //补充最后一行数据
{
*pt1++=(unsigned char)(0);
}
pt1=(unsigned char *)b; //重新设定指针位置
pt1+=921600;
outfile.write((char *)pt1,921600);
outfile.close();
return 0;
}