在下新手,七拼八凑写了个程序,运行总是出错,各位大佬帮忙看一下

qq_25749069 2018-07-09 03:20:10
这是在下的程序:一个最近邻差值放大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);

}
这个是运行时出错的截图

跪求解决,万分感谢!!!
...全文
283 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
AlbertS 2018-07-13
  • 打赏
  • 举报
回复
你这是内存越界了,看看是不是分配的不够,或者索引错了,调试一下就能发现问题
棉猴 2018-07-13
  • 打赏
  • 举报
回复
VS2015编译,把一些头文件和命名空间注释掉之后,可以运行
PDD123 2018-07-12
  • 打赏
  • 举报
回复
新手就不要搞那么复杂的程序啊。从简单的来。
赵4老师 2018-07-09
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止
Isnis-fallen 2018-07-09
  • 打赏
  • 举报
回复
中断后看调用堆栈, 定位到函数里, 看有没有数组访问越界等内存非法访问
weixin_42359982 2018-07-09
  • 打赏
  • 举报
回复
你可以调试看看是哪里出错的,这个问题一般都是内存分配出了问题,你可以在出错的地方检查下你的数组

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