VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 100|回复: 0

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

[复制链接]
75_avatar_middle
在线会员 发表于 7 天前 | 显示全部楼层 |阅读模式
测试前,先用画图建个位图,命令为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;
}




上一篇:写给编程新手的几条建议!
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

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

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

GMT+8, 2019-3-21 16:39

Powered by Discuz! X3.4

© 2009-2019 cctry.com

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