本文要实现的功能是使用最近邻插值以及双线性插值完成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;//缩放前后对应的像素点坐标