// BitmapEx.cpp: implementation of the CBitmapEx class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "BitmapEx.h"
#include <io.h>
#include <stdio.h>
#include <tchar.h>
#include <stdlib.h>
#include <math.h>
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CBitmapEx::CBitmapEx()
{
// Init members
m_lpData = NULL;
m_dwSize = 0;
m_iPaletteEntries = 0;
m_ResampleMode = RM_NEARESTNEIGHBOUR;
}
CBitmapEx::~CBitmapEx()
{
// Deinit members
if (m_lpData != NULL)
{
free(m_lpData);
m_lpData = NULL;
}
}
void CBitmapEx::Create(long width, long height)
{
// Deinit members
if (m_lpData != NULL)
{
free(m_lpData);
m_lpData = NULL;
}
// Format BITMAPINFOHEADER info
m_iBpp = _BITS_PER_PIXEL_32 >> 3;
memset(&m_bih, 0, sizeof(BITMAPINFOHEADER));
m_bih.biSize = sizeof(BITMAPINFOHEADER);
m_bih.biWidth = max(0, width);
m_bih.biHeight = max(0, height);
m_bih.biPlanes = 1;
m_bih.biBitCount = (WORD)(m_iBpp << 3);
m_iPaletteEntries = 0;
m_iPitch = m_bih.biWidth * m_iBpp;
m_dwSize = m_iPitch * m_bih.biHeight;
m_lpData = (LPBYTE)malloc(m_dwSize*sizeof(BYTE));
// Format BITMAPFILEHEADER info
memset(&m_bfh, 0, sizeof(BITMAPFILEHEADER));
m_bfh.bfType = 'MB';
m_bfh.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + m_dwSize;
m_bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
}
void CBitmapEx::Create(CBitmapEx& bitmapEx)
{
// Check for valid bitmap
if (bitmapEx.IsValid())
{
// Deinit members
if (m_lpData != NULL)
{
free(m_lpData);
m_lpData = NULL;
}
// Calculate bitmap params
m_iBpp = bitmapEx.GetBpp();
m_iPitch = bitmapEx.GetPitch();
memcpy(&m_bfh, bitmapEx.GetFileInfo(), sizeof(BITMAPFILEHEADER));
memcpy(&m_bih, bitmapEx.GetInfo(), sizeof(BITMAPINFOHEADER));
m_dwSize = bitmapEx.GetSize();
m_lpData = (LPBYTE)malloc(m_dwSize*sizeof(BYTE));
memcpy(m_lpData, bitmapEx.GetData(), m_dwSize*sizeof(BYTE));
m_iPaletteEntries = bitmapEx.GetPaletteEntries();
memcpy(m_lpPalette, bitmapEx.GetPalette(), m_iPaletteEntries*sizeof(RGBQUAD));
m_ResampleMode = bitmapEx.GetResampleMode();
}
}
void CBitmapEx::Load(LPTSTR lpszBitmapFile)
{
// Check for valid .BMP file path
if (lpszBitmapFile != NULL)
{
// Open .BMP file
FILE* file = _tfopen(lpszBitmapFile, _T("rb"));
if (file != NULL)
{
// Deinit members
if (m_lpData != NULL)
{
free(m_lpData);
m_lpData = NULL;
}
// Read BITMAPFILEHEADER info
fread(&m_bfh, 1, sizeof(BITMAPFILEHEADER), file);
// Read BITMAPINFOHEADER info
fread(&m_bih, 1, sizeof(BITMAPINFOHEADER), file);
// Calculate pitch
m_iBpp = m_bih.biBitCount >> 3;
m_iPitch = m_iBpp * m_bih.biWidth;
while ((m_iPitch & 3) != 0)
m_iPitch++;
// Check for bit-depth (8, 16, 24 and 32bpp only)
if (m_bih.biBitCount >= 8)
{
if (m_bih.biBitCount == 8)
{
// Calculate palette entries
m_iPaletteEntries = m_bih.biClrUsed;
if (m_iPaletteEntries == 0)
m_iPaletteEntries = 256;
// Read palette info
fread(m_lpPalette, m_iPaletteEntries, sizeof(RGBQUAD), file);
}
// Read image data
m_dwSize = m_iPitch * m_bih.biHeight;
m_lpData = (LPBYTE)malloc(m_dwSize*sizeof(BYTE));
fread(m_lpData, m_dwSize, sizeof(BYTE), file);
// Convert to 32bpp bitmap
_ConvertTo32Bpp();
}
// Close .BMP file
fclose(file);
}
}
}
void CBitmapEx::Load(LPBYTE lpBitmapData)
{
// Check for valid bitmap data buffer
if (lpBitmapData != NULL)
{
// Deinit members
if (m_lpData != NULL)
{
free(m_lpData);
m_lpData = NULL;
}
// Read BITMAPFILEHEADER info
memcpy(&m_bfh, lpBitmapData, sizeof(BITMAPFILEHEADER));
// Read BITMAPINFOHEADER info
memcpy(&m_bih, lpBitmapData+sizeof(BITMAPFILEHEADER), sizeof(BITMAPINFOHEADER));
// Calculate pitch
m_iBpp = m_bih.biBitCount >> 3;
m_iPitch = m_iBpp * m_bih.biWidth;
while ((m_iPitch & 3) != 0)
m_iPitch++;
// Check for bit-depth (8, 16, 24 and 32bpp only)
if (m_bih.biBitCount >= 8)
{
if (m_bih.biBitCount == 8)
{
// Calculate palette entries
m_iPaletteEntries = m_bih.biClrUsed;
if (m_iPaletteEntries == 0)
m_iPaletteEntries = 256;
// Read palette info
memcpy(m_lpPalette, lpBitmapData+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER), m_iPaletteEntries*sizeof(RGBQUAD));
}
// Read image data
m_dwSize = m_iPitch * m_bih.biHeight;
m_lpData = (LPBYTE)malloc(m_dwSize*sizeof(BYTE));
memcpy(m_lpData, lpBitmapData+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+m_iPaletteEntries*sizeof(RGBQUAD), m_dwSize*sizeof(BYTE));
// Convert to 32bpp bitmap
_ConvertTo32Bpp();
}
}
}
void CBitmapEx::Save(LPTSTR lpszBitmapFile)
{
// Check for valid .BMP file path
if (lpszBitmapFile != NULL)
{
// Convert to 24bpp bitmap
_ConvertTo24Bpp();
// Open .BMP file
FILE* file = _tfopen(lpszBitmapFile, _T("wb"));
if (file != NULL)
{
// Write BITMAPFILEHEADER info
fwrite(&m_bfh, 1, sizeof(BITMAPFILEHEADER), file);
// Write BITMAPINFOHEADER info
fwrite(&m_bih, 1, sizeof(BITMAPINFOHEADER), file);
// Check for palettized bitmap
if (m_bih.biBitCount == 8)
{
// Write palette info
fwrite(m_lpPalette, m_iPaletteEntries, sizeof(RGBQUAD), file);
}
// Write image data
fwrite(m_lpData, m_dwSize, sizeof(BYTE), file);
// Close .BMP file
fclose(file);
}
// Convert to 32bpp bitmap
_ConvertTo32Bpp();
}
}
void CBitmapEx::Save(LPBYTE lpBitmapData)
{
// Check for valid bitmap data buffer
if (lpBitmapData != NULL)
{
// Convert to 24bpp bitmap
_ConvertTo24Bpp();
// Write BITMAPFILEHEADER info
memcpy(lpBitmapData, &m_bfh, sizeof(BITMAPFILEHEADER));
// Write BITMAPINFOHEADER info
memcpy(lpBitmapData+sizeof(BITMAPFILEHEADER), &m_bih, sizeof(BITMAPINFOHEADER));
// Check for palettized bitmap
if (m_bih.biBitCount == 8)
{
// Write palette info
memcpy(lpBitmapData+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER), m_lpPalette, m_iPaletteEntries*sizeof(RGBQUAD));
}
// Write image data
memcpy(lpBitmapData+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+m_iPaletteEntries*sizeof(RGBQUAD), m_lpData, m_dwSize*sizeof(BYTE));
// Convert to 32bpp bitmap
_ConvertTo32Bpp();
}
}
void CBitmapEx::_ConvertTo32Bpp()
{
// Check for valid bitmap
if (IsValid())
{
// Calculate new params
long _bpp = (_BITS_PER_PIXEL_32 >> 3);
long _pitch = m_bih.biWidth * _bpp;
// Create temporary bitmap
DWORD dwSize = _pitch * m_bih.biHeight;
LPBYTE lpData = (LPBYTE)malloc(dwSize*sizeof(BYTE));
// Convert bitmap
DWORD dwDstHorizontalOffset;
DWORD dwDstVerticalOffset = 0;
DWORD dwDstTotalOffset;
LPDWORD lpDstData = (LPDWORD)lpData;
DWORD dwSrcHorizontalOffset;
DWORD dwSrcVerticalOffset = 0;
DWORD dwSrcTotalOffset;
for (long i=0; i<m_bih.biHeight; i++)
{
dwDstHorizontalOffset = 0;
dwSrcHorizontalOffset = 0;
for (long j=0; j<m_bih.biWidth; j++)
{
// Update destination total offset
dwDstTotalOffset = dwDstVerticalOffset + dwDstHorizontalOffset;
// Update source total offset
dwSrcTotalOffset = dwSrcVerticalOffset + dwSrcHorizontalOffset;
// Update bitmap
switch (m_bih.biBitCount)
{
case 8:
{
BYTE red = m_lpPalette[m_lpData[dwSrcTotalOffset]].rgbRed;
BYTE green = m_lpPalette[m_lpData[dwSrcTotalOffset]].rgbGreen;
BYTE blue = m_lpPalette[m_lpData[dwSrcTotalOffset]].rgbBlue;
lpDstData[dwDstTotalOffset>>2] = _RGB(red, green, blue);
}
break;
CBitmapEx,一个非常好用的位图操作类
5星 · 超过95%的资源 需积分: 10 176 浏览量
2008-10-21
12:15:37
上传
评论
收藏 24KB ZIP 举报
wgxwgx
- 粉丝: 3
- 资源: 12
最新资源
- 2023-04-06-项目笔记 - 第一百十五阶段 - 4.4.2.113全局变量的作用域-113 -2024.04.26
- 2023-04-06-项目笔记 - 第一百十五阶段 - 4.4.2.113全局变量的作用域-113 -2024.04.26
- htmlzwbjq_downyi.com.zip
- 无头单向非循环链表的实现(Test.c)
- 无头单向非循环链表的实现(SList.c)
- 浏览器重定向插件更新文件
- SSA-BP麻雀算法优化BP神经网络多特征分类预测(Matlab实现完整源码和数据)
- 粒子群算法优化BP神经网络PSO-BP的MATLAB代码(数值预测)
- 基于Springboot的一起看书平台.zip
- 无头单向非循环链表的实现(SList.h)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