`
hereson3
  • 浏览: 159913 次
  • 性别: 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图像数据

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

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

    压缩文件提供: 1. bmp位图文件详细格式分析; 2. bmp位图文件打开,读取功能; 3. bmp位图文件写入,保存功能; 4. bmp位图文件显示到指定控件(如,picture控件上);

    打开BMP文件的所有源程序

    [readbmp.rar] - 在visual c++下读取*.bmp位图的信息,并显示位图,点击“查看”-&gt;“信息”菜单,弹出对话框中显示色彩位数、图像高度宽度、文件头大小等等信息。 [load_bmp_WINSDK.rar] - 载入位图的源代码,使用...

    BMP图像转换为16进制数据

    针对单片机开发的16位TFT显示频的图像显示问题。 本软件可将 分辨率在320*240以下的BMP图像转换为 单片机可用的16进制数据格式。 可进行自己手画,也可以直接打开图片文件,目前只支持BMP格式

    bmp转换ascii.rar

    采用C语言编程读取24位*.bmp格式位图图像,并显示对应图像的ASCII字符图。(软件平台VC6.0) 将bmp图片进行黑白二值化,并在控制台终端显示对应图像的ASCII字符图

    MFC数字图像处理(BMP格式读取 保存 DFT FFT 直方图 色调均化 缩放 模糊 锐化 滤镜 形态学处理 曲线 裁剪 灰度图 彩色图 自动阈值)

    BMP格式读取 保存 DFT FFT 直方图 色调均化 缩放 模糊 锐化 滤镜 形态学处理 曲线 裁剪 灰度图 彩色图 自动阈值 等等...除此之外还有很多其他小功能... 建议使用VS2013打开!!!核心代码在Bmp.cpp中!!! 更新...

    灰度图像的显示及其抖动算法的实现

    通过分析BMP文件的格式, 从而读取并显示BMP文件以及抖动算法的实现 [编程语言] VC++ [显示用例] 如封面 [本实验所用电脑相关配置] CPU:AMD 2500+ 内存:512MB 显卡:NVIDIA GeForce FX 5200 Ultra [理论基础] ...

    readBMP.rar_bmp_readBmp_图像处理

    用C语言实现位图格式的图像读取功能,可直接使用。

    位图读写器

    C语言MFC写的位图读写器,支持BMP格式文件,可读取、显示、保存图片。内涵两个文件:一个包含执行程序,一个包含源代码。IDE建议VC++6.0及以上版本。程序自己写的,欢迎批评指正。

    C++MFC教程

    |------ 2.4 在窗口中绘制设备相关位图,图标,设备无关位图 |------ 2.5 使用各种映射方式 |------ 2.6 多边形和剪贴区域 +-- 第三章 文档视结构 |------ 3.1 文档 视图 框架窗口间的关系和消息传送规律 |------ ...

Global site tag (gtag.js) - Google Analytics