📄 bmp.cpp
字号:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "BMP.h"
//创建一个设备无关位图结构
void CreateDIB(DIB_Type *DIB, BMP_Header *image)
{
WORD n;
DIB->width = image->infoHeader.biWidth;
DIB->height = image->infoHeader.biHeight;
DIB->bitCount = image->infoHeader.biBitCount;
n = DIB->width*DIB->bitCount;
if (n%32 == 0)
DIB->bpl = n/8;
else
DIB->bpl = n/8+(4-(n/8)%4);
if (DIB->bitCount <= 8)
DIB->palCount = 1<<(DIB->bitCount);
else
DIB->palCount = 0;
DIB->picSize = DIB->bpl*DIB->height;
DIB->offSet = image->fileHeader.bfOffBits-14;
DIB->lpbmi = (LPBITMAPINFO)malloc(40+sizeof(RGBQUAD)*DIB->palCount+DIB->picSize);
DIB->lpvbits = (BYTE *)DIB->lpbmi+DIB->offSet;
DIB->lpvbits = (BYTE *)DIB->lpbmi+DIB->offSet;
memcpy(DIB->lpbmi, &image->infoHeader, 40);
if (DIB->palCount > 0)
{
fseek(image->fp, 14+40, SEEK_SET);
fread((BYTE *)DIB->lpbmi+40, sizeof(RGBQUAD), DIB->palCount, image->fp);
}
fseek(image->fp, 14+DIB->offSet, SEEK_SET);
fread(DIB->lpvbits, sizeof(BYTE), DIB->picSize, image->fp);
}
//删除位图结构
void DeleteDIB(DIB_Type *DIB)
{
free(DIB->lpbmi);
DIB->hDIB = NULL;
}
//读入BMP文件
int LoadBMPHeader(BMP_Header *image, char *fileName)
{
image->fp = fopen(fileName, "rb");
if (image->fp == NULL)
return -1;//ERR_FILE_CANT_OPEN;
fseek(image->fp, 0, SEEK_SET);
fread(&(image->fileHeader), sizeof(BITMAPFILEHEADER), 1, image->fp);
fread(&(image->infoHeader), sizeof(BITMAPINFOHEADER), 1, image->fp);
if (strncmp((char *)&(image->fileHeader.bfType), "BM", 2) != 0)
{
fclose(image->fp);
return -1;//ERR_FMT_NOT_BMP
}
if (image->infoHeader.biCompression)
{
fclose(image->fp);
return -1;//ERR_FMT_COMPRESSION
}
return 0;
}
//关闭BMP文件
void CloseBMPHeader(BMP_Header *image)
{
fclose(image->fp);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -