C++——bmp图像缩放(插值)

该博客详细介绍了如何使用C++实现BMP图像的缩放,通过最近邻插值和双线性插值方法。最近邻插值简单但可能导致图像边缘锯齿状;双线性插值通过两次线性插值平滑图像,提高图像质量。文中给出了相应的代码实现。
摘要由CSDN通过智能技术生成

       本文要实现的功能是使用最近邻插值以及双线性插值完成bmp图像的缩放。

1、最近邻插值

       不需要计算,在待求象素的四邻象素中,将距离待求象素最近的邻象素灰度赋给待求象素:

                                    

       设i+u, j+v(i, j为正整数, u, v为大于零小于1的小数,下同)为待求象素坐标,则待求象素灰度的值 f(i+u, j+v);如果(i+u, j+v)落在A区,即u<0.5, v<0.5,则将左上角象素的灰度值赋给待求象素,同理,落在B区则赋予右上角的象素灰度值,落在C区则赋予左下角象素的灰度值,落在D区则赋予右下角象素的灰度值。

最邻近算法计算量较小,但可能会造成插值生成的图像灰度上的不连续,在灰度变化的地方可能出现明显的锯齿状。

代码如下:

void image_scaling_nearest()
{
	char readPath[] = "D:\\C++_file\\image_deal_C++\\IMAGE_JIEQU\\lunpan.bmp";
	readBmp(readPath);

	unsigned char *imagedata = NULL; //动态分配存储原图片的像素信息的二维数组
	unsigned char *imagedataScal = NULL;//动态分配存储缩放后的图片的像素信息的二维数组
	imagedata = pBmpBuf;

	float ExpScalValue = 0; 期望的缩放倍数(允许小数)
	int FloatToIntwidth, FloatToIntheight;/小数变成整数(float To Int)
	int RotateAngle = 90;//要缩放的角度,默认90

	//图片缩放处理
	cout << "请输入要缩放的倍数:" << endl;
	cin >> ExpScalValue;

	///如果ExpScalValue含有小数,需要整数化
	///对期望的缩放结果取整
	FloatToIntwidth = (int)(ExpScalValue*bmpWidth);
	FloatToIntheight = (int)(ExpScalValue*bmpHeight);
	//图像每一行的字节数必须是4的整数倍
	int lineByte2 = (FloatToIntwidth * biBitCount / 8 + 3) / 4 * 4;
	imagedataScal = new unsigned char[lineByte2 * FloatToIntheight];///为缩放后图像分配存储空间

	int pre_i, pre_j, after_i, after_j;//缩放前后对应的像素点坐标
	
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值