标题:help me on loading a bitmap,please!thank you indeed!
只看楼主
woainiql10
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2008-4-9
 问题点数:0 回复次数:0 
help me on loading a bitmap,please!thank you indeed!
//File Name LoadBitmap.cpp
//Purpose Load a bitmap,display the file infor on the console
//Platform:WindowsXP sp2
//IDE:Visual Studio 2005-Visual c++
//Note:the bitmap must be included in the root directory
#include <windows.h>
#include <stdio.h>
#include <io.h>
#define BITMAP_ID            0x4D42 // universal id for a bitmap
#define MAX_COLORS_PALETTE  256
#define DD_PIXEL_FORMAT555      15
#define DD_PIXEL_FORMAT565      16
// this builds a 16 bit color value in 5.5.5 format (1-bit alpha mode)
#define _RGB16BIT555(r,g,b) ((b & 31) + ((g & 31) << 5) + ((r & 31) << 10))
// this builds a 16 bit color value in 5.6.5 format (green dominate mode)
#define _RGB16BIT565(r,g,b) ((b & 31) + ((g & 63) << 5) + ((r & 31) << 11))
int dd_pixel_format = DD_PIXEL_FORMAT565;  // default pixel format
typedef struct BITMAP_FILE_TAG
        {
        BITMAPFILEHEADER bitmapfileheader;  // this contains the bitmapfile header
        BITMAPINFOHEADER bitmapinfoheader;  // this is all the info including the palette
        PALETTEENTRY     palette[256];      // we will store the palette here
        UCHAR            *buffer;           // this is a pointer to the data
        } BITMAP_FILE, *BITMAP_FILE_PTR;
int Load_Bitmap_File(BITMAP_FILE_PTR bitmap, char *filename)
{
// this function opens a bitmap file and loads the data into bitmap ,print file infor to the screen
int file_handle,  // the file handle
    index;        // looping index
UCHAR   *temp_buffer = NULL; // used to convert 24 bit images to 16 bit
OFSTRUCT file_data;          // the file data information
// open the file if it exists
if ((file_handle = OpenFile(filename,&file_data,OF_READ))==-1)
   return(0);
// now load the bitmap file header
_lread(file_handle, &bitmap->bitmapfileheader,sizeof(BITMAPFILEHEADER));
// test if this is a bitmap file
if (bitmap->bitmapfileheader.bfType!=BITMAP_ID)
   {
   // close the file
   _lclose(file_handle);
   // return error
   return(0);
   } // end if
// now we know this is a bitmap, so read in all the sections
// first the bitmap infoheader
// now load the bitmap file header
_lread(file_handle, &bitmap->bitmapinfoheader,sizeof(BITMAPINFOHEADER));
// now load the color palette if there is one
if (bitmap->bitmapinfoheader.biBitCount == 8)
   {
   _lread(file_handle, &bitmap->palette,MAX_COLORS_PALETTE*sizeof(PALETTEENTRY));
   // now set all the flags in the palette correctly and fix the reversed
   // BGR RGBQUAD data format
   for (index=0; index < MAX_COLORS_PALETTE; index++)
       {
       // reverse the red and green fields
       int temp_color                = bitmap->palette[index].peRed;
       bitmap->palette[index].peRed  = bitmap->palette[index].peBlue;
       bitmap->palette[index].peBlue = temp_color;
      
       // always set the flags word to this
       bitmap->palette[index].peFlags = PC_NOCOLLAPSE;
       } // end for index
    } // end if
// finally the image data itself
_lseek(file_handle,-(int)(bitmap->bitmapinfoheader.biSizeImage),SEEK_END);//HRMErorr
// now read in the image
if (bitmap->bitmapinfoheader.biBitCount==8 || bitmap->bitmapinfoheader.biBitCount==16)
   {
   // delete the last image if there was one
   if (bitmap->buffer)
       free(bitmap->buffer);
   // allocate the memory for the image
   if (!(bitmap->buffer = (UCHAR *)malloc(bitmap->bitmapinfoheader.biSizeImage)))
      {
      // close the file
      _lclose(file_handle);
      // return error
      return(0);
      } // end if
   // now read it in
   _lread(file_handle,bitmap->buffer,bitmap->bitmapinfoheader.biSizeImage);
   } // end if
else
if (bitmap->bitmapinfoheader.biBitCount==24)
   {
   // allocate temporary buffer to load 24 bit image
   if (!(temp_buffer = (UCHAR *)malloc(bitmap->bitmapinfoheader.biSizeImage)))
      {
      // close the file
      _lclose(file_handle);
      // return error
      return(0);
      } // end if
   
   // allocate final 16 bit storage buffer
   if (!(bitmap->buffer=(UCHAR *)malloc(2*bitmap->bitmapinfoheader.biWidth*bitmap->bitmapinfoheader.biHeight)))
      {
      // close the file
      _lclose(file_handle);
      // release working buffer
      free(temp_buffer);
      // return error
      return(0);
      } // end if
   // now read the file in
   _lread(file_handle,temp_buffer,bitmap->bitmapinfoheader.biSizeImage);
   // now convert each 24 bit RGB value into a 16 bit value
   for (index=0; index < bitmap->bitmapinfoheader.biWidth*bitmap->bitmapinfoheader.biHeight; index++)
       {
       // build up 16 bit color word
       USHORT color;
      
       // build pixel based on format of directdraw surface
       if (dd_pixel_format==DD_PIXEL_FORMAT555)
           {
           // extract RGB components (in BGR order), note the scaling
           UCHAR blue  = (temp_buffer[index*3 + 0] >> 3),
                 green = (temp_buffer[index*3 + 1] >> 3),
                 red   = (temp_buffer[index*3 + 2] >> 3);
           // use the 555 macro
           color = _RGB16BIT555(red,green,blue);
           } // end if 555
       else
       if (dd_pixel_format==DD_PIXEL_FORMAT565)
          {
          // extract RGB components (in BGR order), note the scaling
           UCHAR blue  = (temp_buffer[index*3 + 0] >> 3),
                 green = (temp_buffer[index*3 + 1] >> 2),
                 red   = (temp_buffer[index*3 + 2] >> 3);
           // use the 565 macro
           color = _RGB16BIT565(red,green,blue);
          } // end if 565
       // write color to buffer
       ((USHORT *)bitmap->buffer)[index] = color;
       } // end for index
   // finally write out the correct number of bits
   bitmap->bitmapinfoheader.biBitCount=16;
   // release working buffer
   free(temp_buffer);
   } // end if 24 bit
else
   {
   // serious problem
   return(0);
   } // end else
// write the file info out
printf("\nfilename:%s \nsize=%d \nwidth=%d \nheight=%d \nbitsperpixel=%d \ncolors=%d \nimpcolors=%d",
        filename,
        bitmap->bitmapinfoheader.biSizeImage,
        bitmap->bitmapinfoheader.biWidth,
        bitmap->bitmapinfoheader.biHeight,
  bitmap->bitmapinfoheader.biBitCount,
        bitmap->bitmapinfoheader.biClrUsed,
        bitmap->bitmapinfoheader.biClrImportant);
// close the file
_lclose(file_handle);
// return success
return(1);
} // end Load_Bitmap_File
int main()
{
BITMAP_FILE  bitmap16bit;            // a 16 bit bitmap file
int success;
success = Load_Bitmap_File(&bitmap16bit, "cockpit03.BMP");
if(success) printf("successfully loading bitmap!");
else printf("loading bitmap failed!!");
}

附件里有完整的文件

[[it] 本帖最后由 woainiql10 于 2008-4-21 10:08 编辑 [/it]]

LoadBitmap.rar (77.74 KB) .cpp and .bmp file included

搜索更多相关主题的帖子: bitmap indeed loading please thank 
2008-04-19 20:58



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-209971-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.661333 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved