今天晚上改了下算法,放在网上,掉不了了。
#include <iostream>
#include <fstream>
using namespace std;
unsigned char b[960][1920];
int main()
{
unsigned char a[54];
unsigned char zhongzhi;
unsigned char *pt1;
float ni=(float)480/(float)479; // N/I的值
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<479;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<639;j++)
{
x1=(int)(ni*j)/1;
x2=(int)(ni*(j+1))/1;
if(j<638)
{
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)-640;
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<639;j++)
{
x1=(int)(ni*j)/1;
x2=(int)(ni*(j+1))/1;
if(j<638)
{
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)-640;
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;j++)
{
*pt1++=zhongzhi; //补充每行末尾数据
}
}// i的for循环结束
for(i=0;i<1920;i++) //补充最后一行数据
{
*pt1++=zhongzhi;
}
pt1=(unsigned char *)b; //重新设定指针位置
pt1+=921600;
outfile.write((char *)pt1,921600);
outfile.close();
return 0;
}