centos7 C++ 用 bmplib解析bmp文件

版权声明:本文为博主原创文章,未经博主允许不得转载。 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点图片,如有问题欢迎指正

猜你喜欢

转载自blog.csdn.net/sz76211822/article/details/84339026