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

📄 imgmatrix.cpp

📁 vc++实现简单图像编辑器。。。。。。。。。
💻 CPP
字号:
// ImgMatrix.cpp: implementation of the CImgMatrix class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "ViewDIB.h"
#include "ImgMatrix.h"


#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CImgMatrix::CImgMatrix()
{
	

					
}

CImgMatrix::~CImgMatrix()
{
	
}

BOOL CImgMatrix::Create(CDib *Dib)
{
	WaitCursorBegin();
	dwWidth =Dib->GetWidth();
	dwHeight =Dib->GetHeight();
    
    LPBYTE lpDIB=(LPBYTE)GlobalLock(Dib->m_hDib );
	if (!lpDIB)
		return FALSE;
	//bits position
	LPBYTE lpDataBits=FindDIBBits(lpDIB);
	LPBYTE lpMapBits=lpDIB+sizeof(LPBITMAPINFOHEADER);
	wNumColors=DIBNumColors(lpDIB);
	wBitCounts=((LPBITMAPINFOHEADER)lpDIB)->biBitCount;
	DWORD i,j,k;
	
	//begin build palette matrix
	if(wBitCounts!=24)
	{
	for(i=0;i<wNumColors;i++)
		for(j=0;j<3;j++)
			{
				map [i][j]=*lpMapBits++;				
			}
	}
	//begin to build bitmap matrix
	BYTE btValue;
	DWORD dwLeft;
	switch (wBitCounts)
	{
	case 1:
		imgRed.SetSize (dwWidth*dwHeight);
		dwLeft=4-dwWidth%4;		
		if (dwLeft==4)
			dwLeft=0;
		lpDataBits--;
		for (i=dwHeight;i>0;i--)
		{
			for(j=0;j<dwWidth;j++)
			{
				if(j%8==0)
					lpDataBits++;
                btValue=*lpDataBits;
				btValue=btValue>>(7-j%8);
				btValue&=1;
				imgRed[(i-1)*dwWidth+j]=btValue;
			}
			for (k=0;k<dwLeft;k++)
				lpDataBits++;
		}

		break;
    case 4:
		imgRed.SetSize (dwWidth*dwHeight);
		dwLeft=4-dwWidth%4;	
		if (dwLeft==4)
			dwLeft=0;
		lpDataBits--;
		for (i=dwHeight;i>0;i--)
		{
			for(j=0;j<dwWidth;j++)
			{
				if(j%2==0)
					lpDataBits++;
                btValue=*lpDataBits;
				btValue=btValue>>(4-j%2*4);
				btValue&=15;
				imgRed[(i-1)*dwWidth+j]=btValue;
			}
			for (k=0;k<dwLeft;k++)
				lpDataBits++;

		}
		break;
	case 8:
		imgRed.SetSize (dwWidth*dwHeight);
		dwLeft=4-dwWidth%4;// fill out the 4 multiple		
		if (dwLeft==4)
			dwLeft=0;
		for (i=dwHeight;i>0;i--)
		{
			for(j=0;j<dwWidth;j++)
				imgRed[(i-1)*dwWidth+j]=*lpDataBits++;
			for(k=0;k<dwLeft;k++)
				lpDataBits++;
		}
		break;
	case 24:
		imgRed.SetSize (dwWidth*dwHeight);
		imgGreen.SetSize (dwWidth*dwHeight);
		imgBlue.SetSize (dwWidth*dwHeight);

		dwLeft=4-(dwWidth*3)%4;// fill out the 4 multiple		
		if (dwLeft==4)
			dwLeft=0;
		for (i=dwHeight;i>0;i--)
		{
			for(j=0;j<dwWidth;j++)
			{
				imgRed[(i-1)*dwWidth+j]=*lpDataBits++;
				imgGreen[(i-1)*dwWidth+j]=*lpDataBits++;
				imgBlue[(i-1)*dwWidth+j]=*lpDataBits++;
			}
			for(k=0;k<dwLeft;k++)
				lpDataBits++;
		}
		break;
	}//end of switch
	WaitCursorEnd();
	return TRUE;
}

CDib* CImgMatrix::ChangeToDIB()
{
	CDib * Dib=new CDib;

	WaitCursorBegin();
	
	DWORD dwDataLength=sizeof(BITMAPINFOHEADER)+
		wNumColors*sizeof(RGBQUAD)+
		WIDTHBYTES(wBitCounts *dwWidth)*dwHeight;
	HDIB hNewDib=GlobalAlloc(GHND,dwDataLength);
	if(!hNewDib)
	{
		WaitCursorEnd();
		return NULL;
	}

	//newDIB buffer
	LPBYTE lpDIB=(LPBYTE) GlobalLock(hNewDib);
	//initialize bitmapinfoheader
	LPBITMAPINFOHEADER bi=(LPBITMAPINFOHEADER)lpDIB;
	bi->biWidth =dwWidth;//fill in width from parameter
	bi->biHeight =dwHeight;//fill in height from parameter
	bi->biPlanes =1;//must be 1
	bi->biBitCount =wBitCounts;//from parameter
	bi->biCompression =BI_RGB;
	bi->biSizeImage =0;//0 means default
	bi->biXPelsPerMeter =0;
	bi->biYPelsPerMeter =0;
	bi->biClrUsed =0;
	bi->biClrImportant =0;

	
	//new bits position
	LPBYTE lpMapBits=lpDIB+sizeof(BITMAPINFOHEADER);
	LPBYTE lpDataBits=FindDIBBits(lpDIB);
	//transform bits
	DWORD i,j,k;
	DWORD dwLeft;
	switch(wBitCounts)
	{
	case 1:
	
		break;
	case 4:
		
		break;
	case 8:
		//begin map 
		for(i=0;i<256;i++)
		for(j=0;j<3;j++)
			{
				*lpMapBits++=map [i][j];				
			}
		//begin data
		dwLeft=4-dwWidth%4;// fill out the 4 multiple		
		if (dwLeft==4)
			dwLeft=0;
		for (i=dwHeight;i>0;i--)
		{
			for(j=0;j<dwWidth;j++)
				*lpDataBits++=imgRed[(i-1)*dwWidth+j];
			for(k=0;k<dwLeft;k++)
				*lpDataBits++=0;
		}
		
		break;
	case 24:
		
		break;
	}//end of switch
	//clean up
	GlobalUnlock(hNewDib);
    if (!Dib->Create (lpDIB))
	{
		WaitCursorEnd();
		return NULL;
	}
	WaitCursorEnd();
	return Dib;
    
	

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -