图像处理小节

来源:互联网 发布:怎么在淘宝上卖lol号 编辑:程序博客网 时间:2024/06/03 14:55

图像数字化的精度包括两部分,即分辨率和颜色的深度。

分辨率指数字化的空间精细程度,有显示分辨率和图像分辨率两种不同的分辨率。

数字图像的颜色深度表示每一像素的颜色值所占的二进制位数。颜色深度越大则能表示的颜色数目越多。颜色深度不同,就产生不同种类的图像文件,在计算机种常用的图像文件:

1 单色图像(每个像素点仅占一位)

2 灰度图像(每个像素点占8位)

3 伪彩色图像(每个像素点占8位)

4 24位彩色图像(每个像素占24位)

 

DIB.h

#ifndef __CDIB_H

#define __CDIB_H

class CDib:public CObject

{

public:

    RGBQUAD* m_pRGB;

    BYTE*    m_pData;

    UINT     m_numberOfColors;

    BOOL     m_valid;

    BITMAPFILEHEADER bitmapInfoHeader;

    BITMAPINFO* m_pBitmapInfo;

    BYTE *pDib;

    DWORD size;

public:

   CDib();

   ~CDib();

   char m_fileName[256];

   char* GetFileName();

   BOOL IsValid();

   DWORD GetSize();

   UINT  GetWidth();

   UINT  GetHeight();

   UINT  GetNumberOfColors();

   RGBQUAD* GetRGB();

   BYTE* GetRGB();

   BYTE* GetData();

   BITMAPINFO* GetInfo();

   WORD PaletteSize(LPBYTE lpDIB);

   WORD DIBNumColors(LPBYTE lpDIB);

   void SaveFile(const CString filename);

public:

   void LoadFile(const char* dibFileName);

};

#endif

 

DIB.CPP文件

 

 

 

#include "DIB.h"

#include "windowsx.h"

CDib::CDib()

{

  size=0;

}

 

CDib::~CDib()

{ 

  GlobalFreePtr(m_bBitmapInfo);

}

 

void CDib::LoadFile(const char *dibFileName)

{

   strcpy(m_fileName,dibFileName);

   CFile dibFile(m_fileName,CFile::mdeRead);

   dibFile.Read((void*)&bitmapFileHeader,sizeof(BITMAPFILEHEADER));

   if(bitmapFileHeader.bfType==0x4d42)//BM

   {

     DWORD fileLength=dibFile.GetLength();

     size=fileLength-sizeof(BITMAPFILEHEADER);

     pDib=(BYTE*)GlobalAllocPtr(GMEM_MOVEABLE,size);

     dibFile.Read((void*)pDib,size);

     dibFile.Close();

     m_pBitmapInfo=(BITMAPINFO*)pDib;

     m_pBitmapInfoHeader=(BITMAPINFOHEADER*)pDib;

     m_pRGB=(RGBQUAD*)(pDib+m_pBitmapInfoHeader->biSize);

     int m_numberOfColors=GetNumberOfColors();

     if(m_pBitmapInfoHeader->biClrUsed==0)

         m_pBitmapInfoHeader->biClrUsed=m_numberOfColors

     DWORD colorTableSize=m_numberOfColors*sizeof(RGBQUAD);

     m_pData=pDib+m_pBitmapInfoHeaader->biSize+colorTableSize;

     if(m_pRGB==(RGBQUAD*)m_pData)//no color table

         m_pRGB=NULL;

     m_pBitmapInfoHeader->biSizeImage=GetSize();

     m_valid=TRUE;

   }

  else

  {

     m_valid=FALSE;

     AfxMessageBox("This isn't a bitmap file!");

  } 

}

 

BOOL CDib::IsValid()

{

 return m_valid;

}

 

char *CDib::GetFileName()

{

   return m_fileName;

}

UINT CDib::GetWidth()

{

  return (UINT)m_pBitmapInfoHeader->biWidh;

}

 

UINT CDib::GetHeight()

{

  return (UINT)m_pBitmapInfoHeader->biHeight;

}

 

DWORD CDib::GetSize()

{

  if(m_pBitmapInfoHeader->biSizeImage!=0)

     return m_pBitmapInfoHeader->biSizeImage;

  else

   {

     DWORD height=(DWORD)GetHeight();

     DWORD width=(DWORD)GetWidth();

     return height*width;

   }

}

 

UINT CDib::GetNumberOfColors()

{

  int numberOfColors;

  if((m_pBitmapInfoHeader->biClrUsed==0) &&

     (m_pBitmapInfoHeader->biBitCount<9))

   {

    switch(m_pBitmapInfoHeader->biBitCount)

    {

     case 1:

        numberOfColors=2;break;

     case 4:

         numberOfColors=16;break;

     case 8:

         numberOfColors=256;break;

    }

   

    

    }

    else

         numberOfColors=(int)m_pBitmapInfoHeader->biClrUsed;

   return numberOfColors;

}

 

BYTE *CDib::GetData()

{

  return m_pData;

}

 

RGBQUAD* CDib::GetRGB()

{

  return m_pRGB;

}

 

BITMAPINFO* CDib::GetInfo()

{

  return m_pBitmapInfo;

}

 

WORD CDib::PaletteSize(LPBYTE lpDIB)

{

  return (DIBNumColors(lpDIB)*sizeof(RGBTRIPLE));

}

 

WORD CDib::DIBNumColors(LPBYTE lpDIB)

{

  WORD wBitCount;

  wBitCount=((LPBITMAPCOREHEADER)lpDIB)->bcBitCount;

  switch(wBitCount)

  {

   case 1:

      return 2;

   case 4:

      return 16;

   case 8:

      return 256;

   default:

      return 0;

  }

}

 

void CDib::SaveFile(const CString filename)

{//此函数只能保存经处理后宽度,高度均没有改变大小的图像

 strcpy(m_filename,filename);

 CFile dibFile(m_filename,CFile::modeCreate|CFile::modeWrite);

 dibFile.Write((void*)&bitmapFileHeader,sizeof(BITMAPFILEHEADER));

 dibFile.Write((void*)pDib,szie);

 dibFile.Close();

}

 

下面是设备无关位图的读取步骤:

 

 

下面是设备无关位图的显示步骤:

 

 

原创粉丝点击