`
hereson3
  • 浏览: 162966 次
  • 性别: Icon_minigender_2
  • 来自: 广州
社区版块
存档分类
最新评论

C语言读取bmp位图文件(含bmp格式定义)

阅读更多

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;
}

分享到:
评论

相关推荐

    C语言读取bmp位图文件(含bmp格式定义).doc

    C语言读取bmp位图文件(含bmp格式定义)

    C语言读取bmp位图文件

    从给定的代码片段来看,这是一段使用C语言编写的程序,主要功能是读取BMP位图文件并将其转换为不同的颜色空间格式,如YUV和YUY2。以下是对这段代码涉及的关键知识点的详细解析: ### 1. BMP文件格式 BMP(Bitmap)...

    用C语言读取BMP位图的代码

    通过上述分析,我们可以看到,使用C语言读取BMP位图文件涉及到对文件格式的理解、结构体的定义和使用、以及文件操作技术的掌握。这一过程不仅加深了我们对BMP文件格式的认识,也提高了我们使用C语言进行图像处理的...

    C语言读取bmp图像

    C语言读取bmp图像是指使用C语言编程来读取bmp格式的图像文件,获取图像的宽度、高度、像素个数等信息。bmp格式是微软视窗平台上的一个简单的图形文件格式,通常用来存储位图图像。 bmp格式的图像文件由四部分组成:...

    C语言读取BMP位图数据

    在本文中,我们将深入探讨如何使用C语言读取BMP位图数据,这对于理解图像处理和计算机图形学的基础知识非常重要。BMP(Bitmap)是一种常见的位图格式,它存储未压缩的图像数据,广泛用于Windows操作系统。在C语言...

    c语言读取bmp文件

    在C语言中读取BMP(Bitmap)文件是一项基本的图像处理任务,它涉及到...以上内容涵盖了C语言读取BMP文件的基本知识点,包括文件结构、解析过程和VS2010项目的创建。实际操作时,需要结合具体需求进行相应的扩展和优化。

    C语言读取BMP图像数据

    BMP(Bitmap-File)图形文件是Windows采用的图形文件格式,在Windows环境下运行的所有图象处理软件都支持BMP图象文件格式。...BMP位图文件默认的文件扩展名是BMP或者bmp(有时它也会以.DIB或.RLE作扩展名)。

    C语言读取BMP文件

    在本文中,我们将深入探讨如何使用C语言读取BMP(位图)文件,并将其内容存入工程文件夹。BMP是一种常见的图像文件格式,它以未经压缩的原始像素数据存储图像,使得我们可以直接访问和操作这些数据。这对于学习图像...

    c语言解析bmp位图源码

    本篇将深入讲解如何使用C语言解析BMP位图文件。 首先,我们要了解BMP文件的基本结构。BMP文件分为两个主要部分:文件头和图像数据。文件头包含关于图像的信息,如宽度、高度、颜色深度等。它由以下几个结构组成: ...

    读取bmp位图,并转换为灰度图像 C语言

    这里我们将深入探讨如何通过C语言来读取BMP位图并将其转换为灰度图像。 首先,BMP是一种未经压缩的位图格式,它包含图像数据、图像尺寸、颜色信息等元数据。在C语言中,我们通常需要手动解析BMP文件头,获取这些...

    c语言读取bmp图像c语言读取bmp图像

    根据提供的代码片段,我们可以总结出该程序的主要功能是使用C语言读取并处理BMP图像文件。接下来将详细解析此程序的关键部分,并解释其工作原理。 ### 1. BMP 文件格式简介 BMP (Bitmap Image File Format) 是一种...

    bmp.rar_C语言读取bmp_bmp图像读取_bmp语言_读取bmp c#_读取bmp图像

    2. **读取过程**:首先,我们需要打开BMP文件并读取文件头,检查文件是否为有效的BMP格式。接着,读取信息头,获取图像的高度、宽度、位深度等属性。位深度通常有8位、24位等,其中24位BMP是最常见的,表示每个像素...

    使用C语言读取位图

    位图文件(BMP)是一种常见的图像文件格式,由文件头、位图信息头和像素数据组成。 首先,位图文件头(BITMAPFILEHEADER)是文件的起始部分,它包含以下字段: - `bfType`:标识文件类型,应为“BM”(0x4d42)。 -...

    24位BMP位图信息隐藏和读取(c语言实现)

    本项目聚焦于24位BMP位图中的信息隐藏和读取,这涉及到数字图像处理、位运算以及文件I/O等多个知识点。 首先,24位BMP位图每像素由红、绿、蓝三种颜色的8位组成,共24位。这意味着每个像素可以表示16,777,216种颜色...

    直接读取bmp位图

    直接读取BMP位图的步骤: 1. 打开文件:使用C++或C语言的fopen函数打开BMP文件,设置为二进制模式("rb")。 2. 读取文件头:获取文件大小和图像数据的偏移量,确认文件是否为有效的BMP文件。 3. 读取信息头:解析...

    C语言读取、存储、显示BMP图像

    为了读取BMP文件,我们需要解析`BITMAPFILEHEADER`和`BITMAPINFOHEADER`结构体。这两个结构体定义了文件头和DIB头的信息。例如,`BITMAPFILEHEADER`包含了文件的大小和偏移量,而`BITMAPINFOHEADER`则包含了图像的...

    BMP位图文件程序.rar_BMP c语言_C bmp pgm_bmp 数据_位图处理_图形文件

    在本文中,我们将深入探讨BMP位图文件的结构及其在C语言中的处理方式。BMP(Bitmap)是Windows操作系统中最常见的位图图像格式之一,它以未经压缩的原始像素数据存储图像。C语言虽然没有内置的图形库,但通过理解和...

    C语言读取BMP图像

    本主题聚焦于“C语言读取BMP图像”,这是一个常见的图像处理任务,尤其对于学习计算机图形学和图像处理的初学者来说。BMP(Bitmap)是Windows操作系统中的位图图像格式,它以未经压缩的原始像素数据存储图像。 首先...

    BMP位图图像C语言读写封装源码及BMP位图详细介绍

    本压缩包提供的资源包括C语言实现的BMP位图读写封装源码(BMPTool.cpp、BMPTool.h)以及BMP位图文件格式的详细分析PDF(BMP文件格式详解.pdf)。以下是对这些知识点的深入讲解: 1. BMP文件格式分析: BMP文件通常...

Global site tag (gtag.js) - Google Analytics