压缩了1个像素(存稿)

今天晚上改了下算法,放在网上,掉不了了。
#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;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值