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

📄 dib.cpp

📁 用vc编写的视频采集端口编成
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// Dib.cpp: implementation of the CDib class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Dib.h"
#define WIDTHBYTES(i) ((i + 31) / 32 * 4)

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CDib::CDib() : CSQLDatebase()
{
	bBmpValid = 0;
	GetSystemInfo(&si);
	iFileSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) + 230400;
}

bool CDib::SaveDIB(HDC hDc, RECT rect, LPSTR lpstrFileName)
// Function: Save the part of image in the rectangle of hDc designated by rect
//			 After this operation, you can open the bmp file by any standard
//				program. You will see the identical image as the image in rectangle.
{

	int nWidth, nHeight;
	char lpszMessage[100];
	HBITMAP hTmpBmp;
	DWORD dwDIBSize;
	LPBITMAPINFOHEADER lpBI = (LPBITMAPINFOHEADER)&bmi;
	DWORD dwErrorCode;

	// Open file...
	//
	hFile = CreateFile(lpstrFileName, GENERIC_READ | GENERIC_WRITE,
		FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,
		NULL);
	if (hFile == INVALID_HANDLE_VALUE){
		// File open failed
		MessageBox(NULL, "File could not be opened.", "error", MB_OK);
		return 0;
	}

	//  Create file mapping
	//
	DWORD dwNumberOfBytesToMap = si.dwAllocationGranularity * 10;
	hFileMapping = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, dwNumberOfBytesToMap, NULL);
	if(hFileMapping == NULL){
		MessageBox(NULL, "File mapping open failed", "error", MB_OK);
		CloseHandle(hFile);
		return 0;
	}

	//  Mapping view...
	//

	pbFile = (PBYTE)MapViewOfFile(hFileMapping, FILE_MAP_WRITE, 0, 0, dwNumberOfBytesToMap);
	if (!pbFile){
		dwErrorCode = GetLastError();
		sprintf(lpszMessage, "Calling MapViewOfFile error, \n error code %d", dwErrorCode);
		MessageBox(NULL, lpszMessage, "error", MB_OK);
		return 0;
	}
	//  Create memory DC
	//
	hMemDc = CreateCompatibleDC(hDc);

	//  Create a DDB bitmap
	//
	nWidth = rect.right - rect.left;
	nHeight = rect.bottom - rect.top;
	hBitmap = CreateCompatibleBitmap(hDc, nWidth, nHeight);
	hTmpBmp = CreateCompatibleBitmap(hDc, nWidth, nHeight);

	SelectObject(hMemDc, hBitmap);

	if(!BitBlt(hMemDc, 0, 0, nWidth, nHeight, hDc, rect.left, rect.top, SRCCOPY))
		MessageBox(NULL, "BitBlt error", "error", MB_OK);

	BITMAP bm;
	GetObject(hBitmap, sizeof(BITMAP), (LPVOID)&bm);


	hBitmap = (HBITMAP)SelectObject(hMemDc, hTmpBmp);
	
	// Initiate the BitmapInfo structure...
	//
	ZeroMemory(&bmi, sizeof(BITMAPINFOHEADER));
	
	bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
	bmi.bmiHeader.biWidth = bm.bmWidth;
	bmi.bmiHeader.biHeight = bm.bmHeight;
	bmi.bmiHeader.biPlanes = 1;
	bmi.bmiHeader.biBitCount = 24;
	bmi.bmiHeader.biCompression = BI_RGB;

	dwDIBSize = lpBI->biSize + sizeof(RGBQUAD);


	DWORD dwOffset = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD);


	//  Write the DIB file...

	if(!GetDIBits(hDc, hBitmap, 0, bm.bmHeight, NULL, &bmi, DIB_RGB_COLORS))
		MessageBox(NULL, "GetDIBits error", "error", MB_OK);

	if(bmi.bmiHeader.biSizeImage == 0)
		bmi.bmiHeader.biSizeImage = WIDTHBYTES((bm.bmWidth) * (bm.bmBitsPixel)) * bm.bmHeight;

	dwDIBSize += bmi.bmiHeader.biSizeImage;


	//  Initlize BitmapFileHeader structure...
	//
	bmfHdr.bfType = 0x4d42;  //  BM
	bmfHdr.bfSize = dwDIBSize + sizeof(BITMAPFILEHEADER);
	bmfHdr.bfReserved1 = 0;
	bmfHdr.bfReserved2 = 0;
	bmfHdr.bfOffBits = sizeof(BITMAPFILEHEADER) + lpBI->biSize + sizeof(RGBQUAD);

	LPVOID pointer = pbFile;
	memcpy(pbFile, &bmfHdr, sizeof(BITMAPFILEHEADER));
	pointer = (LPVOID) ((DWORD)pointer + sizeof(BITMAPFILEHEADER));
	memcpy(pointer, &bmi, sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD));
	pointer = (LPVOID) ((DWORD)pointer + sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD));

	if(GetDIBits(hMemDc, hBitmap, 0, (UINT)bm.bmHeight, pointer, &bmi, DIB_RGB_COLORS) == 0)
		MessageBox(NULL, "GetDIBits error", "error", MB_OK);



	
	DeleteDC(hMemDc);
	DeleteObject(hTmpBmp);
	DeleteObject(hBitmap);
	UnmapViewOfFile(pbFile);
	CloseHandle(hFileMapping);

	SetFilePointer(hFile, bmfHdr.bfSize, NULL, FILE_BEGIN);
	SetEndOfFile(hFile);

	CloseHandle(hFile);

	return 1;
}

bool CDib::SaveStretchedDIB(HDC hDc, RECT rect, LPSTR lpstrFileName)
// Function: Save the part of image in the rectangle of hDc designated by rect in to
//			a bmp file with the size of 320*240. The image is stretched to 320*240.

{

	int nWidth, nHeight;
	char lpszMessage[100];
	HBITMAP hTmpBmp;
	DWORD dwDIBSize;
	LPBITMAPINFOHEADER lpBI = (LPBITMAPINFOHEADER)&bmi;
	DWORD dwErrorCode;

	// Open file...
	//
	hFile = CreateFile(lpstrFileName, GENERIC_READ | GENERIC_WRITE,
		FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,
		NULL);
	if (hFile == INVALID_HANDLE_VALUE){
		// File open failed
		MessageBox(NULL, "File could not be opened.", "error", MB_OK);
		return 0;
	}

	//  Create file mapping
	//
	DWORD dwNumberOfBytesToMap = si.dwAllocationGranularity * 10;
	hFileMapping = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, dwNumberOfBytesToMap, NULL);
	if(hFileMapping == NULL){
		MessageBox(NULL, "File mapping open failed", "error", MB_OK);
		CloseHandle(hFile);
		return 0;
	}

	//  Mapping view...
	//

	pbFile = (PBYTE)MapViewOfFile(hFileMapping, FILE_MAP_WRITE, 0, 0, dwNumberOfBytesToMap);
	if (!pbFile){
		dwErrorCode = GetLastError();
		sprintf(lpszMessage, "Calling MapViewOfFile error, \n error code %d", dwErrorCode);
		MessageBox(NULL, lpszMessage, "error", MB_OK);
		return 0;
	}
	//  Create memory DC
	//
	hMemDc = CreateCompatibleDC(hDc);

	//  Create a DDB bitmap
	//
	nWidth = rect.right - rect.left;
	nHeight = rect.bottom - rect.top;
	
	int nDestWidth = 320;
	int nDestHeight = 240;

	hBitmap = CreateCompatibleBitmap(hDc, nDestWidth, nDestHeight);
	hTmpBmp = CreateCompatibleBitmap(hDc, nDestWidth, nDestHeight);

	SelectObject(hMemDc, hBitmap);
	
	if(!StretchBlt(hMemDc, 0, 0, nDestWidth, nDestHeight,  
		hDc, rect.left, rect.top, nWidth, nHeight, SRCCOPY))
		MessageBox(NULL, "BitBlt error", "error", MB_OK);

	BITMAP bm;
	GetObject(hBitmap, sizeof(BITMAP), (LPVOID)&bm);


	hBitmap = (HBITMAP)SelectObject(hMemDc, hTmpBmp);
	
	// Initiate the BitmapInfo structure...
	//
	ZeroMemory(&bmi, sizeof(BITMAPINFOHEADER));
	
	bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
	bmi.bmiHeader.biWidth = bm.bmWidth;
	bmi.bmiHeader.biHeight = bm.bmHeight;
	bmi.bmiHeader.biPlanes = 1;
	bmi.bmiHeader.biBitCount = 24;
	bmi.bmiHeader.biCompression = BI_RGB;

	dwDIBSize = lpBI->biSize + sizeof(RGBQUAD);


	DWORD dwOffset = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD);


	//  Write the DIB file...


	if(!GetDIBits(hMemDc, hBitmap, 0, bm.bmHeight, NULL, &bmi, DIB_RGB_COLORS))
		MessageBox(NULL, "GetDIBits error", "error", MB_OK);

	if(bmi.bmiHeader.biSizeImage == 0)
		bmi.bmiHeader.biSizeImage = WIDTHBYTES((bm.bmWidth) * (bm.bmBitsPixel)) * bm.bmHeight;

	dwDIBSize += bmi.bmiHeader.biSizeImage;


	//  Initlize BitmapFileHeader structure...
	//
	bmfHdr.bfType = 0x4d42;  //  BM
	bmfHdr.bfSize = dwDIBSize + sizeof(BITMAPFILEHEADER);
	bmfHdr.bfReserved1 = 0;
	bmfHdr.bfReserved2 = 0;
	bmfHdr.bfOffBits = sizeof(BITMAPFILEHEADER) + lpBI->biSize + sizeof(RGBQUAD);

	LPVOID pointer = pbFile;
	memcpy(pbFile, &bmfHdr, sizeof(BITMAPFILEHEADER));
	pointer = (LPVOID) ((DWORD)pointer + sizeof(BITMAPFILEHEADER));
	memcpy(pointer, &bmi, sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD));
	pointer = (LPVOID) ((DWORD)pointer + sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD));

	if(GetDIBits(hMemDc, hBitmap, 0, (UINT)bm.bmHeight, pointer, &bmi, DIB_RGB_COLORS) == 0)
		MessageBox(NULL, "GetDIBits error", "error", MB_OK);

	DeleteDC(hMemDc);
	DeleteObject(hTmpBmp);
	DeleteObject(hBitmap);
	UnmapViewOfFile(pbFile);
	CloseHandle(hFileMapping);

	SetFilePointer(hFile, bmfHdr.bfSize, NULL, FILE_BEGIN);
	SetEndOfFile(hFile);

	CloseHandle(hFile);

	return 1;
}

PVOID CDib::SaveDIBInMemory(HDC hDc)
// Function:	To save the image displayed in hDc in this object.
// Return Value:Pointer of the first adress of "DB file in memory".
//						You can simply copy this memory block pointed by the return
//							value to get a DIB file.
{
	int nWidth, nHeight;
	char lpszMessage[100];
	HBITMAP hTmpBmp;
	DWORD dwDIBSize;
	LPBITMAPINFOHEADER lpBI = (LPBITMAPINFOHEADER)&bmi;

	pbFile = pbImageBuffer;
	if (!pbFile){
		
		sprintf(lpszMessage, "Memory allocating error");
		MessageBox(NULL, lpszMessage, "error", MB_OK);
		return 0;
	}
	//  Create memory DC

⌨️ 快捷键说明

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