⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 myfile.cpp

📁 数字摄影测量相关算法编程,在VC环境下实现影像特征点提取.
💻 CPP
📖 第 1 页 / 共 3 页
字号:
//  myfile.cpp
//
//  Source file for Device-Independent Bitmap (DIB) API.  Provides
//  the following functions:
//
//  SaveDIB()           - Saves the specified dib in a file
//  ReadDIBFile()       - Loads a DIB from a file
//
//
// This is a part of the Microsoft Foundation Classes C++ library.
// Copyright (C) 1992 Microsoft Corporation
// All rights reserved.
//
// This source code is only intended as a supplement to the
// Microsoft Foundation Classes Reference and Microsoft
// QuickHelp and/or WinHelp documentation provided with the library.
// See these sources for detailed information regarding the
// Microsoft Foundation Classes product.

#include "StdAfx.h"
#include <math.h>
#include <io.h>
#include <direct.h>
#include "dibapi.h"

/*
 * Dib Header Marker - used in writing DIBs to files
 */
#define DIB_HEADER_MARKER   ((WORD) ('M' << 8) | 'B')

#ifdef _MAC
#define SWAPWORD(x) MAKEWORD(HIBYTE(x), LOBYTE(x))
#define SWAPLONG(x) MAKELONG(SWAPWORD(HIWORD(x)), SWAPWORD(LOWORD(x)))
void ByteSwapHeader(BITMAPFILEHEADER* bmiHeader);
void ByteSwapInfo(LPSTR lpHeader, BOOL fWin30Header);
#endif

#define PAI 3.1415926
short mask_unit[][11]={
		 {1,1,1,1,1,1,1,1,1,1,1},
		 {1,1,1,1,1,1,1,1,1,1,1},
		 {1,1,1,1,1,1,1,1,1,1,1},
		 {1,1,1,1,1,1,1,1,1,1,1},
		 {1,1,1,1,1,1,1,1,1,1,1},
		 {1,1,1,1,1,0,1,1,1,1,1},
		 {1,1,1,1,1,1,1,1,1,1,1},
		 {1,1,1,1,1,1,1,1,1,1,1},
		 {1,1,1,1,1,1,1,1,1,1,1},
		 {1,1,1,1,1,1,1,1,1,1,1},
		 {1,1,1,1,1,1,1,1,1,1,1},
		};
/*************************************************************************
 *
 * SaveDIB()
 *
 * Saves the specified DIB into the specified CFile.  The CFile
 * is opened and closed by the caller.
 *
 * Parameters:
 *
 * HDIB hDib - Handle to the dib to save
 *
 * CFile& file - open CFile used to save DIB
 *
 * Return value: TRUE if successful, else FALSE or CFileException
 *
 *************************************************************************/


