【VC开源代码栏目提醒】:文章导读:在新的一年中,各位网友都进入紧张的学习或是工作阶段。网学会员整理了VC开源代码-CDIB.CPP的相关内容供大家参考,祝大家在新的一年里工作和学习顺利!
#include "stdafx.h"
#include "cdib.h"
#include <io.h>
// Default Constructor
CDIB::CDIB()
{
m_pPalette = NULL;
m_bPalLoaded = FALSE;
m_nWidth = 0;
m_nHeight = 0;
}
// Constructor to load from a file
CDIB::CDIB(const char* szFilename)
{
m_pPalette = NULL;
m_bPalLoaded = FALSE;
m_nWidth = 0;
m_nHeight = 0;
LoadFromFile(szFilename);
}
// Constructor to load from app resources
CDIB::CDIB(UINT nResID)
{
m_pPalette = NULL;
m_bPalLoaded = FALSE;
m_nWidth = 0;
m_nHeight = 0;
LoadFromResource(nResID);
}
// Destructor
CDIB::~CDIB()
{
if(m_pPalette) delete m_pPalette;
}
// Load Bitmap data from a File
BOOL CDIB::LoadFromFile(const char* szFilename)
{
// 1. Read bits from file
HBITMAP hBitmap = (HBITMAP)LoadImage(NULL,
szFilename,
IMAGE_BITMAP,
0, 0,
LR_LOADFROMFILE|LR_CREATEDIBSECTION);
m_bmBitmap.Attach(hBitmap);
// 2. Get palette from the file
// Open the file
int nFile = _lopen(szFilename, OF_READ);
// Only proceed if file could be opened
if (nFile != -1)
{
BITMAPINFOHEADER bminfo;
BITMAPFILEHEADER bmfile;
PALETTEENTRY PalEntries[256];
int nNumEntries;
HANDLE hlogpal;
LPLOGPALETTE lplogpal;
// Read headers and palette entries out of file
_lread (nFile, &bmfile, sizeof(bmfile));
_lread (nFile, &bminfo, sizeof(bminfo));
_lread (nFile, &PalEntries, sizeof(PalEntries));
if ((bminfo.biSize != sizeof(BITMAPINFOHEADER)) ||
(bminfo.biBitCount > 8))
{
_lclose (nFile);
return FALSE;
// Bad header or more than 256 colors - can't go on
}
// if biClrUsed is 0, palette is using max number of
// entries for its bitwidth. Otherwise, biClrUsed
// specifies the actual number of palette entries in use.
if (bminfo.biClrUsed == 0)
{
nNumEntries = 1 << bminfo.biBitCount;
}
else
{
nNumEntries = bminfo.biClrUsed;
}
// Remember the bitmap's width and height
m_nWidth = bminfo.biWidth;
m_nHeight = bminfo.biHeight;
LONG lInfoSize = sizeof(BITMAPINFO) +
sizeof(RGBQUAD)*nNumEntries;
HANDLE hInfo = GlobalAlloc (GHND, lInfoSize);
if (!hInfo)
{
_lclose(nFile);
return FALSE;
}
LPBITMAPINFO lpInfo = (LPBITMAPINFO)GlobalLock(hInfo);
if (!lpInfo)
{
_lclose(nFile);
GlobalFree(hInfo);
return FALSE;
}
// Rewind file and read whole BITMAPINFO for later use
_lseek (nFile, 0, SEEK_SET);
_lread (nFile, lpInfo, lInfoSize);
_lclose(nFile);
// Allocate storage for the LOGPALETTE
hlogpal = GlobalAlloc (GHND, sizeof(LOGPALETTE) +
sizeof(PALETTEENTRY)*nNumEntries);
if (!hlogpal)
{
GlobalUnlock(hInfo);
GlobalFree(hInfo);
return FALSE;
}
lplogpal = (LPLOGPALETTE)GlobalLock (hlogpal);
lplogpal->palVersion = 0x300;
lplogpal->palNumEntries = nNumEntries;
// Copy entries into LOGPALETTE
for (int i=0; i < nNumEntries; i++)
{
lplogpal->palPalEntry[i].peRed = PalEntries[i].peBlue;
lplogpal->palPalEntry[i].peGreen = PalEntries[i].peGreen;
lplogpal->palPalEntry[i].peBlue = PalEntries[i].peRed;
lplogpal->palPalEntry[i].peFlags = 0;
}
// Create the palette
m_pPalette = new CPalette;
m_pPalette->CreatePalette (lplogpal);
// Clean up
GlobalUnlock(hlogpal);
GlobalFree(hlogpal);
GlobalUnlock(hInfo);
GlobalFree(hInfo);
m_bPalLoaded = TRUE;
}
else
{
return FALSE;
}
return TRUE;
}
// Load bitmap data from app resources
BOOL CDIB::LoadFromResource(UINT nResID)
{
HBITMAP hBitmap;
// 1. Read bits from resource
hBitmap = (HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(nResID),
IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION);
m_bmBitmap.Attach(hBitmap);
// 2. Get palette from file or resource
m_bPalLoaded = FALSE;
m_pPalette = 0;
// Load palette from resource
HRSRC hbmres = FindResource (NULL, MAKEINTRESOURCE(nResID), RT_BITMAP);
if (hbmres)
{
LPBITMAPINFOHEADER lpbminfo =
(LPBITMAPINFOHEADER)LockResource(LoadResource(NULL,hbmres));
int nNumEntries;
HANDLE hlogpal;
LPLOGPALETTE lplogpal;
if (lpbminfo &&
(lpbminfo->biSize >= sizeof(BITMAPINFOHEADER)) &&
(lpbminfo->biBitCount <= 8))
{
RGBQUAD* PalEntries = (RGBQUAD*)((BYTE*)lpbminfo
+ lpbminfo->biSize);
// if biClrUsed is 0, palette is using max number of
// entries for its bitwidth. Otherwise, biClrUsed
// specifies the actual number of palette entries
// in use.
if (lpbminfo->biClrUsed == 0)
{
nNumEntries = 1 << lpbminfo->biBitCount;
}
else
{
nNumEntries = lpbminfo->biClrUsed;
}
// Remember the bitmap's width and height
m_nWidth = lpbminfo->biWidth;
m_nHeight = lpbminfo->biHeight;
LONG lInfoSize = sizeof(BITMAPINFO) +
sizeof(RGBQUAD)*nNumEntries;
HANDLE hInfo = GlobalAlloc (GHND, lInfoSize);
if (!hInfo)
{
return FALSE;
}
LPBITMAPINFO lpInfo = (LPBITMAPINFO)GlobalLock(hInfo);
if (!lpInfo)
{
GlobalFree(hInfo);
return FALSE;
}
// Copy BITMAPINFO
memcpy(lpInfo, lpbminfo, lInfoSize);
// Allocate storage for the LOGPALETTE
hlogpal = GlobalAlloc (GHND, sizeof(LOGPALETTE) +
sizeof(PALETTEENTRY)*nNumEntries);
if (!hlogpal)
{
GlobalUnlock(hInfo);
GlobalFree(hInfo);
return FALSE;
}
lplogpal = (LPLOGPALETTE)GlobalLock (hlogpal);
lplogpal->palVersion = 0x300;
lplogpal->palNumEntries = nNumEntries;
// Copy entries into LOGPALETTE
for (int i=0; i<nNumEntries; i++)
{
lplogpal->palPalEntry[i].peBlue = PalEntries[i].rgbBlue;
lplogpal->palPalEntry[i].peGreen = PalEntries[i].rgbGreen;
lplogpal->palPalEntry[i].peRed = PalEntries[i].rgbRed;
lplogpal->palPalEntry[i].peFlags = 0;
}
// Create the palette
m_pPalette = new CPalette;
m_pPalette->CreatePalette (lplogpal);
// Clean up
GlobalUnlock(hlogpal);
GlobalFree(hlogpal);
GlobalUnlock(hInfo);
GlobalFree(hInfo);
m_bPalLoaded = TRUE;
}
else
{
return FALSE;
}
}
else
{
return FALSE;
}
return TRUE;
}
// Convert all pixels with the same color as the pixel at point (x,y).
// All pixels will be converted to the given color (cr).
void CDIB::ConvertColor(int x, int y, COLORREF cr)
{
// Get a DC for BitBlt purposes (anyone will do).[br
上一篇:
CDC2.CPP
下一篇:
高中政治教学中情境创设的尝试和思考