存bmp图片函数_createbmp函数_茜茜她老爹的博客-程序员宝宝

技术标签: video  

#ifndef IMAGE_METHOD_H
#define IMAGE_METHOD_H


#pragma pack()


typedef unsigned short      WORD;
typedef unsigned long       DWORD;
typedef unsigned char       BYTE;
typedef long LONG;


typedef char *LPSTR;




#define BI_RGB        0L


#pragma pack(1)
typedef struct tagRGBQUAD {
        BYTE    rgbBlue;
        BYTE    rgbGreen;
        BYTE    rgbRed;
        BYTE    rgbReserved;
} RGBQUAD;


#pragma pack(2)
typedef struct tagBITMAPFILEHEADER {
        WORD    bfType;
        DWORD   bfSize;
        WORD    bfReserved1;
        WORD    bfReserved2;
        DWORD   bfOffBits;
} BITMAPFILEHEADER;


#pragma pack(1)
typedef struct tagBITMAPINFOHEADER{
        DWORD      biSize;
        LONG       biWidth;
        LONG       biHeight;
        WORD       biPlanes;
        WORD       biBitCount;
        DWORD      biCompression;
        DWORD      biSizeImage;
        LONG       biXPelsPerMeter;
        LONG       biYPelsPerMeter;
        DWORD      biClrUsed;
        DWORD      biClrImportant;
} BITMAPINFOHEADER;
#pragma pack()




#define WIDTHBYTES(bits) ((DWORD)(((bits)+31) & (~31)) / 8)




typedef unsigned int HLOCAL;


typedef struct tagPALETTEENTRY {
    BYTE        peRed;
    BYTE        peGreen;
    BYTE        peBlue;
    BYTE        peFlags;
} PALETTEENTRY;
#pragma pack()


#endif



char bmpfilename[]="first.bmp"; 

CreateBmp(newImgData, bmpfilename,720,288,24)

int CreateBmp(BYTE * color,  char *FileName,long width, long height,DWORD BitCount) 

{   //创建bmp图像
BITMAPFILEHEADER bff;
BITMAPINFOHEADER bii;
//HLOCAL          hPal;
PALETTEENTRY     *pPal;
FILE* hf;
int i,j,m,n,number_color;
BYTE *tempgray,*tempgray1;
long pointwidth = 0;


if(BitCount==8)
{
number_color=256;
pointwidth = width;
}
else if(BitCount==16)
{
number_color=2;
pointwidth = (width+7)/8;
}
else if(BitCount==24)
{
number_color=0;
pointwidth = (int)width*3;
}
else
{
// AfxMessageBox("暂时不能创建这种位数的位图 *_*");
return 0;
}
int BmpWidth=WIDTHBYTES(BitCount *(int)width);
// int dd = sizeof(color);
tempgray= (BYTE*)malloc(BmpWidth*(int)height);
tempgray1= (BYTE*)malloc(BmpWidth*(int)height);
memset(tempgray,0,sizeof(BYTE)*BmpWidth*(int)height);
memset(tempgray1,0,sizeof(BYTE)*BmpWidth*(int)height);
for(i=0;i<height;i++)
{
for(j=0;j<BmpWidth;j++)
{
m=i*BmpWidth+j;
n=i*pointwidth+j;
if(j<pointwidth)
tempgray[m]=color[n];
else 
tempgray[m] = 0;
}
}


for(i=0;i<height;i++)
{
for(j=0;j<BmpWidth;j++)
{
tempgray1[i*BmpWidth+j] = tempgray[(height-i-1)*BmpWidth +j];
}
}
bff.bfType = 0x4d42;
bff.bfReserved1 = 0;
bff.bfReserved2 = 0;
bff.bfOffBits = (DWORD)(sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER) + number_color * sizeof(RGBQUAD));
bff.bfSize = (DWORD)(sizeof(BITMAPFILEHEADER) +sizeof(BITMAPINFOHEADER)
+  BmpWidth*(int)height + number_color* sizeof(PALETTEENTRY));
bii.biSize = sizeof(BITMAPINFOHEADER);
bii.biWidth = width;
bii.biHeight = height;
bii.biCompression = BI_RGB;
bii.biPlanes = 1;
bii.biBitCount = (WORD)BitCount;
// bii.biSizeImage = (DWORD)bii.biWidth*bii.biHeight;
bii.biSizeImage = BmpWidth*bii.biHeight;
bii.biClrImportant = 0;
bii.biClrUsed = number_color;
bii.biXPelsPerMeter=0;
bii.biYPelsPerMeter=0;
pPal=(PALETTEENTRY *)malloc( number_color * sizeof(PALETTEENTRY));




if(bii.biBitCount==8)
{
for (i = 0; i < 256; i++)
{
pPal[i].peRed=(BYTE) i;//lpRGB->rgbRed;
pPal[i].peGreen=(BYTE) i;//lpRGB->rgbGreen;
pPal[i].peBlue=(BYTE) i;//lpRGB->rgbBlue;
pPal[i].peFlags=(BYTE)0;
}
}


if(bii.biBitCount==1)
{   
//设置调色板
pPal[0].peRed=(BYTE) 0;//lpRGB->rgbRed;
pPal[0].peGreen=(BYTE) 0;//lpRGB->rgbGreen;
pPal[0].peBlue=(BYTE) 0;//lpRGB->rgbBlue;
pPal[0].peFlags=(BYTE)0;
pPal[1].peRed=(BYTE) 255;//lpRGB->rgbRed;
pPal[1].peGreen=(BYTE) 255;//lpRGB->rgbGreen;
pPal[1].peBlue=(BYTE) 255;//lpRGB->rgbBlue;
pPal[1].peFlags=(BYTE)0;
}


//fprintf(stderr, "biSize=%d, biCompression=%d, BITMAPFILEHEADER=%d, BITMAPINFOHEADER=%d\n", 
// bii.biSize, bii.biCompression, sizeof(BITMAPFILEHEADER), sizeof(BITMAPINFOHEADER));
//fflush(stderr);


hf=fopen(FileName,"wb");
//fseek(hf,0,SEEK_SET);
fwrite((LPSTR)&bff,1,sizeof(BITMAPFILEHEADER),hf);
fwrite((LPSTR)&bii,1,sizeof(BITMAPINFOHEADER),hf);
if((bii.biBitCount!=24)||(bii.biBitCount!=16))
fwrite((LPSTR)&pPal[0],1,sizeof(PALETTEENTRY)*number_color,hf);
fwrite((LPSTR)tempgray,1,BmpWidth*height,hf);
fclose(hf);


if( tempgray)
{
free(tempgray);
tempgray = NULL;
}
if( tempgray1)
{
free(tempgray1);
tempgray1 = NULL;
}


return 1; 
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/mianhuantang848989/article/details/38389575

智能推荐

S3C2440结构和启动流程_s3c2440启动代码分析流程图_I will,的博客-程序员宝宝

S3C2440结构如下图:启动过程:大多数ARM芯片从0地址启动1、NOR启动,NOR Flash基地址为0,片内RAM地址为0x40000000.CPU读出NOR上第一个指令(前4字节),执行。CPU读出NOR上其它指令,执行。2、NAND启动,片内4kRAM基地址为0,NOR Flash不可访问。2440硬件把NAND前4k内容复制到片内RAM,然后CPU从0地址取出第一条指令...

VOC格式数据集转yolo(darknet)格式_voc数据集转yolo_耐心的小黑的博客-程序员宝宝

一、前言在上一篇文章中我们已经了解了VOC数据集的组织格式,如果我们想要训练自己的数据集,那么就可以按照VOC的格式来组织你的数据。当然可能需要借助一些工具,这个以后有机会再说!!!但是,官方的darknet版本的yolov3所需的数据格式并不是这样的,我们还需要做一些转换。但是好消息是,我们可以利用一些python脚本来帮助我们快速完成格式转换!!!二、yolov3的数据格式前面说到,yolov3的数据格式和voc的有一些不同,主要体现在类别和坐标信息的组织形式不同,也即前者并不是直接使用上一篇

Linux的常用命令-帮助命令man_linux常用命令 man_刘剑涛哒哒哒的博客-程序员宝宝

帮助命令manman 【命令】 #获取指定命令的帮助man 【ls】 #查看ls的帮助man -f 命令 相当于 whatis 命令 #查看命令拥有哪个级别的帮助举例:man 5 passwdman 4 nullman 8 ifconfig查看和命令相关的所有帮助man -k 命令 相当于 apropos 命令例如:apro...

