- 浏览: 162966 次
- 性别:
- 来自: 广州
最新评论
-
雷蕾_ing:
...
python 模拟POST -
blink31:
TextOut不能换行,请问有其他的解决办法吗?
C++下的OpenGL文字显示的完美解决方案 -
lwz7512:
这么强悍!
在优酷的几道笔试题 -
lwz7512:
下了,谢谢分享!
opengl3D台球源代码 -
xltank:
今天过期了。。。
flash builder 序列号
loadbmp.h
#ifndef _LOADBMP_H_
#define _LOADBMP_H_
typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef unsigned long DWORD;
typedef struct {
/* BITMAPFILEHEADER*/
BYTE bfType[2];
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
} BMPFILEHEAD;
#define FILEHEADSIZE 14
/* windows style*/
typedef struct {
/* BITMAPINFOHEADER*/
DWORD BiSize;
DWORD BiWidth;
DWORD BiHeight;
WORD BiPlanes;
WORD BiBitCount;
DWORD BiCompression;
DWORD BiSizeImage;
DWORD BiXpelsPerMeter;
DWORD BiYpelsPerMeter;
DWORD BiClrUsed;
DWORD BiClrImportant;
} BMPINFOHEAD;
#define INFOHEADSIZE 40
typedef struct _BMP {
BMPINFOHEAD info;
unsigned char *rgba;
unsigned char *yuy2;
unsigned char *yv12;
} BMP, *PBMP;
int LoadBMP(char *name, PBMP pbmp);
int ReleaseBMP(PBMP pbmp);
void rgb_to_yuv(unsigned int r, unsigned int g, unsigned int b,
unsigned int *y, unsigned int *u, unsigned int *v);
#endif/*_LOADBMP_H_*/
loadbmp.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include "loadbmp.h"
void rgb_to_yuv(unsigned int r, unsigned int g, unsigned int b,
unsigned int *y, unsigned int *u, unsigned int *v)
{
double dy, du, dv;
dy = (0.257 * (double)r) +
(0.504 * (double)g) + (0.098 * (double)b) + 16.0;
dv= (0.439 * (double)r) - (0.368 * (double)g) - (0.071 * (double)b) +
128.0;
du = -(0.148 * (double)r) - (0.291 * (double)g) +
(0.439 * (double)b) + 128.0;
*y = (unsigned int)dy & 0xff;
*v = (unsigned int)dv & 0xff;
*u = (unsigned int)du & 0xff;
}
static void
convert_to_yv12(PBMP pbmp)
{
int x, y;
unsigned char *in_ptr, *out_ptr_y, *out_ptr_u, *out_ptr_v;
unsigned int Y, U, V;
in_ptr = pbmp->rgba;
out_ptr_y = pbmp->yv12;
out_ptr_u = out_ptr_y + pbmp->info.BiWidth * pbmp->info.BiHeight;
out_ptr_v = out_ptr_u + pbmp->info.BiWidth * pbmp->info.BiHeight / 4;
for (y = 0; y < pbmp->info.BiHeight; y++) {
for (x = 0; x < pbmp->info.BiWidth; x++) {
rgb_to_yuv(in_ptr[0], in_ptr[1], in_ptr[2], &Y, &U, &V);
in_ptr += pbmp->info.BiBitCount / 8;
*out_ptr_y++ = Y;
if (x % 2 == 0 && y % 2 == 0) {
*out_ptr_u++ = V;
*out_ptr_v++ = U;
}
}
}
}
static void
convert_to_yuy2(PBMP pbmp)
{
int x, y;
unsigned char *in, *out;
unsigned int Y, U, V;
in = pbmp->rgba;
out = pbmp->yuy2;
for (y = 0; y < pbmp->info.BiHeight; y++) {
for (x = 0; x < pbmp->info.BiWidth; x++) {
static int cnt = 0;
rgb_to_yuv(in[0], in[1], in[2], &Y, &U, &V);
in += pbmp->info.BiBitCount / 8;
*(out) = Y;
if (cnt %2 == 0)
*(out+1) = V;
else
*(out+1) = U;
out+= 2;
cnt++;
}
}
}
int LoadBMP(char *name, PBMP pbmp)
{
int fd;
int headsize;
BMPFILEHEAD bmpf;
unsigned char headbuffer[INFOHEADSIZE];
fd = open(name, O_RDONLY);
if (fd < 0) {
perror("open");
return -1;
}
read(fd, &headbuffer, FILEHEADSIZE);
bmpf.bfType[0] = headbuffer[0];
bmpf.bfType[1] = headbuffer[1];
if (*(WORD*)&bmpf.bfType[0] != 0x4D42) /* 'BM' */
return -2; /* not bmp image*/
bmpf.bfOffBits = *((DWORD*)&headbuffer[10]);
if (read(fd,&headsize,sizeof(DWORD)) != sizeof(DWORD))
return 0; /* not bmp image*/
read(fd, &headbuffer, INFOHEADSIZE - sizeof(DWORD));
pbmp->info.BiWidth = *(DWORD*)(&headbuffer[0]);
pbmp->info.BiHeight = *(DWORD*)(&headbuffer[4]);
pbmp->info.BiBitCount = *(DWORD*)(&headbuffer[10]);
pbmp->info.BiSizeImage = *(DWORD*)(&headbuffer[16]);
pbmp->rgba = (unsigned char *)malloc(pbmp->info.BiSizeImage);
if (!pbmp->rgba) {
perror("malloc");
exit(EXIT_FAILURE);
}
// pbmp->yuy2 = (unsigned char *)malloc(pbmp->info.BiWidth * pbmp->info.BiHeight * 2);
// if (!pbmp->yuy2) {
// perror("malloc");
// exit(EXIT_FAILURE);
// }
// pbmp->yv12 = (unsigned char *)malloc(pbmp->info.BiWidth * pbmp->info.BiHeight * 3 / 2);
// if (!pbmp->yv12) {
// perror("malloc");
// exit(EXIT_FAILURE);
// }
lseek(fd, bmpf.bfOffBits, SEEK_SET);
if (read(fd, pbmp->rgba, pbmp->info.BiSizeImage) != pbmp->info.BiSizeImage) {
perror("read");
return -4;
}
// convert_to_yv12(pbmp);
// convert_to_yuy2(pbmp);
printf("LoadBMP: %s %ldx%ldx%d\n", name, pbmp->info.BiWidth, pbmp->info.BiHeight, pbmp->info.BiBitCount);
close(fd);
return 0;
}
int ReleaseBMP(PBMP pbmp)
{
if (pbmp->rgba) {
free(pbmp->rgba);
pbmp->rgba = NULL;
}
// if (pbmp->yuy2) {
// free(pbmp->yuy2);
// pbmp->yuy2 = NULL;
// }
// if (pbmp->yv12) {
// free(pbmp->yv12);
// pbmp->yv12 = NULL;
// }
return 0;
}
发表评论
-
GUI设计禁忌
2010-01-07 12:02 990本文列举Jeff Johnson:《GUI设计禁忌》一书中 ... -
LOD地形设计(三)
2010-01-05 05:03 1022LOD地形根据视点的变化决定是否进行网格分割,因此系统应设计一 ... -
LOD地形设计(二)
2010-01-05 05:02 1212自从LOD地形第一节推出以来,受到不少朋友的关注,本人真是受宠 ... -
LOD地形设计(一)
2010-01-05 05:01 1119在大规模的三维场 ... -
Windows SDK笔记
2009-04-16 16:45 1407应程序需求需要重写窗体内子控件某一特定消息,可怜我苦苦找了 ... -
关于的glut 的配置
2009-02-09 17:46 1704OpenGL 是一套 用于三维作图的API。与Direct3 ... -
OpenGL的消隐与双缓冲(2)
2009-02-09 17:46 1639#include "stdafx.h" ... -
openGL贴图(借助glx),并测试性能(FPS)2
2009-02-09 17:45 1194client.c #include <sys/type ... -
alpha混合技术
2009-02-09 17:44 1500alpha混合技术 alpha混合技术对熟悉游戏的人来说不会 ... -
C语言将raw data(rgb/rgba)写成bmp文件(bmp24或32)
2009-02-09 17:44 3734int bmp_write(unsigned char *im ... -
OpenGL坐标变换专题
2009-02-09 17:43 2531OpenGL通过相机模拟、可 ... -
对话框中OpenGL的设置
2009-02-09 17:43 2206from:http://huhuiowen.blog.16 ... -
OpenGL曲线绘制:线段
2009-02-09 17:42 1896以线段方式绘制曲线。例如:正弦曲线。 glBegin(GL_ ... -
用VC++做OpenGL程序框架时出现非法错误
2009-02-09 17:40 10171.OpenGL.cpp 文件包含的头文件有没有{}不配对的情 ... -
opengl编写游戏的可移植性 具体表现
2009-02-09 17:39 1089OpenGL是个与硬件无关的软件接口,可以在不同的平台如Win ... -
什么是显卡的OpenGL模式
2009-02-09 17:39 1669OpenGL是近几年发展起来的一个性能卓越的三维图形标准。 ... -
关于-opengl在魔兽中的应用
2009-02-09 17:38 2009OpenGL在画质上是优于Direct的,这个“画质”不是指感 ... -
如何让显卡支持OpenGL模式????????
2009-02-09 17:38 3338OPENGL 不支持问题 这也 ... -
opengl3D台球源代码
2009-01-20 09:59 24383D台球,可以平面也可以从不同角度击球,使用OPENGL渲染, ... -
Jeff Molofee(NeHe)的OpenGL教程 - 碰撞检测与模型运动
2009-01-20 09:30 1651原 文 : Lesson 31: Collis ...
相关推荐
C语言读取bmp位图文件(含bmp格式定义)
从给定的代码片段来看,这是一段使用C语言编写的程序,主要功能是读取BMP位图文件并将其转换为不同的颜色空间格式,如YUV和YUY2。以下是对这段代码涉及的关键知识点的详细解析: ### 1. BMP文件格式 BMP(Bitmap)...
通过上述分析,我们可以看到,使用C语言读取BMP位图文件涉及到对文件格式的理解、结构体的定义和使用、以及文件操作技术的掌握。这一过程不仅加深了我们对BMP文件格式的认识,也提高了我们使用C语言进行图像处理的...
C语言读取bmp图像是指使用C语言编程来读取bmp格式的图像文件,获取图像的宽度、高度、像素个数等信息。bmp格式是微软视窗平台上的一个简单的图形文件格式,通常用来存储位图图像。 bmp格式的图像文件由四部分组成:...
在本文中,我们将深入探讨如何使用C语言读取BMP位图数据,这对于理解图像处理和计算机图形学的基础知识非常重要。BMP(Bitmap)是一种常见的位图格式,它存储未压缩的图像数据,广泛用于Windows操作系统。在C语言...
在C语言中读取BMP(Bitmap)文件是一项基本的图像处理任务,它涉及到...以上内容涵盖了C语言读取BMP文件的基本知识点,包括文件结构、解析过程和VS2010项目的创建。实际操作时,需要结合具体需求进行相应的扩展和优化。
BMP(Bitmap-File)图形文件是Windows采用的图形文件格式,在Windows环境下运行的所有图象处理软件都支持BMP图象文件格式。...BMP位图文件默认的文件扩展名是BMP或者bmp(有时它也会以.DIB或.RLE作扩展名)。
在本文中,我们将深入探讨如何使用C语言读取BMP(位图)文件,并将其内容存入工程文件夹。BMP是一种常见的图像文件格式,它以未经压缩的原始像素数据存储图像,使得我们可以直接访问和操作这些数据。这对于学习图像...
本篇将深入讲解如何使用C语言解析BMP位图文件。 首先,我们要了解BMP文件的基本结构。BMP文件分为两个主要部分:文件头和图像数据。文件头包含关于图像的信息,如宽度、高度、颜色深度等。它由以下几个结构组成: ...
这里我们将深入探讨如何通过C语言来读取BMP位图并将其转换为灰度图像。 首先,BMP是一种未经压缩的位图格式,它包含图像数据、图像尺寸、颜色信息等元数据。在C语言中,我们通常需要手动解析BMP文件头,获取这些...
根据提供的代码片段,我们可以总结出该程序的主要功能是使用C语言读取并处理BMP图像文件。接下来将详细解析此程序的关键部分,并解释其工作原理。 ### 1. BMP 文件格式简介 BMP (Bitmap Image File Format) 是一种...
2. **读取过程**:首先,我们需要打开BMP文件并读取文件头,检查文件是否为有效的BMP格式。接着,读取信息头,获取图像的高度、宽度、位深度等属性。位深度通常有8位、24位等,其中24位BMP是最常见的,表示每个像素...
位图文件(BMP)是一种常见的图像文件格式,由文件头、位图信息头和像素数据组成。 首先,位图文件头(BITMAPFILEHEADER)是文件的起始部分,它包含以下字段: - `bfType`:标识文件类型,应为“BM”(0x4d42)。 -...
本项目聚焦于24位BMP位图中的信息隐藏和读取,这涉及到数字图像处理、位运算以及文件I/O等多个知识点。 首先,24位BMP位图每像素由红、绿、蓝三种颜色的8位组成,共24位。这意味着每个像素可以表示16,777,216种颜色...
直接读取BMP位图的步骤: 1. 打开文件:使用C++或C语言的fopen函数打开BMP文件,设置为二进制模式("rb")。 2. 读取文件头:获取文件大小和图像数据的偏移量,确认文件是否为有效的BMP文件。 3. 读取信息头:解析...
为了读取BMP文件,我们需要解析`BITMAPFILEHEADER`和`BITMAPINFOHEADER`结构体。这两个结构体定义了文件头和DIB头的信息。例如,`BITMAPFILEHEADER`包含了文件的大小和偏移量,而`BITMAPINFOHEADER`则包含了图像的...
在本文中,我们将深入探讨BMP位图文件的结构及其在C语言中的处理方式。BMP(Bitmap)是Windows操作系统中最常见的位图图像格式之一,它以未经压缩的原始像素数据存储图像。C语言虽然没有内置的图形库,但通过理解和...
本主题聚焦于“C语言读取BMP图像”,这是一个常见的图像处理任务,尤其对于学习计算机图形学和图像处理的初学者来说。BMP(Bitmap)是Windows操作系统中的位图图像格式,它以未经压缩的原始像素数据存储图像。 首先...
本压缩包提供的资源包括C语言实现的BMP位图读写封装源码(BMPTool.cpp、BMPTool.h)以及BMP位图文件格式的详细分析PDF(BMP文件格式详解.pdf)。以下是对这些知识点的深入讲解: 1. BMP文件格式分析: BMP文件通常...