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

📄 bmpcoder.cpp

📁 很珍贵得视频编辑器原码及CODEC。需要安装下列CODEC.可播放多种格式的视频
💻 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 + -