📄 dib.cpp
字号:
// 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 + -