BOOL WINAPI SaveDIB(HDIB hDib, CFile& file)
{
	BITMAPFILEHEADER bmfHdr; // Header for Bitmap file
	LPBITMAPINFOHEADER lpBI;   // Pointer to DIB info structure
	DWORD dwDIBSize;

	if (hDib == NULL)
		return FALSE;

	/*
	 * Get a pointer to the DIB memory, the first of which contains
	 * a BITMAPINFO structure
	 */
	lpBI = (LPBITMAPINFOHEADER) ::GlobalLock((HGLOBAL) hDib);
	if (lpBI == NULL)
		return FALSE;

	if (!IS_WIN30_DIB(lpBI))
	{
		::GlobalUnlock((HGLOBAL) hDib);
		return FALSE;       // It's an other-style DIB (save not supported)
	}

	/*
	 * Fill in the fields of the file header
	 */

	/* Fill in file type (first 2 bytes must be "BM" for a bitmap) */
	bmfHdr.bfType = DIB_HEADER_MARKER;  // "BM"

	// Calculating the size of the DIB is a bit tricky (if we want to
	// do it right).  The easiest way to do this is to call GlobalSize()
	// on our global handle, but since the size of our global memory may have
	// been padded a few bytes, we may end up writing out a few too
	// many bytes to the file (which may cause problems with some apps).
	//
	// So, instead let's calculate the size manually (if we can)
	//
	// First, find size of header plus size of color table.  Since the
	// first DWORD in both BITMAPINFOHEADER and BITMAPCOREHEADER conains
	// the size of the structure, let's use this.

	dwDIBSize = *(LPDWORD)lpBI + ::PaletteSize((LPSTR)lpBI);  // Partial Calculation

	// Now calculate the size of the image

	if ((lpBI->biCompression == BI_RLE8) || (lpBI->biCompression == BI_RLE4))
	{
		// It's an RLE bitmap, we can't calculate size, so trust the
		// biSizeImage field

		dwDIBSize += lpBI->biSizeImage;
	}
	else
	{
		DWORD dwBmBitsSize;  // Size of Bitmap Bits only

		// It's not RLE, so size is Width (DWORD aligned) * Height

		dwBmBitsSize = WIDTHBYTES((lpBI->biWidth)*((DWORD)lpBI->biBitCount)) * lpBI->biHeight;

		dwDIBSize += dwBmBitsSize;

		// Now, since we have calculated the correct size, why don't we
		// fill in the biSizeImage field (this will fix any .BMP files which
		// have this field incorrect).

		lpBI->biSizeImage = dwBmBitsSize;
	}


	// Calculate the file size by adding the DIB size to sizeof(BITMAPFILEHEADER)

	bmfHdr.bfSize = dwDIBSize + sizeof(BITMAPFILEHEADER);
	bmfHdr.bfReserved1 = 0;
	bmfHdr.bfReserved2 = 0;

	/*
	 * Now, calculate the offset the actual bitmap bits will be in
	 * the file -- It's the Bitmap file header plus the DIB header,
	 * plus the size of the color table.
	 */
	bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + lpBI->biSize
											  + PaletteSize((LPSTR)lpBI);
#ifdef _MAC
	ByteSwapHeader(&bmfHdr);

	// First swap the size field
	*((LPDWORD)lpBI) = SWAPLONG(*((LPDWORD)lpBI));

	// Now swap the rest of the structure (we don't save < Win30 files)
	ByteSwapInfo((LPSTR)lpBI, TRUE);
#endif

	TRY
	{
		// Write the file header
		file.Write((LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER));
		//
		// Write the DIB header and the bits
		//
		file.WriteHuge(lpBI, dwDIBSize);
	}
	CATCH (CFileException, e)
	{
#ifdef _MAC
		// Swap everything back
		*((LPDWORD)lpBI) = SWAPLONG(*((LPDWORD)lpBI));
		ByteSwapInfo((LPSTR)lpBI, TRUE);
#endif
		::GlobalUnlock((HGLOBAL) hDib);
		THROW_LAST();
	}
	END_CATCH

#ifdef _MAC
	// Swap everything back
	*((LPDWORD)lpBI) = SWAPLONG(*((LPDWORD)lpBI));
	ByteSwapInfo((LPSTR)lpBI, TRUE);
#endif

	::GlobalUnlock((HGLOBAL) hDib);
	return TRUE;
}


/*************************************************************************

  Function:  ReadDIBFile (CFile&)

   Purpose:  Reads in the specified DIB file into a global chunk of
			 memory.

   Returns:  A handle to a dib (hDIB) if successful.
			 NULL if an error occurs.

  Comments:  BITMAPFILEHEADER is stripped off of the DIB.  Everything
			 from the end of the BITMAPFILEHEADER structure on is
			 returned in the global memory handle.

*************************************************************************/


HDIB WINAPI ReadDIBFile(CFile& file)
{
	BITMAPFILEHEADER bmfHeader;
	DWORD dwBitsSize;
	HDIB hDIB;
	LPSTR  pDIB;


	/*
	 * get length of DIB in bytes for use when reading
	 */

	dwBitsSize = file.GetLength();

	/*
	 * Go read the DIB file header and check if it's valid.
	 */
	if (file.Read((LPSTR)&bmfHeader, sizeof(bmfHeader)) != sizeof(bmfHeader))
		return NULL;

#ifdef _MAC
	ByteSwapHeader(&bmfHeader);
#endif
	if (bmfHeader.bfType != DIB_HEADER_MARKER)
		return NULL;

	/*
	 * Allocate memory for DIB
	 */
	hDIB = (HDIB) ::GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, dwBitsSize);
	if (hDIB == 0)
	{
		return NULL;
	}
	pDIB = (LPSTR) ::GlobalLock((HGLOBAL) hDIB);

	/*
	 * Go read the bits.
	 */
	if (file.ReadHuge(pDIB, dwBitsSize - sizeof(BITMAPFILEHEADER)) !=
		dwBitsSize - sizeof(BITMAPFILEHEADER) )
	{
		::GlobalUnlock((HGLOBAL) hDIB);
		::GlobalFree((HGLOBAL) hDIB);
		return NULL;
	}
#ifdef _MAC
	// First swap the size field
	*((LPDWORD)pDIB) = SWAPLONG(*((LPDWORD)pDIB));

	// Now swap the rest of the structure
	ByteSwapInfo(pDIB, IS_WIN30_DIB(pDIB));
#endif
	::GlobalUnlock((HGLOBAL) hDIB);
	return hDIB;
}

