版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sz76211822/article/details/84339026
下载地址:https://download.csdn.net/download/sz76211822/10800716
#ifndef __PARSE_BMP__
#define __PARSE_BMP__
#include <sys/types.h>
#include <string.h>
#include "libnsbmp.h"
class ParseBmp
{
public:
ParseBmp();
~ParseBmp();
bool Parse(const char* pstrImageName, unsigned char* pImageData, long& nImageSize, long& nWidth, long& nHeight);
private:
static void *bitmap_create(int width, int height, unsigned int state);
static unsigned char *bitmap_get_buffer(void *bitmap);
static unsigned char* ReadFile(const char* pFilename, long& nLen);
static size_t bitmap_get_bpp(void *bitmap);
static void bitmap_destroy(void *bitmap);
private:
unsigned char* m_pImageData;
};
#endif
#include "ParseBmp.h"
#include <stdio.h>
#include <stdlib.h>
#define BYTES_PER_PIXEL 4
#define MAX_IMAGE_SIZE (20 * 1024 * 1024)
#define MAX_IMAGE_BYTES (48 * 1024 * 1024)
ParseBmp *pParseBmp = NULL;
ParseBmp::ParseBmp()
{
pParseBmp = this;
m_pImageData = NULL;
while(!m_pImageData){
try{
m_pImageData = new unsigned char[MAX_IMAGE_SIZE];
}
catch(...){}
}
}
ParseBmp::~ParseBmp()
{
if(m_pImageData){
delete[] m_pImageData;
m_pImageData = NULL;
}
}
void *ParseBmp::bitmap_create(int width, int height, unsigned int state)
{
/* ensure a stupidly large (>50Megs or so) bitmap is not created */
if (((long long)width * (long long)height) > (MAX_IMAGE_BYTES/BYTES_PER_PIXEL)) {
return NULL;
}
void* pvData = NULL;
while(!pvData){
try{
pvData = calloc(width * height, BYTES_PER_PIXEL);
}
catch(...){}
}
return pvData;
}
unsigned char *ParseBmp::bitmap_get_buffer(void *bitmap)
{
return (unsigned char*)bitmap;
}
size_t ParseBmp::bitmap_get_bpp(void *bitmap)
{
return BYTES_PER_PIXEL;
}
void ParseBmp::bitmap_destroy(void *bitmap)
{
if(bitmap){
free(bitmap);
}
}
unsigned char* ParseBmp::ReadFile(const char* pFilename, long& nLen)
{
if(pParseBmp->m_pImageData){
memset(pParseBmp->m_pImageData, 0, MAX_IMAGE_SIZE);
FILE* pFile = fopen(pFilename, "rb+");
if(pFile){
fseek(pFile, 0, SEEK_END);
nLen = ftell(pFile);
fseek(pFile, 0, SEEK_SET);
fread(pParseBmp->m_pImageData, 1, nLen, pFile);
fclose(pFile);
}
return pParseBmp->m_pImageData;
}
return NULL;
}
bool ParseBmp::Parse(const char* pstrImageName, unsigned char* pImageData, long& nImageSize, long& nWidth, long& nHeight)
{
long nLen = 0;
unsigned char *data = ReadFile(pstrImageName, nLen);
if(data){
bmp_bitmap_callback_vt bitmap_callbacks = {bitmap_create, bitmap_destroy, bitmap_get_buffer, bitmap_get_bpp};
/* create our bmp image */
bmp_image bmp;
bmp_create(&bmp, &bitmap_callbacks);
/* analyse the BMP */
bmp_result code = bmp_analyse(&bmp, nLen, data);
if (code != BMP_OK) {
bmp_finalise(&bmp);
return false;
}
/* decode the image */
code = bmp_decode(&bmp);
if (code != BMP_OK) {
bmp_finalise(&bmp);
return false;
}
//ManageFile::GetInstance()->WriteFile("/opt/222.bmp", "wb+", bmp.bmp_data, bmp.buffer_size);
if(pImageData){
memcpy(pImageData, bmp.bmp_data, bmp.buffer_size);
}
nImageSize = bmp.buffer_size;
nWidth = bmp.width;
nHeight = bmp.height;
bmp_finalise(&bmp);
return true;
}
return false;
}
我这边的做法是将windows下的图片拷贝到centos7系统环境中,然后解析,我这边没有测试宽度不为4点图片,如有问题欢迎指正