Java实现24位真彩转换为8位灰度图片

本文介绍了Windows下BMP文件格式的组成部分,并详细讲解了如何使用Java将24位真彩色图像转换为8位灰度图像,包括灰度计算公式和转换过程中的数据处理步骤。
摘要由CSDN通过智能技术生成

         Windows下的位图文件即我们通常所熟悉的BMP图片,其存储结构的格式可以在WINGDI.h文件中找到定义。BMP文件大体上分为四个部分:

1.      位图文件头(BITMAPFILEHEADER

2.      位图信息头(BITMAPINFOHEADER

3.      调色板(PALETTE)

4.      位图数据(IMAGEDATA)

根据颜色深度的不同,图像上的一个像素可以用一个或者多个字节表示,它由n/8所确定(n是位深度,1字节包含8个数据位)。这里需要注意的是,对于调色板(也叫颜色查找表LUT(LookUpTable),索引表),不是每一种类型的位图都有的。对于24位的真彩色RGB位图,就是没有调色板的,原因:如果用调色板,总共有2的24次种颜色,所以表示每种颜色的索引也需要24位,和直接用3B来表示RGB数据一样,还得加上一个调色板的容量,完全是吃饱了撑着。所以调色板只是对于16,8,4,1位位深的位图来说的。

首先来看下256阶位图(位深度为8)的前两个部分数据。以下为16进制值:

                                                          图 一

1.      BITMAPFILEHEADER(对应图一的0000H -- 000DH

WINGDI.h中该部分定义如下:

typedef struct tagBITMAPFILEHEADER {
        WORD    bfType;
        DWORD   bfSize;
        WORD    bfReserved1;
        WORD    bfReserved2;
        DWORD   bfOffBits;
} BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER, *PBITMAPFILEHEADER;

前两个字节(42H,4DH)为ASCII码,代表BM,这是在Windows下BMP文件的标识符,对应结构体中的bfType;

接下来的四个字节(36H,75H,02H,00H )代表的是文件大小,这里高位在后,所以文件大小应该是27536H = 161078字节,对应结构体中的bfSize;

然后为四个字节的保留值,总为0,对应bfReserved1,bfReserved2;

最后四个字节(36H,04H,00H,

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值