VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 1109|回复: 1

[交流] 最新位图数据流读取方式

[复制链接]
75_avatar_middle
最佳答案
0 
在线会员 发表于 2019-3-14 20:40:35 | 显示全部楼层 |阅读模式
测试前,先用画图建个位图,命令为demo.bmp.尺寸任选。
注意:这是把位图全部载入内存。其中byteArray 可以不管它释放,内存自动管理,退出析构。
        如果载入的是文本文件。可以注释掉显示位图信息。添加
        for (auto item: *byteArray.get()) {
                cout << item;
        }
       或
        for (UINT i = 0;i < byteArray->size();i++)
        {
                cout << byteArray->data()[i];
        }
        显示文本。
源代码
#include "stdafx.h"
#include<iostream>
#include<fstream>
#include<vector>
#include <memory>
#include <string>
#include <windows.h>
using namespace std;
typedef shared_ptr<vector<byte>> ByteArray;
int main()
{
        wstring filename = L"demo.bmp";
        //检查文件是否存在
        struct _stat64 fileStat;
        int fileExists = _wstat64(filename.c_str(), &fileStat);
        if (fileExists == -1) {
                wcout << filename.c_str() << " not found!" << endl;
                return -1;
        }
        //检查文件是否能读
        ifstream file(filename, ios::in | ios::binary);
        if (!file) {
                wcout << filename.c_str() << "cannot input!" << endl;
                return -1;
        }
        //将文件读入内存表
        //tellg是64位,编译x86,需要(unsigned int),不然有个提示
        ByteArray byteArray = make_shared<vector<byte> >((unsigned int)file.seekg(0, ios::end).tellg());
        file.seekg(0, ios::beg).read((char*)byteArray->data(), byteArray->size());
        file.close();
        //文件大小检查
        if (byteArray->size() != (size_t)fileStat.st_size) {
                wcout << filename.c_str() << "read size error!" << endl;
                return -1;
        }
       //处理
        BITMAPFILEHEADER *bfh =(BITMAPFILEHEADER *)byteArray->data();
        BITMAPINFOHEADER*bi =(BITMAPINFOHEADER*)(byteArray->data()+sizeof(BITMAPFILEHEADER));
        BYTE*pdata = byteArray->data() + sizeof(BITMAPFILEHEADER)+ sizeof(BITMAPINFOHEADER);
        wcout << "位图名:" << filename.c_str() << endl;
        cout << "\n文件头信息\n===========" << endl;
        cout << "文件类型:" << hex<< bfh->bfType << endl;
        cout << "文件大小:" << dec<< bfh->bfSize << endl;
        cout << "数据起始偏移:" << dec << bfh->bfOffBits << endl;
        cout << "文件头大小:" << dec << sizeof(BITMAPFILEHEADER) << endl;
        cout << "\n位图信息\n============" << endl;
        cout << "位图信息头结构大小:"<< dec << bi->biSize << endl;
        cout << "宽度:"  << dec << bi->biWidth << endl;
        cout << "高度:"  << dec << bi->biHeight << endl;
        cout << "平面:"  << dec << bi->biPlanes << endl;
        cout << "位长:"  << dec << bi->biBitCount << endl;
        cout << "图像类型:"  << dec << bi->biCompression << endl;
        cout << "图像大小:"   << dec << bi->biSizeImage << endl;
        cout << "水平分辨率:" << dec << bi->biXPelsPerMeter << endl;
        cout << "垂直分辨率:" << dec << bi->biYPelsPerMeter << endl;
        cout << "使用颜色:"   << dec << bi->biClrUsed << endl;
        cout << "重要颜色:"   << dec << bi->biClrImportant << endl;
        cout << "\n位图数据\n============" << endl;
        cout << "数据开始:" << dec << (pdata - byteArray->data()) << endl;
        cout << "数据大小:" << dec << (byteArray->size() - (pdata - byteArray->data())) << endl;
        return 0;
}

评分

参与人数 1驿站币 +2 热心值 +2 收起 理由
58_avatar_small thzzl + 2 + 2 赞一个!

查看全部评分





上一篇:写给编程新手的几条建议!
下一篇:嘿,要爱护自己的眼睛!
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号-4 )|网站地图wx_jqr

GMT+8, 2021-6-18 23:10

Powered by CcTry.CoM

© 2009-2021 cctry.com

快速回复 返回顶部 返回列表