/*
HDIB  WINAPI ImageREDGREEN(HDIB hDIBRed,HDIB hDIBGreen)
{
	
	LPBITMAPINFOHEADER RbminfoHeader,GbminfoHeader;
	DWORD dwBitsSize;
	HDIB hDIB;
	LPSTR pDIB,pDIBR,pDIBG,datar,datag;
	LPixel24bits  data;
  	

	pDIBR=(LPSTR) ::GlobalLock((HGLOBAL) hDIBRed);
	pDIBG=(LPSTR) ::GlobalLock((HGLOBAL) hDIBGreen);
	
	int width,height;
	RbminfoHeader= (LPBITMAPINFOHEADER)pDIBR; 
	GbminfoHeader= (LPBITMAPINFOHEADER)pDIBG;
		
	width=max(RbminfoHeader->biWidth,GbminfoHeader->biWidth);
	height=max(RbminfoHeader->biHeight,GbminfoHeader->biHeight);
   	
	dwBitsSize=sizeof(BITMAPINFOHEADER)
		      +0* sizeof(RGBQUAD)+3*width*height;
	
	hDIB = (HDIB) ::GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT,dwBitsSize);
	
	if (hDIB == 0)
	{
		::MessageBox(0,"申请内存太大,机器内存不够!","警告",MB_OK);
		return NULL;
	}

	pDIB = (LPSTR) ::GlobalLock((HGLOBAL) hDIB);

	LPBITMAPINFOHEADER p_bminfo = (LPBITMAPINFOHEADER)pDIB;
	p_bminfo->biSize = sizeof(BITMAPINFOHEADER);
    p_bminfo->biWidth = width;
    p_bminfo->biHeight =height;
    p_bminfo->biPlanes = 1;
    p_bminfo->biBitCount =24;
    p_bminfo->biCompression = BI_RGB;
    p_bminfo->biSizeImage = (long)width* 
                            (long)height*3;
    p_bminfo->biXPelsPerMeter = 0;
    p_bminfo->biYPelsPerMeter = 0;
    p_bminfo->biClrUsed = 0;
    p_bminfo->biClrImportant = 0;



	
	data=(LPixel24bits)(pDIB+sizeof(BITMAPINFOHEADER)+0* sizeof(RGBQUAD));
	datar=pDIBR+sizeof(BITMAPINFOHEADER)+256* sizeof(RGBQUAD);
	datag=pDIBG+sizeof(BITMAPINFOHEADER)+256* sizeof(RGBQUAD);
	
	int i,j,offset,offsetr,offsetg;

	for(i=0;i<height;i++)
	 {
		offset=(height-1-i)*width;
		offsetr=(RbminfoHeader->biHeight-1-i)*RbminfoHeader->biWidth;
		offsetg=(GbminfoHeader->biHeight-1-i)*GbminfoHeader->biWidth;
		for(j=0;j<width;j++)
		{
		  if(i<RbminfoHeader->biHeight && j<RbminfoHeader->biWidth)
		 	 data[offset+j].r=datar[offsetr+j];
		  if(i<GbminfoHeader->biHeight && j<GbminfoHeader->biWidth)
			{
			 data[offset+j].g=datag[offsetg+j];
			 data[offset+j].b=datag[offsetg+j];
			}
		}//j circle
	}//i circle
	 
	  	
#ifdef _MAC
	// First swap the size field
	*((LPDWORD)pDIB) = SWAPLONG(*((LPDWORD)pDIB));

	// Now swap the rest of the structure
	ByteSwapInfo(pDIB, IS_WIN30_DIB(pDIB));
	
#endif
	
	::GlobalUnlock((HGLOBAL) hDIBRed);
	::GlobalUnlock((HGLOBAL) hDIBGreen);
	::GlobalUnlock((HGLOBAL) hDIB);
	
	return hDIB;
}



HDIB  WINAPI ImageMatchBaseOnGray(HDIB hDIB1,HDIB hDIB2,int y0,int Search_Scope)
{
	
	LPBITMAPINFOHEADER LbminfoHeader,RbminfoHeader;
	DWORD dwBitsSize;
	HDIB hDIB;
	LPSTR         pDIB,pDIBL,pDIBR,dataL,dataR,data;
	LPixel24bits  datargbL,datargbR,datargb;
  	LPRGBQUAD rgb;

	pDIBL=(LPSTR) ::GlobalLock((HGLOBAL) hDIB1);
	pDIBR=(LPSTR) ::GlobalLock((HGLOBAL) hDIB2);
	
	int widthL,heightL,widthR,heightR;
	int colorsize,BytesPerPixel;
	
	LbminfoHeader= (LPBITMAPINFOHEADER)pDIBL; 
	RbminfoHeader= (LPBITMAPINFOHEADER)pDIBR;
	   	
	if(LbminfoHeader->biBitCount!=RbminfoHeader->biBitCount)return NULL;
	
	switch(LbminfoHeader->biBitCount)
			{
			  case   1:  colorsize =  2;BytesPerPixel=1; break;
			  case   4:  colorsize = 16;BytesPerPixel=1; break;
			  case   8:  colorsize =256;BytesPerPixel=1; break;
			  case  24:  colorsize =  0;BytesPerPixel=3; break;
			  default: return NULL;
			 }

	widthL =LbminfoHeader->biWidth;
	heightL=LbminfoHeader->biHeight;
    
	widthR =RbminfoHeader->biWidth;
	heightR=RbminfoHeader->biHeight;

	dwBitsSize=sizeof(BITMAPINFOHEADER)
		      +colorsize* sizeof(RGBQUAD)+widthL*Search_Scope*BytesPerPixel;
	
	hDIB = (HDIB) ::GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT,dwBitsSize);
	
	if (hDIB == 0)
	{
		return NULL;
	}

	pDIB = (LPSTR) ::GlobalLock((HGLOBAL) hDIB);

	LPBITMAPINFOHEADER p_bminfo = (LPBITMAPINFOHEADER)pDIB;
	p_bminfo->biSize = sizeof(BITMAPINFOHEADER);
    p_bminfo->biWidth =LbminfoHeader->biWidth;
    p_bminfo->biHeight =Search_Scope;
    p_bminfo->biPlanes =LbminfoHeader->biPlanes;
    p_bminfo->biBitCount =LbminfoHeader->biBitCount;
    p_bminfo->biCompression = BI_RGB;
    p_bminfo->biSizeImage = 0;
    p_bminfo->biXPelsPerMeter = 0;
    p_bminfo->biYPelsPerMeter = 0;
    p_bminfo->biClrUsed =LbminfoHeader->biClrUsed;
    p_bminfo->biClrImportant = 0;
    
    int i,j,ii;

	rgb=(LPRGBQUAD)(pDIB+sizeof(BITMAPINFOHEADER));
    
	for(i=0;i<colorsize;i++){
	   rgb[i].rgbRed       = i;
	   rgb[i].rgbGreen     = i;
	   rgb[i].rgbBlue      = i;
	   rgb[i].rgbReserved  = 0;
	  }
	

	if(RbminfoHeader->biBitCount==24){
	   datargbL=(LPixel24bits)(pDIBL+sizeof(BITMAPINFOHEADER));
	   datargbR=(LPixel24bits)(pDIBR+sizeof(BITMAPINFOHEADER));
       datargb =(LPixel24bits)(pDIB +sizeof(BITMAPINFOHEADER));
	}
	else{
	   dataL=pDIBL+sizeof(BITMAPINFOHEADER)+colorsize* sizeof(RGBQUAD);
	   dataR=pDIBR+sizeof(BITMAPINFOHEADER)+colorsize* sizeof(RGBQUAD);
	   data =pDIB +sizeof(BITMAPINFOHEADER)+colorsize* sizeof(RGBQUAD);
	}
	
	int semi_scope=Search_Scope/2;
	long offset1,offset2,offset3;
    
	offset1=(heightL-1-y0)*widthL;
	offset3=(heightR-1-y0)*widthR;

	if(RbminfoHeader->biBitCount!=24)
	 {
		for(i=0;i<widthL;i++)
	     {
		  for(j=(-semi_scope);j<semi_scope;j++)
		  {
		   ii=i+j;
		   offset2=(Search_Scope-1-(j+semi_scope))*widthL;

		   if((ii>0)&&(ii<widthR))
		    {
              data[offset2+i]=abs(dataR[offset3+ii]-dataL[offset1+i]);
		    }
		  }
		}
	}

	
#ifdef _MAC
	// First swap the size field
	*((LPDWORD)pDIB) = SWAPLONG(*((LPDWORD)pDIB));

	// Now swap the rest of the structure
	ByteSwapInfo(pDIB, IS_WIN30_DIB(pDIB));
	
#endif
	
	::GlobalUnlock((HGLOBAL) hDIB1);
	::GlobalUnlock((HGLOBAL) hDIB2);
	::GlobalUnlock((HGLOBAL) hDIB);
	
	return hDIB;
}

HDIB  WINAPI ImageMatchABaseOnGray(HDIB hDIB1,HDIB hDIB2,int Lx0,int Ly0,int Rx0,int Ry0)
{
	
	LPBITMAPINFOHEADER LbminfoHeader,RbminfoHeader;
	DWORD dwBitsSize;
	HDIB hDIB;
	LPSTR         pDIB,pDIBL,pDIBR,dataL,dataR,data;
	LPixel24bits  datargbL,datargbR,datargb;
  	LPRGBQUAD rgb;
	/*
	 * Allocate memory for DIB
	 */
