一.与设备无关位图的显示(DIB)

与设备无关位图(DIB)可以在不同的及其或者系统中小时位图所固有的颜色。DIB是一种外部的位图格式,经常存储以BMP为后缀的位图文件。DIB位图还支持图像数据的压缩。

1.BMP文件组成

BMP文件有文件头、位图相信头、颜色信息和图像数据四部分组成。位图结构如下所示:

位图文件头结构BITMAPFILEHEADER

位图信息头结构BITMAPINFOHEADER

位图颜色表RGBQUAD

位图像素数据

a.BMP文件头

BMP文件头数据结构含有BMP文件的类型、文件大小和位图其实位置等信息。其结构定义如下:

typedef struct tagBITMAPFILEHEADER {

WORD    bfType;             //位图文件的类型,必须为BMP

DWORD   bfSize;             //位图文件的大小,一字节为单位

WORD    bfReserved1;       //位图文件的保留字,必须为O

WORD    bfReserved2;       //位图文件的保留字,必须为O

DWORD   bfOffBits;         //位图数据的起始位置,一相对于位图文件

//的偏移量表示,以字节为单位

} BITMAPFILEHEADER, *PBITMAPFILEHEADER;

b.位图信息头

BMP位图信息头数据用于说明位图的尺寸等信息。

typedef struct tagBITMAPINFOHEADER{
  DWORD  biSize;           //本结构所占用的字节数
  LONG   biWidth;          //位图的宽度,以像素为单位
  LONG   biHeight;         //位图的高度,一像素为单位
  WORD   biPlanes;         //目标设备的级别,必须为1
  WORD   biBitCount;       //每个像素所需要的位数,必须是1(双色),//4(16色),8(256色)或24(真彩色)之一
  DWORD  biCompression;    //位图压缩类型,必须是0(不压缩),1
//(BI_RLE8//压缩类型)或者2(BI_REL4)之一
  DWORD  biSizeImage;      //位图的大小,以字节为单位 
  LONG   biXPelsPerMeter;  //位图水平分辨率,每米像素数
  LONG   biYPelsPerMeter;  //位图垂直分辨率,每米像素数
  DWORD  biClrUsed;        //位图实际使用的颜色表中的颜色数
  DWORD  biClrImportant;   // 位图显示过程中重要的颜色数
} BITMAPINFOHEADER, *PBITMAPINFOHEADER; 
 
c.颜色表
颜色表用于说明位图中的颜色,它有若干个表项,每一个表项是一个RGBQUAD类型的结构,定义一种颜色。RGBQUAD结构的定义如下:
typedef struct tagRGBQUAD 
{
  BYTE    rgbBlue; //蓝色的亮度
  BYTE    rgbGreen; //绿色的亮度
  BYTE    rgbRed;// 红色的亮度
  BYTE    rgbReserved; //保留,必须为0
} RGBQUAD; 
颜色表中RGBQUAD结构数据的个数由biBitCount来确定:
当biBitCount = 1,4,8,时,分别有2,16,256个表项;
当biBitCount = 24时,没有颜色表项。
位图信息头和颜色表组成位图信息,BITMAPINFO结构定义如下:
Typedef struct tagBITMAPINFO
{ 
  BITMAPFILEHEADER  bmiHeader;//位图信息头
RGBQUAD bimColors[1];       //颜色表
}
d.位图数据
位图数据记录了位图的没一个像素值,记录顺序是在扫描行内是从左到右,扫描行之间是从下到上。位图的一个像素所占的字节数:
当biBitCount = 1时,8个像素占一个字节;
当biBitCount = 4时,2个像素占一个字节;
当biBitCount = 8时,一个像素占一个字节;
当biBitCount = 24时,一个像素占3个字节。

二.BMP图像的显示

大多数图像处理都是基于与设备无关位图(DIB)来进行讨论的,我们所使用的是方法是windows API来实现BMP的显示,而API中又没有处理DIB位图的类,所以需要定义一个处理DIB位图的专用Cbmp类,在其中封装必要而有效的DIB数据成员和处理函数,该类具有的功能如下:

class CBmp

{

public:

int GetHeight();//返回位图的高度

int GetWidth();//返回位图的宽度

bool SaveToFile(CString & filename); //保存位图

bool IsCreate();

void ShowBmp(HDC hdc,int x,int y,double k); //显示BMP位图

bool SetColor(int x,int y,COLORREF color);

COLORREF GetColor(int x,int y);

bool Create(int width,int heigh);

bool CreateFromFile(CString &FileName); //图像文件读取

CBmp();

virtual ~CBmp();

private:

bool is_create;

int BytesPerLine;

int buffer_size;

const int Max_Width;

const int Max_Height;

char * buffer;

int Width;

int Height;

};

Cbmp类设计的目标

用面向对象的方法处理位图的核心是设计一个DIB的类,称之为Cbmp类,我主要从功能、数据封装、和继承等方面来分析Cbmp类的设计目标。

1.功能

a.根据上面对DIB操作的分析,Cbmp的基本功能包括:

b.DIB文件的读、写;

c.提供位图宽度、高度、颜色数目等位图相关信息;

d.提供有关位图占据内存空间信息,包括:图像数据区首地址、颜色表首地址、位图信息结构首地址等信息。

2.数据封装

面向对象方法的一个主要的特征就是数据封装,即将类的成员数据隐藏在类中,外界只能通过类的成员函数来操作类的成员数据。这是面向对象方法的重要优点,它可以保护类中的数据不受外界的故意修改。

3.继承

在这里不多介绍!

三.DICM图像的读取与显示

DICM数据的编码方式和文件结构在莘浩萍本科毕业论文中有详细的论述。

将DCM图像转化为BMP图像

要把DICOM图像转换为BMP图像,首先要读取DICOM图像文件中的参数。通过DICOM说明文件或DICOM标准中的数据字典,查询到存储图像的相关数据,主要有:图像显示矩阵,即图像的宽与高;图像存储位数,即每一个像素占用几个字节,如果图像为标准的12位灰度(黑白)图像,必然占用2个字节;找到标签号为(7FE0,0010)的元素,它指明了图像像素的起始位置。

DICOM中像素的显示顺序是从左到右,从上到下,第一行显示完再显示第二行,设左上角第一个像素坐标为(1,1),在存储文件中的地址为“A0”,显示矩阵为宽M、高N,图像显示的时候某一坐标为(X,Y)的像素点在文件中存储的位置为:2×[X+M×(Y-1)-1]+A0。

有了以上数据,就可以确定BMP图像的相关参数,确定每一个像素在文件中的存储位置。但与DICOM图像中像素的显示顺序不同的是,BMP图像从左下角开始显示,从左到右,从下到上,因此要将DICOM图像中最下排的像素填到BMP图像的最上排。

需要注意的是:BMP图像中,其存储像素的蓝、绿、红3个字节的值相等就构成了黑白图像,因此在显示黑白图像时,这3个字节只包含一个字节的信息量,从而BMP图像只能包含8位256个灰度等级。而DICOM的12位灰度图像可以包含4096个灰度等级。将12位的DICOM图像转换为BMP图像,必须进行变换。

变换利用窗口技术,变换之前,要先读取DICOM图像中的显示窗宽、窗位值(在DICOM设备或软件中,将窗宽、窗位调节到最佳),根据窗位确定中间值,低于窗宽的显示为最

暗,高于窗宽的显示为最亮,窗宽范围内的值通过线性或非线性变换转换为小于256的值。由于人眼的分辨率有限,256个灰度级已完全能满足人眼的辨别极限。

对于8位的黑白图像或彩超等的彩色图像的像素,和BMP的单个像素长度结构一致,只须按坐标位置填入BMP图像中即可。

四.DICM转换的具体实现:

有DICM的复杂性,本文只针对某些DCM图像做读取与显示。

首先在Cbmp类中添加public成员函数:

bool CreateFromDicm(DICM & Dicm);//从DICM图像中读取数据

设计一个新的类DICM,其成员变量和成员函数如下:

class DICM

{

public:

bool IsCreate();

int buffer_size;

char * buffer;

bool CreateFromFile(CString & filename);//从文件中打开图像

bool Create();

DICM();

virtual ~DICM();

private:

bool is_create;

};

DICM和BMP图像的显示及转换相关推荐

  1. C语言读取bmp图像并做简单显示

    C语言读取bmp图像并做简单显示) bmp文件格式 读取bmp文件信息并展示 bmp文件格式 bmp文件大体上分为四个部分: bmp文件构成 位图文件头BITMAPFILEHEADER 位图信息头BI ...

  2. mysql显示bmp图片_BMP格式图像的显示

    使用多文档编程 也可以使用单文档编程 建立一个DIB图像的显示类 ImageDib 成员变量: 4个指针: LPBYTE m_lpDib;      //指向DIB的指针 LPBITMAPINFOHE ...

  3. BMP格式图像的显示

    使用多文档编程 也可以使用单文档编程 建立一个DIB图像的显示类 ImageDib 成员变量: 4个指针: LPBYTE m_lpDib;      //指向DIB的指针 LPBITMAPINFOHE ...

  4. DICOM医学图像处理:DICOM存储操作之“多幅BMP图像数据存入DCM文件”

    背景: 本专栏"DICOM医学图像处理"受众较窄,起初只想作为自己学习积累和工作经验的简单整理.前几天无聊浏览了一下,发现阅读量两极化严重,主要集中在"关于BMP(JPG ...

  5. opencv 图像读写显示、matplotlib 库图像读写显示

    图片格式: bmp 全称:Bitmap 不压缩 png 全称:Portable Network Graphics 无损压缩 jpg 全称:Joint Photographic Experts Grou ...

  6. 使用MFC实现将图像的RGB值转换到HSV空间,同时进行调节HSV,再将调节后的HSV值传进去转换到RGB空间实现图像在HSV空间中的色度、饱和度、亮度的调节

    工程上传到了github ,之前有一版忘记推送了,现在这个链接应该是没问题的了 工程的github链接 希望能帮到你. 文章内容: 1.回顾上文 2.实验步骤&要点提示&代码分析 3. ...

  7. VS2010读取大恒相机图像并显示

    1.首先去大恒官网安装软件 安装完成后有以下文件夹 2.配置VS2010的环境 3.编写C++代码 #include <iostream> #include <fstream> ...

  8. 【STM32调试(三)】采集bmp图像保存在SD卡

    将图像保存在SD卡 一.思路 二.移植文件系统 三.保存图片 四.实验结果 一.思路 这里保存的是BMP图像,需要先连接bmp图像的数据格式.在STM32上采集的数据格式是RGB565方便在LCD上显 ...

  9. Python,OpenCV骨架化图像并显示(skeletonize)

    Python,OpenCV骨架化图像并显示(skeletonize) 1. 效果图 2. 源码 参考: 1. 效果图 自己画一张图,原图 VS 骨架效果图如下: opencv logo原图 VS 骨架 ...

  10. bmp文件头_「正点原子FPGA连载」第十九章SD卡读BMP图片LCD显示

    1)摘自[正点原子]领航者 ZYNQ 之嵌入式开发指南 2)实验平台:正点原子领航者ZYNQ开发板 3)平台购买地址:https://item.taobao.com/item.htm?&id= ...

最新文章

  1. JavaScript test() 方法
  2. Kotlin难点解析:extension和this指针
  3. 有开电商的集合了,了解Water Pamola通过恶意订单对电商发起攻击
  4. MatConvnet中集成的损失函数(孪生网络的思考)
  5. 业务团队如何统一架构设计风格?
  6. poj 1208 Web Navigation(堆栈操作)
  7. 没有收到回复的同学注意了,用它一键查询!
  8. 911计算机专业基础综合,青岛大学10数据结构911计算机专业综合
  9. Fbinst增强版 命令详解
  10. http错误码分析和解决
  11. python可以代替plc吗_python 读写西门子PLC 包含S7协议和Fetch/Write协议,s7支持200smart,300PLC,1200PLC,1500PLC...
  12. CVE-2017-8464 震网三代
  13. oracle dataaccess component,【Delphi】运用Oracle Data Access Component(ODAC)组件
  14. 【k8s】kubernetes编写自己的operator(operator-sdk:v1.xxx)
  15. 图片懒加载和Vue路由懒加载
  16. 元器件采购系统的主要功能,数字化采购助力元器件企业飞速发展
  17. 【知识建设】信息熵、条件熵、互信息、交叉熵及相对熵(KL散度)
  18. vue 如何在 style 标签里使用变量(数据)
  19. 阿拉伯世界的历史现状与前景2019尔雅满分答案
  20. 【求助】 C++如何在堆区创建 string 数组并且访问,o(╥﹏╥)o

热门文章

  1. java中数据库查询_在java中对数据库查询
  2. visio业务流程图教学_用visio软件怎样画数据流程图和业务流程图?
  3. android listview viewstub,Android中使用ViewStub提高布局性能
  4. Fluid mechanics学习笔记--NS方程
  5. 全国地址SQL数据文件(精确到区县)
  6. 3DMM-Fitting_Pytorch代码阅读
  7. 后台管理系统推荐(PHP)
  8. 鸟哥的Linux私房菜知识点总结(持续更新中)
  9. 莫烦-pytorch
  10. 人人开源快速搭建脚手架工程