精华内容
下载资源
问答
  • c语言 bmp图片显示

    2009-10-20 08:49:07
    c语言-------bmp图片显示.....................
  • C语言实现BMP图像读取,显示,简单处理!通过结构体变量存储文件头信息,定义动态二维数组实现像素信息的存储!
  • 该楼层疑似违规已被系统折叠隐藏此楼查看此楼做两个bmp图片的差分,并新建一个bmp图,将差分的结果存入新建的位图中.程序如下,#include #include typedef unsigned short WORD;typedef unsigned long DWORD;typedef ...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

    做两个bmp图片的差分,并新建一个bmp图,将差分的结果存入新建的位图中.程序如下,

    #include

    #include

    typedef unsigned short WORD;

    typedef unsigned long DWORD;

    typedef long LONG;

    typedef unsigned char BYTE;

    typedef struct BITMAPFILEHEADER{

    WORD bfType;

    DWORD bfSize;

    WORD bfReserved1;

    WORD bfReserved2;

    DWORD bfOffbits;

    } BITMAPFILEHEADER,*PBITMAPFILEHEADER;

    typedef struct BITMAPINFOHEADER{

    DWORD biSize;

    LONG biWidth;

    LONG biHeight;

    WORD biPlanes;

    WORD biBitCount;

    DWORD biCompression;

    DWORD biSizeImage;

    LONG biXPlesPerMeter;

    LONG biYPlesPerMeter;

    DWORD biClrUsed;

    DWORD biClrImportant;

    } BITMAPINFOHEADER,*PBITMAPINFOHEADER;

    typedef struct RGBQUAD{

    BYTE rgbBlue;

    BYTE rgbGreen;

    BYTE rgbRed;

    BYTE rgbReserved;

    } RGBQUAD;

    int main(int argc,char **argv)

    {

    BITMAPFILEHEADER mapfileheader;

    BITMAPINFOHEADER mapinfoheader;

    DWORD bfSize1=0;

    DWORD bfSize2;

    DWORD bfOffbits1;

    DWORD bfOffbits2;

    DWORD biWidth1;

    DWORD biWidth2;

    DWORD biHeight1;

    DWORD biHeight2;

    WORD biBitCount1;

    WORD biBitCount2;

    LONG biXPlesPerMeter1;

    LONG biXPlesPerMeter2;

    LONG biYPlesPerMeter1;

    LONG biYPlesPerMeter2;

    BYTE a;

    BYTE b;

    BYTE c;

    FILE *fp1=0;

    FILE *fp2=0;

    展开全文
  • linu下C语言BMP图片操作编程(上)

    千次阅读 2016-02-22 22:50:47
    来存储位图,数字,图片,独立的显示设备。  微软已经定义了一个特定的表示颜色的位图 不同的颜色深度,作为援助交换设备和之间的位图 应用程序与各种各样的内部表示。 他们称这些 与设备无关的位图或权利,叫做DIB...

       BMP文件格式,也被称为位图图像文件与设备无关的位图文件格式(DIB)或者只是一个位图,是 一个光栅图形 图像文件格式使用 来存储位图,数字,图片,独立的显示设备。

       微软已经定义了一个特定的表示颜色的位图 不同的颜色深度,作为援助交换设备和之间的位图 应用程序与各种各样的内部表示。 他们称这些 与设备无关的位图或权利,叫做DIB文件格式 文件格式或BMP图像文件格式。 根据微软的支持:

       与设备无关的位图(DIB)是一种用于定义格式 与设备无关的位图在各种颜色的决议。 的主要目的 权利是允许从一个设备转移到另一个位图(因此, 与设备无关的名字)的一部分。 DIB外部格式,形成鲜明对比 设备相关的位图,在系统作为一个位图对象 应用程序创建的(……)。 元的DIB通常运输 (通常使用StretchDIBits()函数),BMP文件,剪贴板 (CF_DIB数据格式)。

    BMP图片格式图:


    接下来来看一个代码对BMP头的封装,然后将rgb888转化成rgb565的现象的例程:

    #include <stdio.h>
    #include <fcntl.h>
    #include <unistd.h>
    
    #define  RGB(r,g,b)    		(((r>>3)<<11)|((g>>2)<<5)|(b>>3))
    
    typedef  unsigned char  U8 ; 
    typedef  unsigned short U16 ; 
    typedef  unsigned int   U32 ; 
    
    #pragma  pack(1)
    struct bmp_header    //这个结构体就是对上面那个图做一个封装。
    {
    	//bmp header
    	U8  Signatue[2] ;   // B  M
    	U32 FileSize ;     //文件大小
    	U16 Reserv1 ; 
    	U16 Reserv2 ; 
    	U32 FileOffset ;   //文件头偏移量
    	
    	//DIB header
    	U32 DIBHeaderSize ; //DIB头大小
    	U32 ImageWidth   ;  //文件宽度
    	U32 ImageHight   ;  //文件高度
    	U16 Planes       ; 
    	U16 BPP          ;  //每个相素点的位数
    	U32 Compression  ; 
    	U32 ImageSize    ;  //图文件大小
    	U32 XPPM ; 
    	U32 YPPM ; 
    	U32 CCT ; 
    	U32 ICC ;          
    };
    #pragma  pack()
    
    int main(int argc , char **argv)
    {
    	//判断参数,传进来的参数不等于两个,那么就报错      ./a.out   xxx
    	if(argc != 2)
    		return -1 ; 
    										
    	int fd ; 
    	int dest_fd ; 
    	//以只读的方式打开一个文件  这个文件是rgb888
    	fd = open(argv[1] , O_RDONLY);
    	if(-1 == fd)
    	{
    		perror("open bmp file fail");
    		return -2 ; 
    	}
    
    	//打开一个rgb565.bmp的图片
    	dest_fd = open("rgb565.bmp" , O_RDWR | O_CREAT|O_TRUNC , 0777);
    	if(dest_fd < 0 )
    	{
    		perror("open rgb565 fail");
    		return -3 ; 
    	}
    
    	
    	//定义一个bmp的头
    	struct bmp_header  header ; 
    
    	int ret ; 
    	
    	//读出bmp文件头的数据
    	ret = read(fd , &header , sizeof(struct bmp_header));
    	
    	//以下是bmp图的相关数据
    	printf(" Signatue[0]      : %c  \n " , header.Signatue[0]  );
    	printf(" Signatue[1]      : %c  \n " , header.Signatue[1]  );
    	printf(" FileSize         : %d  \n " , header.FileSize     );
    	printf(" Reserv1          : %d  \n " , header.Reserv1      );
    	printf(" Reserv2          : %d  \n " , header.Reserv2      );
    	printf(" FileOffset       : %d  \n " , header.FileOffset   );
    	printf(" DIBHeaderSize    : %d  \n " , header.DIBHeaderSize);
    	printf(" ImageWidth       : %d  \n " , header.ImageWidth   );
    	printf(" ImageHight       : %d  \n " , header.ImageHight   );
    	printf(" Planes           : %d  \n " , header.Planes       );
    	printf(" BPP              : %d  \n " , header.BPP          );
    	printf(" Compression      : %d  \n " , header.Compression  );
    	printf(" ImageSize        : %d  \n " , header.ImageSize    );
    	printf(" XPPM             : %d  \n " , header.XPPM         );
    	printf(" YPPM             : %d  \n " , header.YPPM         );
    	printf(" CCT              : %d  \n " , header.CCT          );
    	printf(" ICC              : %d  \n " , header.ICC          );
    
    	char buffer[header.ImageSize] ; 
    
    	read(fd , buffer , header.ImageSize);
    
    	close(fd);
    
    	//改变地方
    	header.BPP = 16 ; 
    	header.FileSize = header.ImageWidth*header.ImageHight*2+54 ; 
    	header.ImageSize = header.ImageWidth*header.ImageHight*2;
    
    	write(dest_fd , &header , sizeof(struct bmp_header));
    
    	int row , col ; 
    	short data ; 
    	char *p = NULL ; 
    
    	for(row = 0 ; row < header.ImageHight ; row++)
    	{
    		for(col = 0 ; col < header.ImageWidth ; col++)
    		{
    			p =( buffer+(row*header.ImageWidth + col)*3);
    			data = RGB((unsigned char)(*(p+2)) , (unsigned char)(*(p+1)) , 
    			(unsigned char )(*(p)));
    			write(dest_fd , &data , 2);
    		}
    	}
    
    	close(dest_fd);
    
    	return 0 ; 
    }
    
    接下来我们来对这幅图进行操作,看看打印出什么信息:这副图就是1.bmp----->格式rgb888生气



    运行结果:获取到bmp图的包头,顺便将rgb888的bmp图转化为rgb565生气


    生成rgb565的bmp图:是不是发现像素差了一点?大笑


    后续还会有bmp图相关的操作,例如BMP图旋转(左右转),bmp图的灰度处理

    ,欢迎继续关注Bruce.yang的嵌入式之旅大笑

    展开全文
  • 记录读出BMP格式图片的过程,并在屏幕上显示; 如有错误欢迎指正,如需转载请注明出处。

    第一步:打开需要读取的图片文件

    fd = open(picture, O_RDONLY); //只读方式打开文件

    第二步:读取图片的长,宽,每个像素占多少字节,偏移量 查看bmp格式就能知道各个数据两在文件的哪个位置

    lseek(fd, 0x0A, SEEK_SET); read(fd, &offset, 4); //读取偏移量

    lseek(fd, 0x12, SEEK_SET); read(fd, &w, 4); //读取位图宽度

    lseek(fd, 0x16, SEEK_SET); read(fd, &h, 4); //读取位图高度

    lseek(fd, 0x1c, SEEK_SET); read(fd, &bpp, 2); //读取每个像素的位数

    第三步:读取显示屏相关信息

    struct fb_var_screeninfo var;

    struct fb_fix_screeninfo fix;

    unsigned int *p = NULL;

    fdp = open("/dev/fb0", O_RDWR); //如果没有fb0文件,需要创建,具体怎么创建LZ也不清楚,请自行搜索解决    

    ioctl(fdp, FBIOGET_VSCREENINFO, &var); //读取屏幕信息,分辨率等

    ioctl(fd, FBIOGET_FSCREENINFO, &fix); //显示缓存信息(framebuff)

    p = mmap(NULL, fix.smem_len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); //系统调用mmap()用来实现内存映射IO    

    第四步:读bmp数据存放到framebuffer中

    struct bpp24{

        unsigned char b;

        unsigned char g;

        unsigned char r; //三个顺序不能换,因为bmp存储就是b,g,r,b,g,r...................

    };
    unsigned int col;
    struct bpp24 bpp24;
    unsigned short bpp16;

    lseek(fd, offset, SEEK_SET); //指针偏移到数据段

    for(i = h-1; i>=0; i--)
    {
        for(j = 0; j < w; j++)
        {
            if(bpp == 24)
            {
                read(fd, &bpp24, 3);
                col = 0;
                col |= bpp24.r << 16;
                col |= bpp24.g << 8;
                col |= bpp24.b;
            }
            else if(bpp == 16)
            {
                read(fd, &bpp16, 2);
                col = 0;
                col |= (((bpp16 >> 11) & 0x1f) << 3) << 16;
                col |= (((bpp16 >> 5) & 0x3f)<< 2) << 8;
                col |= ((bpp16 & 0x1f) << 3);
            }

            ptr[i * var.xres + j] = col;
        }
    }

    close(fd);

    close(fdp);

    第五步:编译好之后,切换到文本模式,运行程序即可

    展开全文
  • BMP文件信息读取并在CMD窗口显示图片 位图的基本格式可以参考其它博客,这里不进行详细说明。 原始图片及文件信息 原始图片可以在网上下载24位颜色的位图,然后用画图工具进行裁剪编辑,为简单起见,我们限定只...

    C语言读取BMP文件信息并在CMD窗口显示图片

    位图的基本格式可以参考其它博客,这里不进行详细说明。该实验可以更加深入地理解位图的文件结构,以及C语言文件操作的方法。并且理解字节对齐的根本含义。

    原始图片及文件信息

    原始图片可以在网上下载24位颜色的位图,然后用画图工具进行裁剪编辑,为简单起见,我们限定只使用黑白两种颜色,位图的大小建议不要过大,因为CMD窗口无法显示完全。

    这里写图片描述
    这里写图片描述

    效果图


    效果图

    字节对齐

    不使用单字节对齐系统默认四字节对齐。

    这里写图片描述

    代码及说明

    #include <stdio.h>  
    #include <stdlib.h>  
    #include <malloc.h> 
    //单字节对齐
    #pragma pack(1)
    typedef struct BitmapFileHeader
    {
        unsigned char bfType[2];//文件格式
        unsigned long bfSize;//文件大小
        unsigned short bfReserved1;//保留
        unsigned short bfReserved2;//保留
        unsigned long bfOffBits; //图片数据在文件中的偏移量
    }fileHeader;
    typedef struct BitmapInfoHeader
    {
        unsigned long biSize;//该结构的大小
        long biWidth;//文件宽度
        long biHeight;//文件高度
        unsigned short biPlanes;//平面数
        unsigned short biBitCount;//颜色位数
        unsigned long biCompression;//压缩类型
        unsigned long biSizeImage;//DIB数据区大小
        long biXPixPerMeter;
        long biYPixPerMeter;
        unsigned long biClrUsed;//颜色索引表数目
        unsigned long biClrImporant;//重要颜色数目
    }fileInfo;
    
    int main(void)
    {
        FILE *fpaa;
        if ((fpaa = fopen("aa.bmp", "rb") )== NULL)
        {
            printf("打开文件失败");
            exit(0);
        }
        printf("fpaa偏移量:  %d\n", ftell(fpaa));
        fileHeader *fh;
        printf("fileHeader结构体大小:   %d字节\n", sizeof(fileHeader));
        //如果不采样单字节对齐,申请内存时相对于aa.bmp就多出两个字节
        fh= (fileHeader *)malloc(sizeof(fileHeader));
        fread(fh, sizeof(fileHeader), 1, fpaa);
        printf("头文件格式:  %c%cP\n", fh->bfType[0], fh->bfType[1]);
        printf("头文件大小:  %d字节\n", fh->bfSize);
        printf("DIB数据在文件中的偏移量:  %d字节\n", fh->bfOffBits);
        printf("fpaa读取头文件后偏移量:  %d\n",ftell(fpaa));
        fileInfo * fi;
        fi = (fileInfo *)malloc(sizeof(fileInfo));
        fread(fi, sizeof(fileInfo), 1, fpaa);
        printf("fpaa读取信息文件后偏移量:  %d\n", ftell(fpaa));
        printf("位图信息大小: %d\n",fi->biSize);
        printf("文件宽度: %d\n", fi->biWidth);
        printf("文件高度: %d\n", fi->biHeight);
        printf("平面数: %d\n", fi->biPlanes);
        printf("颜色位数: %d\n", fi->biBitCount);
        printf("压缩类型: %d\n", fi->biCompression);
        printf("DIB数据区大小: %d\n", fi->biCompression);
        printf("颜色索引表: %d\n", fi->biClrUsed);
        printf("重要颜色: %d\n", fi->biClrImporant);
    
        printf("\n");
    
        struct color 
        {
            char r;
            char g;
            char b;
        };
        struct color *fc;
        fc = (struct color *)malloc(sizeof(struct color));
        for (int i = 1; i <=fi->biHeight; i ++)
        {
            fseek(fpaa, -((((fi->biBitCount * fi->biWidth) + 31) >> 5) << 2)*i, SEEK_END);
            for (int j = 1; j <= fi->biWidth; j ++ )
            {
                fread(fc, sizeof(struct color), 1, fpaa);
                if (fc->r == 0 & fc->g == 0 & fc->b == 0) printf("%c ",3);
                else printf("%c ", 46);
            }
            printf("\n");
            //((图像宽度*每个像素bites+31)/32)*4可保证每一列为4字节对齐,因为计算机为了速度每次取四字节,不足的要填0
            //下方表达式显示每行多出几个字节
            int k = ((((fi->biBitCount * fi->biWidth) + 31) >> 5) << 2) - ((fi->biBitCount * fi->biWidth) >> 3);
            //再将文件指针移出这几个填充字节
            fseek(fpaa, k, SEEK_CUR);
        }
    
        //可以用不同符号代替黑白
        /*int m=10;
        for (int l=1;l<100;l++)
        {
            printf("%d:%c  ", l,l);
                if (m==0)
                {
                    m = 10;
                    printf("\n");
                }
                m--;
        }
        */
        getchar();
        return 0;
    }
    展开全文
  • 回复 2楼 TonyDeng/*换页函数(BMP模块的工具函数)*/void selectpage(register char page){union REGS r;r.x.ax=0x4f05;r.x.bx=0;...}/*设置SVGA屏幕模式(BMP模块的工具函数)*/unsigned char set_SV...
  • C语言进行BMP文件的读写

    千次阅读 2016-08-25 09:02:10
    bmp是BitMap(位图)的简称,也是所有windows上图片显示的基础。所有的图片格式,都必须转换成bmp才能进行最终的显示。所以,bmp文件的读写,就变得非常重要了。然而,很多人是借助于MFC类,C# 库函数,OpenCV,OpenGL等...
  • 基于C语言BMP文件格式转换

    千次阅读 2018-05-25 22:10:29
    //将bmp图片文件保存于1.bmp中,若图片是bmp文件,则在out.bmp文件中可以看到,若不是,则在out.bmp中显示打开失败。//识别乒乓球#include&lt;stdio.h&gt;#include&lt;stdlib.h&gt;//此bmp文件图像...
  • bmp.h 文件 1 #ifndef __BMP_H__ 2 #define __BMP_H__ 3 4 5 #include <unistd.h> 6 #include <stdio.h> 7 #include <stdlib.h> 8 #include <fcntl.h> 9 #incl...
  • bmp是BitMap(位图)的简称,也是所有windows上图片显示的基础。所有的图片格式,都必须转换成bmp才能进行最终的显示。所以,bmp文件的读写,就变得非常重要了。然而,很多人是借助于MFC类,C# 库函数,OpenCV,OpenGL等...
  • 1 /************************* ... 3 *bmp.h文件 4 5 *************************/ 6 7 #ifndef __BMP_H__ 8 #define __BMP_H__ 9 10 #include <unistd.h> 11 #include <stdio.h> ...
  • 课程设计里想试着往程序里加载一张bmp图片(也不一定就必须得是bmp格式),因为是第一次研究这些东西,下面是我按照教程弄出来的一段代码,不知道为什么,打开程序后程序就直接一直未响应状态了,也不加载图片,事先...
  • bmp图片转换为c语言数组

    热门讨论 2011-09-30 16:23:23
    wince开机logo转换工具,可用于S3C2440,2410,2416,6410,经过S3C2416开发板测试,...下载完后解压,进入bmp2c\bin\Debug双击bmp2c.exe,选择需要转换的图片和转换后文件的存放位置,主要需要输入转换图片的高度和宽度。
  • 在ubantu上用c语言实现显示bmp图片 编程思路: 1、打开bmp图片获得fd文件描述符(open()函数) 2、偏移信息头54字节,lseek()函数 3、读取bmp图片BGR(与RGB位置相反)信息,采用二维数组bmp_buf[480][800*3] 4、...
  • 一、bmp图片显示 1、内存映射(给开发板的LCD屏分配显存)mmap  #include &lt;sys/mman.h&gt;  void *mmap(void *addr, //映射内存的起始地址  size_t length, //映射内存大小  ...
  • 在Android上,通过对/dev/graphics/fb0的操作,实现截屏,和送图片到fb0,支持rgb565 rgb888 bgra_8888 格式的bmp和fb0 需要root权限 修正了framebuffer bgra_8888格式截图变红的问题
  • BMP图片的存储: 1:位图头文件数据结构,它包含BMP图像文件的类型、显示内容等信息; 2:位图信息数据结构,它包含有BMP图像的宽、高、压缩方法,以及定义颜色等信息; 3:调色板,这个部分是可选的,有些位图需要...

空空如也

空空如也

1 2 3 4 5
收藏数 93
精华内容 37
关键字:

c语言显示bmp图片

c语言 订阅