/*	pDIBL=(LPSTR) ::GlobalLock((HGLOBAL) hDIB1);
	pDIBR=(LPSTR) ::GlobalLock((HGLOBAL) hDIB2);
	
	int widthL,heightL,widthR,heightR;
	int colorsize,BytesPerPixel;
	
	LbminfoHeader= (LPBITMAPINFOHEADER)pDIBL; 
	RbminfoHeader= (LPBITMAPINFOHEADER)pDIBR;
	   	
	if(LbminfoHeader->biBitCount!=RbminfoHeader->biBitCount)return NULL;
	
	switch(LbminfoHeader->biBitCount)
			{
			  case   1:  colorsize =  2;BytesPerPixel=1; break;
			  case   4:  colorsize = 16;BytesPerPixel=1; break;
			  case   8:  colorsize =256;BytesPerPixel=1; break;
			  case  24:  colorsize =  0;BytesPerPixel=3; break;
			  default: return NULL;
			 }

	widthL =LbminfoHeader->biWidth;
	heightL=LbminfoHeader->biHeight;
    
	widthR =RbminfoHeader->biWidth;
	heightR=RbminfoHeader->biHeight;

	dwBitsSize=sizeof(BITMAPINFOHEADER)
		      +colorsize* sizeof(RGBQUAD)+widthL*heightL*BytesPerPixel;
	
	hDIB = (HDIB) ::GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT,dwBitsSize);
	
	if (hDIB == 0)
	{
		return NULL;
	}

	pDIB = (LPSTR) ::GlobalLock((HGLOBAL) hDIB);

	LPBITMAPINFOHEADER p_bminfo = (LPBITMAPINFOHEADER)pDIB;
	p_bminfo->biSize = sizeof(BITMAPINFOHEADER);
    p_bminfo->biWidth =LbminfoHeader->biWidth;
    p_bminfo->biHeight =LbminfoHeader->biWidth;
    p_bminfo->biPlanes =LbminfoHeader->biPlanes;
    p_bminfo->biBitCount =LbminfoHeader->biBitCount;
    p_bminfo->biCompression = BI_RGB;
    p_bminfo->biSizeImage = 0;
    p_bminfo->biXPelsPerMeter = 0;
    p_bminfo->biYPelsPerMeter = 0;
    p_bminfo->biClrUsed =LbminfoHeader->biClrUsed;
    p_bminfo->biClrImportant = 0;
    
    int i,j;

	rgb=(LPRGBQUAD)(pDIB+sizeof(BITMAPINFOHEADER));
    
	for(i=0;i<colorsize;i++){
	   rgb[i].rgbRed       = i;
	   rgb[i].rgbGreen     = i;
	   rgb[i].rgbBlue      = i;
	   rgb[i].rgbReserved  = 0;
	  }
	
	 /*
	 * Go read the bits.
	 */
