📄 bmpcoder.cpp
字号:
// BmpCoder.cpp: implementation of the CBmpCoder class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Image.h"
#include "BmpCoder.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
#define DEFAULTLEN 80
#define DIB_HEADER_MARKER ((WORD)('M'<<8) | 'B')
#define PALVERSION 0x300
#define IS_WIN30_DIB(lpbi) ((*(LPDWORD)(lpbi)) == sizeof(BITMAPINFOHEADER))
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CBmpCoder::CBmpCoder( CImage* pImage )
{
m_pImage = pImage;
}
CBmpCoder::~CBmpCoder()
{
}
BOOL CBmpCoder::DoDecode()
{
BITMAPFILEHEADER bmpHeader; //bmp file header
HFILE bmpFile;
// BMP拳老阑 open
bmpFile = _lopen( (LPSTR)(LPCTSTR)m_pImage->m_strPathname , OF_READ|OF_SHARE_COMPAT );
if( bmpFile < 0 )
{
m_pImage->m_strError = "File not found.";
return FALSE;
}
//bmpHeder 备炼眉俊 BMPHEADER 庆歹 沥焊甫 佬绢 柯促.
if( _lread( bmpFile, (LPSTR)&bmpHeader, sizeof(bmpHeader) ) != sizeof( bmpHeader ) )
{
m_pImage->m_strError = "BMPHEADER read Error.";
_lclose( bmpFile );
return FALSE;
}
//拳老捞 bmp 老版快俊绰 拳老 贸澜俊 "BM"捞扼绊 汲沥秦乐澜.
if ( bmpHeader.bfType != DIB_HEADER_MARKER )
{
m_pImage->m_strError = "Invalid BMP file.";
_lclose( bmpFile );
return FALSE;
}
BITMAPINFOHEADER bmpInfoHeader;
if( _lread(bmpFile,&bmpInfoHeader, sizeof(bmpInfoHeader)) != sizeof(bmpInfoHeader) )
{
m_pImage->m_strError = "BmpInfoHeader read error.";
_lclose( bmpFile );
return FALSE;
}
if(!IS_WIN30_DIB(&bmpInfoHeader))
{
m_pImage->m_strError = "Unsupported DIB format.";
_lclose( bmpFile );
return FALSE;
}
m_nUsedColor = bmpInfoHeader.biClrUsed;
WORD wBitCount = bmpInfoHeader.biBitCount;
if( wBitCount != 24 && m_nUsedColor == 0 )
m_nUsedColor = 256;
m_ImageSize.cx = bmpInfoHeader.biWidth;
m_ImageSize.cy = bmpInfoHeader.biHeight;
BOOL res;
switch( wBitCount )
{
case 24:
res = Read24bit( bmpFile );
break;
case 8:
res = Read8bit( bmpFile );
break;
case 4:
res = Read4bit( bmpFile );
break;
case 1:
res = Read1bit( bmpFile );
break;
default:
res = FALSE;
break;
}
if( !res )
{
m_pImage->m_strError = "Not Supported File Format.";
_lclose( bmpFile );
return FALSE;
}
if( wBitCount != 24 )
m_pImage->CreatePalette();
return TRUE;
}
BOOL CBmpCoder::Read24bit( HFILE bmpFile )
{
if( !m_pImage->CreateImage( m_ImageSize, TRUERGB, 0 ) )
return FALSE;
LPSTR lpDib = (LPSTR)m_pImage->m_pDib;
DWORD datasize = m_pImage->m_dwLineLen * m_pImage->m_sizeImage.cy;
//捞固瘤 单捞鸥甫 佬绰促.
if( _lread( bmpFile, lpDib, datasize ) != datasize )
{
m_pImage->m_strError = "Can not read file.";
return FALSE;
}
m_pImage->m_nUsedColor = 0;
return TRUE;
}
BOOL CBmpCoder::Read8bit( HFILE bmpFile )
{
if( !m_pImage->CreateImage( m_ImageSize, INDEXED, 0 ) )
return FALSE;
LPSTR lpDib = (LPSTR)m_pImage->m_pDib;
m_pImage->m_nUsedColor = m_nUsedColor;
DWORD palsize = 4*m_nUsedColor;
DWORD datasize = m_pImage->m_dwLineLen * m_pImage->m_sizeImage.cy;
// read palette
if( _lread( bmpFile, lpDib-1024, palsize ) != palsize )
{
m_pImage->m_strError = "Can not read Palette Entry.";
return FALSE;
}
// read raw data
if( _lread( bmpFile, lpDib, datasize ) != datasize )
{
m_pImage->m_strError = "Can not read raw data.";
return FALSE;
}
m_pImage->m_nUsedColor = m_nUsedColor;
return TRUE;
}
BOOL CBmpCoder::Read4bit( HFILE bmpFile )
{
if( !m_pImage->CreateImage( m_ImageSize, INDEXED, 0 ) )
return FALSE;
LPSTR lpDib = (LPSTR)m_pImage->m_pDib;
DWORD palsize = 4*m_nUsedColor;
if( _lread( bmpFile, lpDib-1024, palsize ) != palsize )
{
m_pImage->m_strError = "Can not read Palette Entry.";
return FALSE;
}
BYTE* ptr;
CSize size = m_pImage->m_sizeImage;
DWORD linelen = (size.cx*4/8+3)&~3;
BYTE* pBuf = new BYTE[linelen];
for( int j = 0 ; j < size.cy ; j++ )
{
if( _lread( bmpFile, pBuf, linelen ) != linelen )
{
m_pImage->m_strError = "Can not read raw data.";
delete [] pBuf;
return FALSE;
}
ptr = m_pImage->m_PixelPtr[size.cy-j-1];
for( int i = 0 ; i < (int)linelen ; i++ )
{
*(ptr++) = (pBuf[i]&0xF0)>>4;
*(ptr++) = (pBuf[i]&0x0F);
}
}
delete [] pBuf;
m_pImage->CreatePalette();
return TRUE;
}
BOOL CBmpCoder::Read1bit( HFILE bmpFile )
{
if( !m_pImage->CreateImage( m_ImageSize, INDEXED, 0 ) )
return FALSE;
LPSTR lpDib = (LPSTR)m_pImage->m_pDib;
DWORD palsize = 4*m_nUsedColor;
if( _lread( bmpFile, lpDib-1024, palsize ) != palsize )
{
m_pImage->m_strError = "Can not read Palette Entry.";
return FALSE;
}
BYTE* ptr = m_pImage->m_pDib;
CSize size = m_pImage->m_sizeImage;
DWORD linelen = (size.cx/8+3)&~3;
BYTE* pBuf = new BYTE[linelen];
for( int j = 0 ; j < size.cy ; j++ )
{
if( _lread( bmpFile, pBuf, linelen ) != linelen )
{
m_pImage->m_strError = "Can not read raw data.";
delete [] pBuf;
return FALSE;
}
for( int i = 0 ; i < (int)linelen ; i++ )
{
*(ptr++) = (pBuf[i]&0x80)>>7;
*(ptr++) = (pBuf[i]&0x40)>>6;
*(ptr++) = (pBuf[i]&0x20)>>5;
*(ptr++) = (pBuf[i]&0x10)>>4;
*(ptr++) = (pBuf[i]&0x08)>>3;
*(ptr++) = (pBuf[i]&0x04)>>2;
*(ptr++) = (pBuf[i]&0x02)>>1;
*(ptr++) = (pBuf[i]&0x01);
}
}
delete [] pBuf;
m_pImage->CreatePalette();
return TRUE;
}
BOOL CBmpCoder::DoEncode()
{
if( m_pImage == NULL ) return FALSE;
int OffBits;
HFILE bmpFile;
BITMAPFILEHEADER bmpHeader; // Header for Bitmap file
if( m_pImage->m_nColorMode == INDEXED )
OffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + 1024;
else
OffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
DWORD dwSizeImage = m_pImage->m_dwLineLen * m_pImage->m_sizeImage.cy;
LPSTR pData = (LPSTR)m_pImage->m_pBuf;
bmpHeader.bfType = DIB_HEADER_MARKER; // "BM"
bmpHeader.bfSize = OffBits + dwSizeImage;
bmpHeader.bfReserved1 = 0;
bmpHeader.bfReserved2 = 0;
bmpHeader.bfOffBits = OffBits;
bmpFile = _lcreat( (LPSTR)(LPCTSTR)m_pImage->m_strPathname, 0 );
if( bmpFile < 0 )
{
m_pImage->m_strError = "File creation error.";
return FALSE;
}
UINT len;
len = _lwrite( bmpFile, (LPSTR)&bmpHeader, sizeof(BITMAPFILEHEADER) );
if( len != sizeof(BITMAPFILEHEADER) )
{
m_pImage->m_strError = "Header write Error.";
_lclose( bmpFile );
return FALSE;
}
len = _lwrite( bmpFile, (LPSTR)pData, bmpHeader.bfSize - sizeof(bmpHeader) );
if( len != bmpHeader.bfSize - sizeof(bmpHeader) )
{
m_pImage->m_strError = "Data write Error.";
_lclose( bmpFile );
return FALSE;
}
_lclose( bmpFile );
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -