C语言和OpenGL实现的24位色BMP解码器

我突然很喜欢发明轮子。。

早就想实现一下图片解码器和声音解码器。

bmp的图片没有压缩,解码最简单,今天下午研究了一下bmp的编码,然后写了个24位色的解码器。(24位色的bmp没有调色板,8位和16位都有)。

代码很简单,直接就能看懂,所以不说很多,直接贴了。。

 1 #define _CRT_SECURE_NO_WARNINGS
 2
 3 #include <stdio.h>
 4 #include <Windows.h>
 5 #include <gl/freeglut.h>
 6
 7 float colorR[2048][2048] = { 0 };
 8 float colorG[2048][2048] = { 0 };
 9 float colorB[2048][2048] = { 0 };
10 unsigned int width = 0;
11 unsigned int height = 0;
12
13 //从data的index开始,把前面count个字节(char)转化成int
14 unsigned int transByteToInt(char* data, int index, int count)
15 {
16     int res = data[index] & 0xff;
17     for (int i = 1; i < count; i++) {
18         res <<= 8;
19         res |= data[index - i] & 0xff;
20     }
21     return res;
22 }
23
24 void readBmp()
25 {
26     FILE* bmpFile = fopen("F:/test.bmp", "rb");
27     char bmpHeader[14];
28     char infoHeader[40];
29     fread(bmpHeader, 1, 14, bmpFile);
30     fread(infoHeader, 1, 40, bmpFile);
31     width = transByteToInt(infoHeader, 7, 4);
32     height = transByteToInt(infoHeader, 11, 4);
33     int bitCount = transByteToInt(infoHeader, 15, 2);
34     int sizeImage = transByteToInt(infoHeader, 23, 4);
35     char color[3] = { 0 };
36     for (int h = height - 1; h >= 0; --h) {
37         for (int w = 0; w < width; ++w) {
38             fread(color, 1, 3, bmpFile);
39             colorR[h][w] = (color[2] & 0xff) / 255.0f;
40             colorG[h][w] = (color[1] & 0xff) / 255.0f;
41             colorB[h][w] = (color[0] & 0xff) / 255.0f;
42         }
43     }
44     fclose(bmpFile);
45 }
46
47 void glInit()
48 {
49     glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
50     glMatrixMode(GL_PROJECTION);
51     glLoadIdentity();
52     glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);
53 }
54
55 void display()
56 {
57     glClear(GL_COLOR_BUFFER_BIT);
58     glBegin(GL_POINTS);
59         for (int i = 0; i < width; ++i) {
60             for (int j = 0; j < height; ++j) {
61                 glColor3f(colorR[height - j][i], colorG[height - j][i], colorB[height - j][i]);
62                 glVertex3f((float)i / width, (float)j / height, 0.0f);
63             }
64         }
65     glEnd();
66     glFlush();
67 }
68
69 int main(int argc, char* argv[])
70 {
71     readBmp();
72     glutInit(&argc, argv);
73     glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
74     glutInitWindowPosition(0, 0);
75     glutInitWindowSize(width, height);
76     glutCreateWindow("bmp - Anti-Magic");
77     glInit();
78     glutDisplayFunc(display);
79     glutMainLoop();
80     return 0;
81 }

C语言和OpenGL实现的24位色BMP解码器,布布扣,bubuko.com

时间: 2024-10-25 21:04:28

C语言和OpenGL实现的24位色BMP解码器的相关文章

(原)在firefly_rk3288开发板上解决openGL在设置32位色深以后出现花屏的问题

转载请注明出处:http://www.cnblogs.com/lihaiping/p/5567141.html 在做openGL测试的过程中,根据论坛上的帖子,在使用/bin/fbset -a -nonstd 1 -depth 32 -rgba "8/0,8/8,8/16,8/24"命令以后,会出现显示花屏的问题,当然我这边暂时使用的是hdmi输出进行测试的,vga的设置方法,另外一个网友已经发帖贴出了解决方法:http://developer.t-firefly.com/thread

24位位图bmp转换为字符

1 #include <cstdio> 2 #include <cstring> 3 #include <stdint.h> 4 #include <windows.h> 5 int32_t width,height; 6 RGBQUAD *pixels; 7 bool OpenBitmap(char const *filename) 8 { 9 FILE *file = fopen(filename, "rb"); 10 if (fil

颜色模式中8位,16位,24位,32位色彩是什么意思?会有什么区别?计算机颜色格式( 8位 16位 24位 32位色)&lt;转&gt;

颜色模式中8位,16位,24位,32位色彩是什么意思?会有什么区别简单地说这里说的位数和windows系统显示器设置中的颜色位数是一样的.表示的是能够显示出来的颜色的多少. 8位的意思是说,能够显示出来的颜色的数量有8位数.16.24都是一样的.24位的颜色数量已经很多了,叫做“真彩色”,其实32位和24位颜色数量是一样多的.32位多出来的8位数是用来表示透明度信息的,所以更加真实. 如果一有一张真彩色的照片,放到一个只有8位的显示器上的话,显示出来的效果就会很差.所以当需要的时候你就需要在低位

【安富莱专题教程第1期】基于STM32的硬件RGB888接口实现emWin的快速刷新方案,32位色或24

说明:1. 首先感谢ST终于推出了ARGB格式的emWin库,可谓千呼万唤始出来,使用STM32的硬件RGB888接口刷新图片慢的问题终于得到解决.2. 这个问题由来已久,是之前为我们的STM32-V6板子制作emWin模板时发现的.V6板子的硬件配置是STM32F429BIT6 + 32位带宽的SDRAM + 硬件RGB888接口.实际测试中发现,将F429配置为16位色的RGB565,刷新800*480分辨率的图片可以做到15ms左右一帧,而测试24位色的RGB888或者32位色的ARGB8

关于Opengl中将24位BMP图片加入?一个alpha通道并实现透明的问题

#include <windows.h>#include <GL/glut.h>#include <GL/glaux.h>#include <stdio.h> #pragma comment( lib, "opengl32.lib" )// 链接时使用OpenGL32.lib#pragma comment( lib, "glu32.lib" )// 链接时使用GLu32.lib  #pragma comment( li

字节序的理解----C语言和Python语言

字节序是指多字节数据在计算机内存中存储或者网络传输时各字节的存储顺序.常见的主要有以下2种: 小端序(Little-Endian):低位字节排放在内存的低地址端即该值的起始地址,高位字节排放在内存的高地址端.最符合人的思维的字节序,地址低位存储值的低位,地址高位存储值的高位.该序因为从人的第一观感来说低位值小,就应该放在内存地址小的地方,也即内存地址低位,反之,高位值就应该放在内存地址大的地方,也即内存地址高位.在80X86平台上,系统将多字节中的低位存储在变量起始地址,使用小端法. 大端序(B

大数据工具比较:R 语言和 Spark 谁更胜一筹?

本文有两重目的,一是在性能方面快速对比下R语言和Spark,二是想向大家介绍下Spark的机器学习库 背景介绍 由于R语言本身是单线程的,所以可能从性能方面对比Spark和R并不是很明智的做法.即使这种比较不是很理想,但是对于那些曾经遇到过这些问题的人,下文中的一些数字一定会让你很感兴趣. 你是否曾把一个机器学习的问题丢到R里运行,然后等上好几个小时?而仅仅是因为没有可行的替代方式,你只能耐心地等.所以是时候去看看Spark的机器学习了,它包含R语言大部分的功能,并且在数据转换和性能上优于R语言

使用DOT语言和Graphviz绘图(翻译)

Casa Taloyum About Me Blog Archives 使用DOT语言和Graphviz绘图(翻译) Date Wed 26 November 2014 Tags graphviz / dot 简述 本文翻译自Drawing Graphs using Dot and Graphviz 1. 许可 Copyright (C) 2013, 2014 Tony Ballantyne. Permission is granted to copy, distribute and/or mo

使用HTML语言和CSS开发商业站点(9)

#div_1 dl{ margin:0px;/*dl默认有外边距 跟ul一样*/ padding:0px; height:46px; margin-top:15px;} #div_1 dl dd{ margin:0px;/*dd默认有外边距*/ float:left; margin-left:10px; height:100%; line-height:46px; } 好的,使用HTML语言和CSS开发商业站点 就到这里结束    接下来是    使用Java实现面向对象编程 多多关注.评论,谢