• 大小: 336KB
    文件类型: .7z
    金币: 1
    下载: 0 次
    发布日期: 2021-06-09
  • 语言: C/C++
  • 标签: C  图像处理  保存  

资源简介

用C语言写个应用程序(命令行运行的就行)提取24bit bmp图像数据,以RGB888保存成图像数组

资源截图

代码片段和文件信息

#include “Bitmap.h“



FILE *hFile = NULL;

int LoadBitmapFile ( char *fileName BITMAP_IMAGE_PTR bitmap )
{
int hImageFile = 0; // the file stream of the bitmap file
unsigned char *workingBuffer = 0; // use to hold the data

// Open the bitmap file
hImageFile = _open ( fileName _O_RDONLY );

if ( !hImageFile )
{
WriteLogFile ( “LoadBitmapFile function error! \nCan not open the bitmap.\n“ );
return 0;

}// End If

// Read the header portion of the bitmap file
_read ( hImageFile &bitmap->bitmapHeader sizeof ( BITMAP_HEADER ) );

// test if it is a bitmap
if ( bitmap->bitmapHeader.uiType != UNIVERSAL_BITMAP_ID )
{
WriteLogFile ( “LoadBitmapFile function error! \n\t this not a bitmap.\n%s\n“ fileName );
_close ( hImageFile );
return 0;

}// End If

// Read the info portion of the bitmap file
_read ( hImageFile &bitmap->bitmapInformation sizeof ( BITMAP_INFORMATION ) );

// load the data itself now move the file pointer to the data region
// move back from the end of the file offset is set to the size of the specified image
_lseek ( hImageFile -(int)(bitmap->bitmapInformation.biSizeImage) SEEK_END );

// load the data into buffer
workingBuffer = (unsigned char*)malloc ( bitmap->bitmapInformation.biSizeImage );
bitmap->pixelData = (unsigned char*)malloc ( bitmap->bitmapInformation.biSizeImage );
ZeroMemory ( bitmap->pixelData bitmap->bitmapInformation.biSizeImage );

if ( !workingBuffer || !bitmap->pixelData )
{
WriteLogFile ( “LoadBitmapFile function error! \n\tCan not allocate memory for the buffer \n“ );
_close ( hImageFile );
return 0;

}// End If

_read ( hImageFile workingBuffer bitmap->bitmapInformation.biSizeImage );

// now extract the data
long width  = bitmap->bitmapInformation.biWidth;
long height = bitmap->bitmapInformation.biHeight;
unsigned long int dwBit = bitmap->bitmapInformation.biBitCount;
long bytesPerLine = (width*(bitmap->bitmapInformation.biBitCount/8) + 3) & (~3);

// Test if the bitmap is avaiable or not
if ( dwBit != 24 && dwBit != 32 )
{
WriteLogFile ( “LoadBitmapFile function error! \n%s\tDo not support this kind of bitmap \n“ fileName );
_close ( hImageFile );
free ( workingBuffer );
free ( bitmap->pixelData );
return 0;

}// End If

// Flip the image
for ( int y = 0; y < height; y++ )
{
memcpy ( &bitmap->pixelData[y*bytesPerLine] 
     &workingBuffer[(height-1-y)*bytesPerLine] 
     bytesPerLine );

}// End For ( Each line )

_close ( hImageFile );
free ( workingBuffer );

WriteLogFile ( “%s has been loaded successfully! \n“ fileName );

return 1;
}



void WriteLogFile ( char *content ... )
{
char buffer[1024] = {0}; // the working buffer
va_list argumentList = NULL; //variable of the argument list

if ( !hFile || !content )
return ;

va_start ( argumentList content );
vsprintf ( buffer content argumentList );

评论

共有 条评论