皮皮的疑惑 2019-05-27 15:29 采纳率: 0%
浏览 1234

我用c++写了个图像显示程序,为什么显示出来是这样的?

用c++写了个图像显示程序,但是显示出来的图像是这样的图片说明

有没有童鞋帮我看看哪里出错了,,,万分感激!
这是我的代码
#include
#include
#include
#include
#include
#include
using namespace std;

//显示位图文件头信息

void showBmpHead(BITMAPFILEHEADER pBmpHead)
{

cout<<"位图文件头:"<<endl;

cout<<"文件大小:"<<pBmpHead.bfSize<<endl;

cout<<"保留字_1:"<<pBmpHead.bfReserved1<<endl;

cout<<"保留字_2:"<<pBmpHead.bfReserved2<<endl;

cout<<"实际位图数据的偏移字节数:"<<pBmpHead.bfOffBits<<endl<<endl;

}

void showBmpInforHead(tagBITMAPINFOHEADER pBmpInforHead)
{

cout<<"位图信息头:"<<endl;

cout<<"结构体的长度:"<<pBmpInforHead.biSize<<endl;

cout<<"位图宽:"<<pBmpInforHead.biWidth<<endl;

cout<<"位图高:"<<pBmpInforHead.biHeight<<endl;

cout<<"biPlanes平面数:"<<pBmpInforHead.biPlanes<<endl;

cout<<"biBitCount采用颜色位数:"<<pBmpInforHead.biBitCount<<endl;

cout<<"压缩方式:"<<pBmpInforHead.biCompression<<endl;

cout<<"biSizeImage实际位图数据占用的字节数:"<<pBmpInforHead.biSizeImage<<endl;

cout<<"X方向分辨率:"<<pBmpInforHead.biXPelsPerMeter<<endl;

cout<<"Y方向分辨率:"<<pBmpInforHead.biYPelsPerMeter<<endl;

cout<<"使用的颜色数:"<<pBmpInforHead.biClrUsed<<endl;

cout<<"重要颜色数:"<<pBmpInforHead.biClrImportant<<endl;

}

void main ()
{
char fileName[30]; //定义打开图像名字
char buf; //定义文件读取缓冲区
char *p;
int r,g,b,pix;
HWND wnd; //窗口句柄
HDC dc; //绘图设备环境句柄
FILE *fp; //定义文件指针
FILE *fpw; //定义保存文件指针
DWORD w,h; //定义读取图像的长和宽
DWORD bitSize; //定义图像的大小
BITMAPFILEHEADER bf; //图像文件头
BITMAPINFOHEADER bi; //图像文件头信息
cout<<"请输入要打开文件的名字:(如:e:\1.bmp)";
cin>>fileName;
if((fp=fopen(fileName,"rb"))==NULL)
{
cout<<"文件未找到!";
exit(0);
}
fread(&bf,sizeof(BITMAPFILEHEADER),1,fp);//读取BMP文件头文件
showBmpHead(bf);
fread(&bi,sizeof(BITMAPINFOHEADER),1,fp);//读取BMP文件头文件信息
showBmpInforHead(bi);
w=bi.biWidth; //获取图像的宽
h=bi.biHeight; //获取图像的高
bitSize=bi.biSizeImage; //获取图像的size
buf=(char
)malloc(w*h*3); //分配缓冲区大小
fseek(fp,long(40+14+sizeof(RGBQUAD)),0);//定位到像素起始位置
fread(buf,1,w*h*3,fp); //开始读取数据
wnd=GetForegroundWindow(); //获取窗口句柄
dc=GetDC(wnd); //获取绘图设备
DWORD x=440;
DWORD y=160;//图片显示的左上角点
p=buf;
for(DWORD j=0;j<h;j++)
{
for(DWORD i=0;i<w;i++)
{
b=*p++;g=*p++;r=*p++;
pix=RGB(r,g,b);
SetPixel(dc,x+i,y+h-j,pix);
}
}
fpw=fopen("LenaSaved.bmp","wb");
fwrite(&bf,sizeof(BITMAPFILEHEADER),1,fpw); //写入文件头
fwrite(&bi,sizeof(BITMAPINFOHEADER),1,fpw); //写入文件头信息
p=buf;
for( DWORD j=0;j<h;j++)
{
for(DWORD i=0;i<w*3;i++)
{
fwrite(p++,1,1,fpw);
}
}
fclose(fpw);
fclose(fp);
//return fp;
system("pause");
}

  • 写回答

1条回答

  • threenewbee 2019-08-08 22:38
    关注

    这是直接在控制台窗口画图?但是这个窗口本身也有绘图的操作,所以可能会导致你画的部分被擦除,最好是开一个新窗口,在wm_paint里面画,保持住所画的图形

    评论

报告相同问题?

悬赏问题

  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥200 uniapp长期运行卡死问题解决
  • ¥15 latex怎么处理论文引理引用参考文献
  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?
  • ¥15 乘性高斯噪声在深度学习网络中的应用