📄 imgmatrix.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 + -