这是在下的程序:一个最近邻差值放大BMP图片的程序
#include "iostream"
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <math.h>
#include <cstdio>
#include <windows.h>
using namespace cv;
using namespace std;
unsigned char *pBmpBuf;//读入图像数据的指针
int bmpWidth;//图像的宽
int bmpHeight;//图像的高
RGBQUAD *pColorTable;//颜色表指针
int biBitCount;//图像类型,每像素位数
bool readBmp(char *bmpName)
{
FILE *fp = fopen(bmpName, "rb");//二进制读方式打开指定的图像文件
if (fp == 0)
return 0;
//跳过位图文件头结构BITMAPFILEHEADER
fseek(fp, sizeof(BITMAPFILEHEADER), 0);
//定义位图信息头结构变量,读取位图信息头进内存,存放在变量head中
BITMAPINFOHEADER head;
fread(&head, sizeof(BITMAPINFOHEADER), 1, fp); //获取图像宽、高、每像素所占位数等信息
bmpWidth = head.biWidth;
bmpHeight = head.biHeight;
biBitCount = head.biBitCount;//定义变量,计算图像每行像素所占的字节数(必须是4的倍数)
int lineByte = (bmpWidth * biBitCount / 8 + 3) / 4 * 4;//灰度图像有颜色表,且颜色表表项为256
if (biBitCount == 8)
{
//申请颜色表所需要的空间,读颜色表进内存
pColorTable = new RGBQUAD[256];
fread(pColorTable, sizeof(RGBQUAD), 256, fp);
}
//申请位图数据所需要的空间,读位图数据进内存
pBmpBuf = new unsigned char[lineByte * bmpHeight];
fread(pBmpBuf, 1, lineByte * bmpHeight, fp);
fclose(fp);//关闭文件
return 1;//读取文件成功
}
bool saveBmp(char *bmpName, unsigned char *imgBuf, int width, int height, int biBitCount, RGBQUAD *pColorTable)
{
//如果位图数据指针为0,则没有数据传入,函数返回
if (!imgBuf)
return 0;
//颜色表大小,以字节为单位,灰度图像颜色表为1024字节,彩色图像颜色表大小为0
int colorTablesize = 0;
if (biBitCount == 8)
colorTablesize = 1024;
//待存储图像数据每行字节数为4的倍数
int lineByte = (width * biBitCount / 8 + 3) / 4 * 4;
//以二进制写的方式打开文件
FILE *fp = fopen(bmpName, "wb");
if (fp == 0)
return 0;
//申请位图文件头结构变量,填写文件头信息
BITMAPFILEHEADER fileHead;
fileHead.bfType = 0x4D42;//bmp类型
//bfSize是图像文件4个组成部分之和
fileHead.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + colorTablesize + lineByte*height;
fileHead.bfReserved1 = 0;
fileHead.bfReserved2 = 0;
//bfOffBits是图像文件前3个部分所需空间之和
fileHead.bfOffBits = 54 + colorTablesize;
//写文件头进文件
fwrite(&fileHead, sizeof(BITMAPFILEHEADER), 1, fp);
//申请位图信息头结构变量,填写信息头信息
BITMAPINFOHEADER head;
head.biBitCount = biBitCount;
head.biClrImportant = 0;
head.biClrUsed = 0;
head.biCompression = 0;
head.biHeight = height;
head.biPlanes = 1;
head.biSize = 40;
head.biSizeImage = lineByte*height;
head.biWidth = width;
head.biXPelsPerMeter = 0;
head.biYPelsPerMeter = 0;
//写位图信息头进内存
fwrite(&head, sizeof(BITMAPINFOHEADER), 1, fp);
//如果灰度图像,有颜色表,写入文件
if (biBitCount == 8)
fwrite(pColorTable, sizeof(RGBQUAD), 256, fp);
//写位图数据进文件
fwrite(imgBuf, height*lineByte, 1, fp);
//关闭文件
fclose(fp);
return 1;
}
void image_scaling_nearest(char readPath[50])
{
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;//缩放前后对应的像素点坐标
for (int i = 0; i < FloatToIntheight; i++)
{
for (int j = 0; j < FloatToIntwidth; j++)
{
for (int k = 0; k < 3; k++)
{
after_i = i;
after_j = j;
pre_i = (int)(after_i / ExpScalValue);/////取整,插值方法为:最邻近插值(近邻取样法)
pre_j = (int)(after_j / ExpScalValue);
if (pre_i >= 0 && pre_i < bmpHeight && pre_j >= 0 && pre_j < bmpWidth)//在原图范围内
*(imagedataScal + i * lineByte2 + j * 3 + k) = *(imagedata + pre_i * bmpWidth * 3 + pre_j * 3 + k);
}
}
}
//保存bmp图片
char writePath[] = "C:\\Users\\hu.CHALLENGER\\Desktop\\13.bmp";
saveBmp(writePath, imagedataScal, FloatToIntwidth, FloatToIntheight, biBitCount, pColorTable);
printf("缩放变换完成,请查看13.bmp文件。\n\n");
//释放内存
delete[] imagedata;
delete[] imagedataScal;
}
void main()
{
char readPath[50];
cout << "请输入所要读取的文件名:" << endl;
cin >> readPath;
image_scaling_nearest(readPath);
}
这个是运行时出错的截图
跪求解决,万分感谢!!!