RabbitMQ配置更改TCP默认端口5672_立Bai的博客-程序员宝宝

​​​​​前言公司新项目需集成RabbitMQ,但服务器环境已经安装了ActiveMQ(今天同事不说还不知道),导致安装后俩MQ打架(端口冲突)而发生的一系列问题。没办法,后来居上的就很被动,于是就得改改端口,这一改还踩了坑,特此记一记。一、环境RabbitMQ 3.9.8ErLang 24.1Windows Server 2012 R2 Standard二、正常流程 RabbitMQ的配置文件rabbitmq.conf文件在安装目录下的e...

C# 实现杨辉三角_凉夏l的博客-程序员宝宝

杨辉三角一 历史: 杨辉三角,是二项式系数在三角形中的一种几何排列。在中国南宋数学家杨辉的《详解九章算法》一书中出现。二 特点:(1)第一列和最后一列的数值为1(2)中间列,数值等于它上方两数之和三 编程实现:1.直角杨辉三角using System;using System.Col...

functional filter()_weixin_30596343的博客-程序员宝宝

1 #include "pch.h" 2 #include &lt;iostream&gt; 3 #include &lt;deque&gt; 4 #include &lt;string&gt; 5 #include &lt;list&gt; 6 #include &lt;algorithm&gt; 7 #include &lt;vector&gt; 8 #inc...

随便推点

思维导图怎么画:多方法绘制自己喜欢的思维导图技巧_橙色的天空的博客-程序员宝宝

我们在上班或整理思路的时候,可能会绘制思维导图以便更好地了解整个流程的走向。但是在绘制流程图的时候,很多用户都不知道应该如何绘制才好。那么,接下来就要为大家讲讲怎么通过多个方法来绘制思维导图。一、直接用纸笔绘制最简单的流程图绘制方法,应该就是借助纸笔来实现了。直接在本子上绘制,确定好中心内容后,将其写下,然后扩展出分支,最好是用不同颜色来区分出这些分支。二、手机及平板:Mi

Java的跨平台原理详解(案例,图解)_gearMK的博客-程序员宝宝

目录一、需要了解的知识点二、从街机游戏入手研究Java的跨平台原理三、总结一、需要了解的知识点平台相关性:不同的平台(操作系统)都有其特有的指令格式,进而导致不同的操作系统的可执行文件是不同的(如:Windows的.exe文件,Mac的app文件等)。Java虚拟机(Java Virtual Machine):简称JVM,是运行所有Java程序的虚拟计算机,JVM用于读取并处理编译过的与平...

推荐几个大厂的前端代码规范,你也能写出诗一样的代码!_全栈修炼的博客-程序员宝宝

大家好,我是你们的 前端章鱼猫,一个不喜欢吃鱼、又不喜欢喵 的超级猫 ~简介前端章鱼猫从 2016 年加入 GitHub,到现在的 2020 年,快整整 5 个年头了。相信很多人都没有逛...

Linux中安装苹果系统_linux安装mac镜像_qq_40084534的博客-程序员宝宝

 VMware14虚拟机安装苹果系统2018年07月21日 18:12:58 DY_1024 阅读数:2177 标签: 虚拟机MacOS版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/DY_1024/article/details/81145800我们经常使用VM虚拟机来安装区别于本机的操作系统,比如:Linux和Mac OS对...

【信号处理】 PCM调制含GUI matlab源码_Matlab科研辅导帮的博客-程序员宝宝

一、简介数字信号是对连续变化的模拟信号进行抽样、量化和编码产生的,称为PCM(Pulse Code Modulation),即脉冲编码调制。脉冲编码调制就是把一个时间连续,取值连续的模拟信号变换成时间离散,取值离散的数字信号后在信道中传输。脉冲编码调制就是对模拟信号先抽样,再对样值幅度量化,编码的过程。抽样,就是对模拟信号进行周期性扫描,把时间上连续的信号变成时间上离散的信号。该模拟信号经过抽样后还应当包含原信号中所有信息,也就是说能无失真的恢复原模拟信号。它的抽样速率的下限是由抽样定理确定的。

Co-prime//HDU - 4135//数论_salty_fishman的博客-程序员宝宝

Co-prime//HDU - 4135//数论题目Given a number N, you are asked to count the number of integers between A and B inclusive which are relatively prime to N.Two integers are said to be co-prime or relative...