/*	if(RbminfoHeader->biBitCount==24){
	   datargbL=(LPixel24bits)(pDIBL+sizeof(BITMAPINFOHEADER));
	   datargbR=(LPixel24bits)(pDIBR+sizeof(BITMAPINFOHEADER));
       datargb =(LPixel24bits)(pDIB +sizeof(BITMAPINFOHEADER));
	}
	else{
	   dataL=pDIBL+sizeof(BITMAPINFOHEADER)+colorsize* sizeof(RGBQUAD);
	   dataR=pDIBR+sizeof(BITMAPINFOHEADER)+colorsize* sizeof(RGBQUAD);
	   data =pDIB +sizeof(BITMAPINFOHEADER)+colorsize* sizeof(RGBQUAD);
	}
	
	
	long offset1,offset2;
    int xx_offset,yy_offset;
	xx_offset=Rx0-Lx0;
	yy_offset=Ry0-Ly0;
	if(RbminfoHeader->biBitCount!=24)
	 {
		for(i=0;i<heightL;i++)
	     {
		  offset1=(heightL-1-i)*widthL;
		  if((i+yy_offset<0)||((i+yy_offset)>heightR))break;
	      offset2=(heightR-1-(i+yy_offset))*widthR;
		  for(j=0;j<widthL;j++)
		  {
		    if((j+xx_offset<0)||(j+xx_offset>widthR))break;
		    {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -