【实验二】图像文件的读写和转换

实验二、图像文件的读取和转换

一、概述

  本次实验的重点问题有二。其一是如何处理以BMP为例的图像文件;而其二则是如何以结构体的方式来处理复杂数据对象。

  本次实验对我来说是一次承上启下的经历。在这之前,我只操作和处理过毫无格式的yuv数据和rgb数据。而在这些raw data之外的一切都是神秘而不可知的。但经过这次实验,我亲眼看见了文件里的一切。这不仅刷新了我对图像文件的认识,更让我对数字电视技术以及计算机网络中的很多知识的理解都很有帮助。

二、实验涉及的基本原理

  1.涉及原理汇总

  涉及原理有:BMP文件的组成结构,结构体的用法以及对非24位真彩色bmp位图的位操作和调色板调用。

  2.BMP文件的组成结构

       BMP文件的组成结构非常简单,通俗的理解就不过是给我们之前操作过的rgb数据加上了头。但实际上BMP文件的组成结构并没有这么简单,按我的理解其至少有两个层次。第一层是文件的层,其中有文件头与信息,而第二层则是信息的层,其中有信息头、调色板信息(可选)和图像数据。

       而这些头的最大作用便是能够告诉你我这一层的相关信息,这种自包含的属性是相当重要的。

       其中文件头(BITMAPFILEHEADER)14字节,信息头(BITMAPINFOHEADER)40字节,如下图:

     【图2.0】BMP文件结构


  3.结构体的用法

       如你所见,BMP位图的文件结构相当简单,那么为什么我们还要费劲去建那么多结构体来处理它呢?我头硬,我想要什么就直接把文件指针移过去读不就行了吗?

       这确实是一个不用结构体的好理由。如果我处理一帧图像,建个结构体也确实并没有简便多少。但是如果我要处理很多帧呢?甚至是不同宽高大小不同帧数的视频文件呢?这时候才是体现结构体优势的地方。

       结构体的好处并不在于其简便,而在于其封装性。而封装性的好处就是便于复用。封装好的东西有时候你都不用知道里面是什么就可以直接拿出来用。

     【代码2.0】BMPFILEHEADER和BMPINFOHEADER的定义

#define BYTE	unsigned char
#define WORD	unsigned short
#define DWORD	unsigned long
#define LONG	long

typedef struct
{
	//WORD bfType;
	DWORD bfSize;
	WORD bfReserved1
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值