📄 dib.cpp
字号:
Is empty?
parameter: void
return: BOOL
******************************************************/
HDIB CDib::GetHandle()
{
return m_hDib;
}
/******************************************************
Get COLORREF of specified pixel
parameter: LONG(x), LONG(y)
return: COLORREF
******************************************************/
COLORREF CDib::GetPixel(LONG x, LONG y)
{
COLORREF cColor;
switch(GetBitCount())
{
case 1:
if(1<<(7-x%8)&*(BYTE*)(GetBitsPtr()+GetPixelOffset(x,y)))
cColor=RGB(255,255,255);
else
cColor=RGB(0,0,0);
break;
case 4:
{
PALETTEENTRY PaletteColors[16];
m_pPalette->GetPaletteEntries(0,16,PaletteColors);
int nIndex;
nIndex=(*(BYTE*)(GetBitsPtr()+GetPixelOffset(x,y))&
(x%2?0x0f:0xf0))>>(x%2?0:4);
cColor=RGB(PaletteColors[nIndex].peRed,
PaletteColors[nIndex].peGreen,
PaletteColors[nIndex].peBlue);
}
break;
case 8:
{
PALETTEENTRY PaletteColors[256];
m_pPalette->GetPaletteEntries(0,256,PaletteColors);
int nIndex;
nIndex=*(BYTE*)(GetBitsPtr()+GetPixelOffset(x,y));
cColor=RGB(PaletteColors[nIndex].peRed,
PaletteColors[nIndex].peGreen,
PaletteColors[nIndex].peBlue);
}
break;
default:
cColor=RGB(*(BYTE*)(GetBitsPtr()+GetPixelOffset(x,y)),
*(BYTE*)(GetBitsPtr()+GetPixelOffset(x,y)+1),
*(BYTE*)(GetBitsPtr()+GetPixelOffset(x,y)+2));
break;
}
return cColor;
}
/******************************************************
Get the offset of specified pixel of DIB
parameter: LONG(x), LONG(y)
return: LONG
******************************************************/
LONG CDib::GetPixelOffset(LONG x, LONG y)
{
int BitCount = GetBitCount();
return (GetHeight()-y-1)*GetWidthBytes()+x*BitCount/8;
}
/******************************************************
Get the Compression of DIB
parameter: void
return: DWORD
******************************************************/
DWORD CDib::GetCompression()
{
LPBITMAPINFOHEADER lpbi;
lpbi = (LPBITMAPINFOHEADER)GlobalLock(m_hDib);
DWORD comp;
comp = lpbi->biCompression;
GlobalUnlock(m_hDib);
return comp;
}
/******************************************************
Get the BitCount of DIB
parameter: void
return: WORD
******************************************************/
WORD CDib::GetBitCount()
{
return DIBBitCount(m_hDib);
}
/******************************************************
Get the width of DIB
parameter: void
return: LONG
******************************************************/
LONG CDib::GetWidth()
{
return DIBWidth(m_hDib);
}
/******************************************************
Get the height of DIB
parameter: void
return: LONG
******************************************************/
LONG CDib::GetHeight()
{
return DIBHeight(m_hDib);
}
/******************************************************
Get the XPelsPerMeter of DIB
parameter: void
return: long
******************************************************/
long CDib::GetXPelsPerMeter()
{
return XPelsPerMeter(m_hDib);
}
/******************************************************
Get the XPelsPerMeter of DIB
parameter: void
return: long
******************************************************/
long CDib::GetYPelsPerMeter()
{
return YPelsPerMeter(m_hDib);
}
/******************************************************
Get the bytes per line of DIB
parameter: void
return: LONG
******************************************************/
LONG CDib::GetWidthBytes()
{
return BytesPerLine(m_hDib);
}
/******************************************************
Get the ColorsNumber of DIB
parameter: void
return: WORD
******************************************************/
WORD CDib::GetColorNumber()
{
return DIBNumColors(m_hDib);
}
/******************************************************
Get the size of palette of DIB
parameter: void
return: WORD
******************************************************/
WORD CDib::GetPaletteSize()
{
return PaletteSize(m_hDib);
}
/******************************************************
Get the Bitmap of DIB
parameter: void
return: CBitmap*
******************************************************/
CBitmap* CDib::GetBitmap()
{
return m_pBitmap;
}
/******************************************************
Get the Palette of DIB
parameter: void
return: CPalette*
******************************************************/
CPalette* CDib::GetPalette()
{
return m_pPalette;
}
/******************************************************
Get the offset of data block of DIB
parameter: void
return: LPBYTE
******************************************************/
LPBYTE CDib::GetBitsPtr()
{
LPBYTE lpbi;
lpbi = (LPBYTE)GlobalLock(m_hDib);
LPBYTE lpbits;
lpbits = (LPBYTE)FindDIBBits(lpbi);
GlobalUnlock(m_hDib);
return lpbits;
}
/******************************************************
Convert DIB's format to specified one
parameter: WORD(BitCount)
return: BOOL
******************************************************/
BOOL CDib::ConvertFormat(WORD wBitCount)
{
if(IsEmpty())
return FALSE;
if(GetBitCount() == wBitCount)
return TRUE;
HDIB hNewDib = ConvertDIBFormat(m_hDib, wBitCount, NULL);
if(!hNewDib)
return FALSE;
Destroy();
m_hDib = hNewDib;
return UpdateInternal();
}
/******************************************************
Display a DIB
parameter: CDC*, int(x), int(y), DWORD(SRCCOPY)
return: BOOL
******************************************************/
BOOL CDib::Display(CDC * pDC, int x, int y, DWORD dwRop)
{
CDC MemDC;
MemDC.CreateCompatibleDC(pDC);
CBitmap* pOldmap = MemDC.SelectObject(m_pBitmap);
CPalette* pOldPal = pDC->SelectPalette(m_pPalette, TRUE);
pDC->RealizePalette();
BOOL bSuccess = pDC->BitBlt(x,
y,
GetWidth(),
GetHeight(),
&MemDC,
0,
0,
dwRop);
MemDC.SelectObject(pOldmap);
pDC->SelectPalette(pOldPal, TRUE);
return bSuccess;
}
/******************************************************
Display a DIB
parameter: CDC,int(xDest), int(yDest),
int(Width), int(Height),
int(xSrc), int(ySrc),
DWORD(SRCCOPY);
return: BOOL
******************************************************/
BOOL CDib::Display(CDC * pDC, int xdest, int ydest, int nwidthdest, int nheightdest,
int xscr, int yscr, DWORD dwRop)
{
CDC MemDC;
MemDC.CreateCompatibleDC(pDC);
CBitmap* pOldmap = MemDC.SelectObject(m_pBitmap);
CPalette* pOldPal = pDC->SelectPalette(m_pPalette, TRUE);
pDC->RealizePalette();
BOOL bSuccess = pDC->BitBlt(xdest,
ydest,
nwidthdest,
nheightdest,
&MemDC,
xscr,
yscr,
dwRop);
MemDC.SelectObject(pOldmap);
pDC->SelectPalette(pOldPal, TRUE);
return bSuccess;
}
/******************************************************
Display a DIB
parameter: CDC, int(xDest), int(yDest),
int(WidthDest), int(HeightDest),
int(xSrc), int(ySrc),
int(WidthSrc), int(HeightSrc),
DWORD(SRCCOPY)
return: BOOL
******************************************************/
BOOL CDib::Display(CDC * pDC, int xdest, int ydest, int nwidthdest, int nheightdest,
int xscr, int yscr, int nwidthscr, int nheightscr, DWORD dwRop)
{
CDC MemDC;
MemDC.CreateCompatibleDC(pDC);
CBitmap* pOldmap = MemDC.SelectObject(m_pBitmap);
CPalette* pOldPal = pDC->SelectPalette(m_pPalette,TRUE);
pDC->RealizePalette();
BOOL bSuccess = pDC->StretchBlt(xdest,
ydest,
nwidthdest,
nheightdest,
&MemDC,
xscr,
yscr,
nwidthscr,
nheightscr,
dwRop);
MemDC.SelectObject(pOldmap);
pDC->SelectPalette(pOldPal, TRUE);
return bSuccess;
}
/******************************************************
Display a DIB
parameter: CDC, CRect(Dest), CRect(Src),
DWORD(SRCCOPY)
return: BOOL
******************************************************/
BOOL CDib::Display(CDC* pDC, CRect rcDest, CRect rcScr, DWORD dwRop)
{
CDC MemDC;
MemDC.CreateCompatibleDC(pDC);
CBitmap* pOldmap = MemDC.SelectObject(m_pBitmap);
CPalette* pOldPal = pDC->SelectPalette(m_pPalette, TRUE);
pDC->RealizePalette();
BOOL bSuccess = pDC->StretchBlt(rcDest.left,
rcDest.top,
rcDest.Width(),
rcDest.Height(),
&MemDC,
rcScr.left,
rcScr.top,
rcScr.Width(),
rcScr.Height(),
dwRop);
MemDC.SelectObject(pOldmap);
pDC->SelectPalette(pOldPal, TRUE);
return bSuccess;
}
/******************************************************
Display the palette
parameter: CDC, CRect
return: BOOL
******************************************************/
BOOL CDib::DisplayPal(CDC * pDC,CRect rc)
{
return DisplayPalette(pDC->GetSafeHdc(), (LPRECT)&rc, (HPALETTE)m_pPalette->GetSafeHandle());
}
/******************************************************
Do some preparing work before paint DIB
parameter: CDC*
return: CDC
******************************************************/
CDC* CDib::BeginPaint(CDC* pDC)
{
m_pMemDC = new CDC;
m_pMemDC->CreateCompatibleDC(pDC);
m_pPaletteTmp = m_pMemDC->SelectPalette(m_pPalette,TRUE);
m_pMemDC->RealizePalette();
m_pBitmapTmp = (CBitmap*)m_pMemDC->SelectObject(m_pBitmap);
return m_pMemDC;
}
/******************************************************
Do some end work after paint DIB
parameter: void
return: void
******************************************************/
void CDib::EndPaint()
{
m_pMemDC->SelectObject(m_pBitmapTmp);
m_pMemDC->SelectPalette(m_pPaletteTmp, TRUE);
delete m_pMemDC;
Create(m_hBitmap);
}
/*************************************************
Rotate current DIB 180 degree counter-clockwise.
parameter: void
return: BOOL
*************************************************/
BOOL CDib::Rotate180()
{
HDIB h = RotateDIB(m_hDib);
if(!h)
return FALSE;
HDIB hNewDib = RotateDIB(h);
DestroyDIB(h);
if(!hNewDib)
return FALSE;
Destroy();
m_hDib = hNewDib;
return UpdateInternal();
}
/*************************************************
Rotate current DIB 90 degree counter-clockwise.
parameter: void
return: BOOL
*************************************************/
BOOL CDib::Rotate90()
{
HDIB hNewDib = RotateDIB(m_hDib);
if(!hNewDib)
return FALSE;
Destroy();
m_hDib = hNewDib;
return UpdateInternal();
}
/*************************************************
Rotate current DIB 270 degree counter-clockwise.
parameter: void
return: BOOL
*************************************************/
BOOL CDib::Rotate270()
{
HDIB h1 = RotateDIB(m_hDib);
if(!h1)
return FALSE;
HDIB h2 = RotateDIB(h1);
DestroyDIB(h1);
if(!h2)
return FALSE;
HDIB hNewDib = RotateDIB(h2);
DestroyDIB(h2);
if(!hNewDib)
return FALSE;
Destroy();
m_hDib = hNewDib;
return UpdateInternal();
}
/*************************************************
Flip DIB horzonly.
parameter: void
return: BOOL
*************************************************/
BOOL CDib::FlipHorz()
{
HDIB hNewDib = FlipHorzDIB(m_hDib);
if(!hNewDib)
return FALSE;
Destroy();
m_hDib = hNewDib;
return UpdateInternal();
}
/*************************************************
Flip DIB vertically.
parameter: void
return: BOOL
*************************************************/
BOOL CDib::FlipVert()
{
Rotate90();
FlipHorz();
Rotate270();
return UpdateInternal();
}
/*************************************************
自身差值
parameter: void
return: BOOL
*************************************************/
BOOL CDib::SelfDiff()
{
HDIB hNewDib = SelfDiffDIB(m_hDib);
if(!hNewDib)
return FALSE;
Destroy();
m_hDib = hNewDib;
return UpdateInternal();
}
/*************************************************
反色
parameter: void
return: BOOL
*************************************************/
BOOL CDib::RevertColor()
{
HDIB hNewDib = RevertColorDIB(m_hDib);
if(!hNewDib)
return FALSE;
Destroy();
m_hDib = hNewDib;
return UpdateInternal();
}
/*************************************************
去色
parameter: void
return: BOOL
*************************************************/
BOOL CDib::ColorToGray()
{
HDIB hNewDib = ColorDIBToGrayDIB(m_hDib);
if(!hNewDib)
return FALSE;
Destroy();
m_hDib = hNewDib;
return UpdateInternal();
}
/**********************************************************
rotate the current DIB specified degree counter-clockwise
parameter: void
return: BOOL
**********************************************************/
BOOL CDib::RotateCertainAngle(int angle)
{
HDIB hNewDib = RotateCertainAngleDIB(m_hDib, angle);
if(!hNewDib)
return FALSE;
Destroy();
m_hDib = hNewDib;
return UpdateInternal();
}
/*************************************************
自适应选取阈值并二值化
parameter: void
return: BOOL
*************************************************/
BOOL CDib::AutoBinary()
{
HDIB hNewDib = AutoBinaryDIB(m_hDib);
if(!hNewDib)
return FALSE;
Destroy();
m_hDib = hNewDib;
return UpdateInternal();
}
/*************************************************
直方图均衡化
parameter: void
return: BOOL
*************************************************/
BOOL CDib::HistoEquivalize()
{
HDIB hNewDib = HistoEquivalizeDIB(m_hDib);
if(!hNewDib)
return FALSE;
Destroy();
m_hDib = hNewDib;
return UpdateInternal();
}
/*************************************************
伪彩色处理
parameter: void
return: BOOL
*************************************************/
BOOL CDib::PseudoColor()
{
HDIB hNewDib = PseudoColorDIB(m_hDib);
if(!hNewDib)
return FALSE;
Destroy();
m_hDib = hNewDib;
return UpdateInternal();
}
/*************************************************
调整亮度
parameter: int(increment of brightness)
return: BOOL
*************************************************/
BOOL CDib::ChangeBrightness(int v)
{
HDIB hNewDib = AdjustDIBBrightness(m_hDib, v);
if(!hNewDib)
return FALSE;
Destroy();
m_hDib = hNewDib;
return UpdateInternal();
}
/*************************************************
调整对比度
parameter: double(coefficient)
return: BOOL
*************************************************/
BOOL CDib::ChangeContrast(double v)
{
HDIB hNewDib = AdjustDIBContrast(m_hDib, v);
if(!hNewDib)
return FALSE;
Destroy();
m_hDib = hNewDib;
return UpdateInternal();
}
/*************************************************
'Ln' transformation
parameter: void
return: BOOL
*************************************************/
BOOL CDib::LnTrans()
{
HDIB hNewDib = LnTransDIB(m_hDib);
if(!hNewDib)
return FALSE;
Destroy();
m_hDib = hNewDib;
return UpdateInternal();
}
/*************************************************
'Log' transformation
parameter: void
return: BOOL
*************************************************/
BOOL CDib::LogTrans()
{
HDIB hNewDib = LogTransDIB(m_hDib);
if(!hNewDib)
return FALSE;
Destroy();
m_hDib = hNewDib;
return UpdateInternal();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -