BMP格式知识之二:16位,24位,32位的BMP图片算法是如何运算的

原文:http://blog.csdn.net/qq445803843/article/details/46476433
这段代码的作用是将缓冲区里的24位、16位、32位的数据转换成RGB565格式的16位颜色值。

[cpp] view plaincopy
  1. if(color_byte == 3)   //24位颜色图
  2. {
  3. switch ( rgb )
  4. {
  5. case 0 : tmp_color = buffer[count]>>3 ;//为什么要右移3位呢,它表示的是什么?
  6. color |= tmp_color;
  7. break ;
  8. case 1 : tmp_color = buffer[count]>>2 ;//为什么要右移2位呢,它表示的是什么?
  9. tmp_color <<= 5 ;为什么要左移5位呢,它表示的是什么?
  10. color |= tmp_color ;
  11. break ;
  12. case 2 : tmp_color = buffer[count]>>3 ;//为什么要右移3呢,它表示的是什么?
  13. tmp_color <<= 11 ;//为什么左移11位,它表示的是什么?
  14. color |= tmp_color ;
  15. break ;
  16. }
  17. rgb ++ ;
  18. }
  19. else
  20. {
  21. if(color_byte==2)  //16位颜色图
  22. {
  23. switch ( rgb )
  24. {
  25. case 0 : byte1 = buffer[count] ;//,它表示的是什么?
  26. break ;
  27. case 1 :
  28. color = buffer[count] ;//它表示的是什么?
  29. color<<=8 ;
  30. color |= byte1 ;
  31. break ;
  32. }
  33. rgb ++ ;
  34. }
  35. else
  36. {
  37. if(color_byte==4) //32位颜色图
  38. {
  39. switch ( rgb )
  40. {
  41. case 0 :  byte1 = buffer[count] ;
  42. break ;
  43. case 1 :  byte2 = buffer[count] ;
  44. break ;
  45. case 2 :  byte3 = buffer[count] ;
  46. break ;
  47. case 3 :  tmp_color = byte1 >> 3 ;//为什么要右移呢,它表示的是什么?
  48. color |= tmp_color;
  49. tmp_color = byte2 >>2 ;//为什么要右移呢,它表示的是什么?
  50. tmp_color <<= 5 ;
  51. color |= tmp_color ;
  52. tmp_color = byte3 >>3 ;//为什么要右移呢,它表示的是什么?
  53. tmp_color <<= 11 ;
  54. color |= tmp_color ;
  55. break ;
  56. }
  57. rgb ++ ;
  58. }
  59. }
  60. }

24位BMP文件:(rrrrrrrr,gggggggg,bbbbbbbb)蓝色在低地址
16位BMP文件:RGB555-xRRRRRGGGGGBBBBB,RGB565-RRRRRGGGGGGBBBBB,蓝色在低地址
32位BMP文件:(xxxxxxxx,rrrrrrrr,gggggggg,bbbbbbbb)蓝色在低地址,最高那个字节一般不处理。

你这段代码中的color应该是16位颜色,并且是RGB565格式,也就是红色5位,绿色6位,蓝色5位,RRRRRGGGGGGBBBBB。

24位转16位时,蓝色右移3位,是因为需要将8位蓝色转成5位蓝色,绿色先右移2位,是因为从8位转成6位,然后再左移5位,就是移到RGB565的16位数值的中间的位置上,00000GGGGGG00000,红色右移3位,就是8位转成5位,再左移11位,就是RRRRR00000000000。

16位转16位,直接将2字节拼接起来。

32位转16位,和24转16位类似,也是需要将8位颜色截短为5位和6位,然后拼起来。

0
0

BMP格式知识之二:16位,24位,32位的BMP图片算法是如何运算的相关推荐

  1. BMP格式知识之五:BMP文件格式(全一/二)

    BMP文件格式 简介:BMP是一种与硬件设备无关的图像文件格式,使用非常广.它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP文件所占用的空间很大.BMP文件的图像深度可选l ...

  2. 16位调色板和32位调色板_设计系统的调色板第一部分

    16位调色板和32位调色板 重点(Top highlight) 第1部分(Part 1) I've been creating custom design systems for over five ...

  3. MD5加密,16位加密,32位加密,Base64加密,解密

    首先,16位加密与32位加密的区别,在于16位加密就是在32位加密的字符串中取中间16位,即是第9位到24位 比如现在有密码 sys 32位加密后的字符串就是 36BCBB801F5052739AF8 ...

  4. 什么是32位单片机?32位单片机有哪些优点和缺点?8位,16位,32位是什么区别?

    一.什么是32位单片机 单片机有8位单片机.16位单片机.32位单片机等多种,这里位指的是数据处理一次能的够处理的数据的位宽,32位单片机,就是指一次能够处理的数据的位宽是32个比特位的单片机.简单地 ...

  5. 键盘与显示实验程序c语言,16位微机原理,32位微机原理接口教学实验系统,64位微机原理接口实训...

    TW-X38 16.32位微机原理与接口教学实验系统 一.硬件概述 TW-X38现代32位微机原理与接口技术教学实验系统的升级换代产品,采用Intel i386EX嵌入式微处理器作为系统核心,全面支持 ...

  6. 汇编语言——16位寄存器实现32位二进制数左移4位。

    问题描述 16位寄存器实现32位二进制数左移4位. 源代码 MOV CL, 04 SHL DX, CL MOV BL, AH SHL AX, CL SHR BL, CL OR DL, BL 说明:  ...

  7. 16位调色板和32位调色板_使调色板可访问

    16位调色板和32位调色板 Accessibility has always been a tough sell. Admittedly, less so than in the 'nineties, ...

  8. 16位调色板和32位调色板_12种调色板提取器和站点色彩灵感资源

    16位调色板和32位调色板 Sometimes the hue muse fails to strike; sometimes all you're provided for the look and ...

  9. 修改开机LOGO图片教程及注意事项/通过C++实现bmp图位深度从32位转换为8位

    修改开机LOGO图片教程及注意事项/通过C++实现bmp图位深度从32位转换为8位 文章目录 修改开机LOGO图片教程及注意事项/通过C++实现bmp图位深度从32位转换为8位 修改开机LOGO图片教 ...

最新文章

  1. 如何在命令行下更改ip地址
  2. Kubernetes 稳定性保障手册:洞察+预案
  3. [Python从零到壹] 十四.机器学习之分类算法五万字总结全网首发(决策树、KNN、SVM、分类对比实验)
  4. Appium Java
  5. 高性能队列--Disruptor
  6. (二)oracle的SGA
  7. 测试环境搭建mysql数据库_软件测试环境的搭建系列:[2] MySQL数据库的安装
  8. [Python3] 017 字典的内置方法
  9. Dreamweaver简单的表格附加代码
  10. 理想,努力了才叫梦想,放弃了那只是妄想
  11. Unity3D Gamma,Linear和sRGB
  12. 软件测试--------数据库MySQL 常用sql语句
  13. 什么是pptp,什么是vps?两者有何区别?
  14. 晶圆在低温探针台中的安装方式——N-Grease真空油脂和夹具
  15. 四阶龙格库塔法的基本思想_利用龙格库塔法求解郎之万方程.doc
  16. 【笔试or面试】3G门户校园招聘
  17. UE4引用第三方库Lib以及dll
  18. 强制删除文件 lockdir
  19. 北斗三号短报文功能手机成果发布,前景如何?
  20. 水果识别系统人工智能,卷积神经网络水果识别

热门文章

  1. mysql 游标循环_mysql for循环遍历 游标用处
  2. 计算机利用公式计算实发工资怎么弄,2019新个税Excel计算器公式 助你轻松算出工资...
  3. java实现选项卡定时轮播_原生js面向对象编程-选项卡(自动轮播)
  4. oracle中表空间创建,Oracle 如何创建表空间
  5. video.min.js php,使用flv.js与video.js做一个视频直播效果
  6. linux主机怎么建站,linux主机建站
  7. 批量关闭公众号推送_微信内测新功能:提醒用户可停止接收长期不阅读公众号推送...
  8. 文件管理服务器主机,通过BlueHost主机文件管理器上传文件
  9. java mina多线程_mina2中的线程池
  10. 继国美处罚“摸鱼”员工后,网易出品之摸鱼计算器...