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

📄 dib.cpp

📁 vc++实现简单图像编辑器。。。。。。。。。
💻 CPP
📖 第 1 页 / 共 4 页
字号:
		                       &MemDC,
							   xSrc,ySrc,
							   dwRop);
	MemDC.SelectObject (pOldBmp);
	pDC->SelectPalette (pOldPal,TRUE);
	return bSuccess;

}

BOOL CDib::Display(CDC *pDC, int xDest, int yDest, int nWidthDest, int nHeightDest, int xSrc, int ySrc, int nWidthSrc, int nHeightSrc, DWORD dwRop)
{
	CDC MemDC;
	//创建兼容的设备上下文,在此上下文中先处理
	MemDC.CreateCompatibleDC (pDC);
	//选择位图
	CBitmap*pOldBmp=MemDC.SelectObject (m_pBitmap);
	//选择调色板
	CPalette* pOldPal=pDC->SelectPalette (m_pPalette,TRUE);
	//实现调色板(将目前的逻辑调色板复制到系统调色板中)
	pDC->RealizePalette ();

	//两个设备上下文位对位的拷贝
	BOOL bSuccess=pDC->StretchBlt (xDest,yDest,
		                       nWidthDest,nHeightDest,
		                       &MemDC,
							   xSrc,ySrc,
							   nWidthSrc,nHeightSrc,
							   dwRop);
	//恢复兼容设备上下文的环境
	MemDC.SelectObject (pOldBmp);
	pDC->SelectPalette (pOldPal,TRUE);
	return bSuccess;


}

BOOL CDib::Display(CDC *pDC, int x, int y, DWORD dwRop)
{
	CDC MemDC;
	MemDC.CreateCompatibleDC (pDC);
	CBitmap*pOldBmp=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 (pOldBmp);
    pDC->SelectPalette (pOldPal,TRUE);
	
	return 1;
}

BOOL CDib::Display(CDC *pDC, CRect rcDest, CRect rcSrc, DWORD dwRop)
{
	CDC MemDC;
	MemDC.CreateCompatibleDC (pDC);
	CBitmap*pOldBmp=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,
							   rcSrc.left ,rcSrc.top ,
							    rcSrc.Width (),rcSrc.Height (),
							   dwRop);
	MemDC.SelectObject (pOldBmp);
	pDC->SelectPalette (pOldPal,TRUE);
	

	return bSuccess;


}

BOOL CDib::DisplayPalette(CDC *pDC, CRect rc)
{
	//获得当前上下文句柄
	HDC hDC=pDC->GetSafeHdc  ();
	//获得当前客户区域矩形
	LPRECT lpRect=LPRECT(rc); 
	//获得当前调色板句柄
	HPALETTE hPal=HPALETTE(*m_pPalette);
	return ::DisplayPalette(hDC,lpRect, hPal);
}

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;
}

void CDib::EndPaint()
{
	m_pMemDC->SelectObject (m_pBitmapTmp);
	m_pMemDC->SelectPalette (m_pPaletteTmp,TRUE);
	delete m_pMemDC;
	Create(m_hBitmap);

}
//update the DIB DIBSECTION
//建立位图(用于CDC的显示)
BOOL CDib::BuildBitmap()
{
	//如以前此变量不为空,清空(用于第二次打开图像)
    if(m_pBitmap!=NULL)
	{
		delete m_pBitmap;
		m_pBitmap=NULL;
		m_hBitmap=NULL;
	}
	//根据图像内存块,返回位图内存块句柄(成员变量)
	//调用DibAPI函数
	m_hBitmap=DIBToDIBSection(m_hDib);
	if(m_hBitmap==NULL)
		return FALSE;
	//根据位图内存块句柄,得到位图指针
	m_pBitmap=new CBitmap;
	m_pBitmap->Attach (m_hBitmap);
	return TRUE;

}
//update the DIB palette
//创建调色板
BOOL CDib::BuildPalette()
{
	//主要给成员变量m_pPalette赋值
	if(m_pPalette!=NULL)
	{
		delete m_pPalette;
		m_pPalette=NULL;
	}
	//根据图像内存块句柄,创建调色板数据块
	HPALETTE hPalette=CreateDIBPalette(m_hDib);

	//根据调色板数据块,生成调色板指针,赋给成员变量
	if(hPalette==NULL)
		return FALSE;
	//创建指针
	m_pPalette=new CPalette;
	//给指针附加内存块
	m_pPalette->Attach (hPalette);
	return TRUE;
}
//judge if DIB is NULL 
BOOL CDib::IsEmpty()
{
	if(m_hDib==NULL)
		return TRUE;
	if(!GlobalLock(m_hDib))
		return TRUE;
	GlobalUnlock(m_hDib);
	return FALSE;
}

DWORD CDib::GetCompression()
{
	LPBITMAPINFOHEADER lpDIB;
	lpDIB=(LPBITMAPINFOHEADER)GlobalLock(m_hDib);
	DWORD compress=lpDIB->biCompression ;
	GlobalUnlock(m_hDib);
	return compress;
	
}

WORD CDib::GetBitCount()
{
	return  DIBBitCount(m_hDib);
}

LONG CDib::GetWidth()
{
	return DIBWidth(m_hDib);

}

LONG CDib::GetHeight()
{
	return DIBHeight(m_hDib);

}

LONG CDib::GetWidthBytes()
{
	
	return WIDTHBYTES(GetWidth());
}

WORD CDib::GetColorNumber()
{
	return DIBNumColors(m_hDib);
}

WORD CDib::GetPaletteSize()
{
	return PaletteSize(m_hDib);
}

CBitmap* CDib::GetBitmap()
{
  return m_pBitmap;
}

CPalette* CDib::GetPalette()
{
	return m_pPalette;

}
// get DIB handle
HANDLE CDib::GetHandle()
{
	return m_hDib;

}

LPBYTE CDib::GetBitsPtr()
{
  LPBYTE lpDIB;
  lpDIB=(LPBYTE)GlobalLock(m_hDib);
  LPBYTE Ptr=FindDIBBits(lpDIB);
  GlobalUnlock(m_hDib);
  return Ptr;

}
//get the color value of given position
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=(*(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=(*(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;

}
//return the position in the data block  of the given point
LONG CDib::GetPixelOffset(LONG x, LONG y)
{
	return (GetHeight()-y-1)*GetWidthBytes()+x/(8/GetBitCount());

}
//convert the DIB format
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();
}
//update the palette and DIBSECTION and DDB
BOOL CDib::UpdateInternal()
{
	//创建调色板
	BuildPalette();
	//创建位图
	return BuildBitmap();

}
BOOL CDib::DisplayTransparent(CDC *pDC,int x,int y,
		         COLORREF cTransparentColor)
{
	CPalette *pOldPal=pDC->SelectPalette (m_pPalette,TRUE);
	pDC->RealizePalette ();

    HDC hdc=pDC->GetSafeHdc ();
	HBITMAP hBitmap=m_hBitmap;

	BITMAP bm;
	COLORREF cColor;
	HBITMAP bmAndObject,bmAndBack,bmAndMem,bmSave;
	HBITMAP bmObjectOld,bmBackOld,bmMemOld,bmSaveOld;
	HDC hdcMem,hdcBack,hdcObject,hdcTemp,hdcSave;
	POINT ptSize;

	hdcTemp=CreateCompatibleDC(hdc);
	SelectObject(hdcTemp,hBitmap);//select the bitmap

	GetObject(hBitmap,sizeof(BITMAP),(LPBYTE)&bm);
	ptSize.x=bm.bmWidth ;
	ptSize.y=bm.bmHeight ;
	DPtoLP(hdcTemp,&ptSize,1);//convert from device
	//to logical pointers
	//create some DCs to hold temporary data
	hdcBack=CreateCompatibleDC(hdc);
	hdcObject=CreateCompatibleDC(hdc);
	hdcMem=CreateCompatibleDC(hdc);
	hdcSave=CreateCompatibleDC(hdc);

	//crete a bitmap for each DC, DCs are required for a number of
	//GDI functions

	//monochrome DC

	bmAndBack=CreateBitmap(ptSize.x,ptSize.y,1,1,NULL);

	bmAndObject=CreateBitmap(ptSize.x,ptSize.y,1,1,NULL);
	bmAndMem=CreateCompatibleBitmap(hdc,ptSize.x,ptSize.y);
	bmSave=CreateCompatibleBitmap(hdc,ptSize.x,ptSize.y);

	//each DC must select a bitmap object to store pixel data

	bmBackOld=(HBITMAP)SelectObject(hdcBack,bmAndBack);
	bmObjectOld=(HBITMAP)SelectObject(hdcObject,bmAndObject);
	bmMemOld=(HBITMAP)SelectObject(hdcMem,bmAndMem);
	bmSaveOld=(HBITMAP)SelectObject(hdcSave,bmSave);
    
	//debug
	BitBlt(hdc,0,0,ptSize.x,ptSize.y,hdcBack,0,0,SRCCOPY);
    AfxMessageBox("The hdcBack Window here 0.1");
	//debug
	//debug
	BitBlt(hdc,0,0,ptSize.x,ptSize.y,hdcObject,0,0,SRCCOPY);
    AfxMessageBox("The hdcObject Window here 0.2");
	//debug
	//debug
	BitBlt(hdc,0,0,ptSize.x,ptSize.y,hdcMem,0,0,SRCCOPY);
    AfxMessageBox("The hdcMem Window here 0.3");
	//debug
	//debug
	BitBlt(hdc,0,0,ptSize.x,ptSize.y,hdcSave,0,0,SRCCOPY);
    AfxMessageBox("The hdcSave Window here 0.4");
	//debug

	//set proper mapping mode
	SetMapMode(hdcTemp,GetMapMode(hdc));

	//save the bitmap sent here, because it will be overwritten
	BitBlt(hdcSave,0,0,ptSize.x,ptSize.y,hdcTemp,0,0,SRCCOPY);

	//debug
	BitBlt(hdc,0,0,ptSize.x,ptSize.y,hdcSave,0,0,SRCCOPY);
    AfxMessageBox("The hdcSave Window here 1");
	//debug

 	//set the background color of the source DC to the color

	//contained in the parts of the bitmap that should be
	//transparent

	cColor=SetBkColor(hdcTemp,cTransparentColor);

	//create the object mask for the bitmap by performing a bitblt
	//from the source bitmap to a monochrome bitmap
	BitBlt(hdcObject,0,0,ptSize.x,ptSize.y,hdcTemp,0,0,SRCCOPY);

	//debug
	BitBlt(hdc,0,0,ptSize.x,ptSize.y,hdcObject,0,0,SRCCOPY);
    AfxMessageBox("The hdcObject Window here 2");
	//debug

	//set the background color of the source DC back to the original color
	SetBkColor(hdcTemp,cColor);
	//create the inverse of the object mask

	BitBlt(hdcBack,0,0,ptSize.x,ptSize.y,hdcObject,0,0,NOTSRCCOPY);

	//debug
	BitBlt(hdc,0,0,ptSize.x,ptSize.y,hdcBack,0,0,SRCCOPY);
    AfxMessageBox("The hdcBack Window here 3");
	//debug
	//copy the background of the main DC to the destination
	BitBlt(hdcMem,0,0,ptSize.x,ptSize.y,hdc,x,y,SRCCOPY);

	//debug
	BitBlt(hdc,0,0,ptSize.x,ptSize.y,hdcMem,0,0,SRCCOPY);
    AfxMessageBox("The hdcMem Window here 4");
	//debug
	//mask out the places where the bitmap will be placed

	BitBlt(hdcMem,0,0,ptSize.x,ptSize.y,hdcObject,0,0,SRCAND);

	//debug
	BitBlt(hdc,0,0,ptSize.x,ptSize.y,hdcMem,0,0,SRCCOPY);
    AfxMessageBox("The hdcMem Window here 5");
	//debug
	//MASK OUT THE TRANSPARENT COLORED PIXELS ONT HE BITMAP

	BitBlt(hdcTemp,0,0,ptSize.x,ptSize.y,hdcBack,0,0,SRCAND);
    //debug
	BitBlt(hdc,0,0,ptSize.x,ptSize.y,hdcTemp,0,0,SRCCOPY);
    AfxMessageBox("The hdcTemp Window here 6");
	//debug
	//XOR the birmap with the background on the destination DC
	BitBlt(hdcMem,0,0,ptSize.x,ptSize.y,hdcTemp,0,0,SRCPAINT);

	//debug
	BitBlt(hdc,0,0,ptSize.x,ptSize.y,hdcMem,0,0,SRCCOPY);
    AfxMessageBox("The hdcMem Window here 7");
	//debug
	
	//COPY THE DESTINATION TO THE SCREEN

	BitBlt(hdc,x,y,ptSize.x,ptSize.y,hdcMem,0,0,SRCCOPY);

	//place the original bitmap back into the bitmapsent here

	BitBlt(hdcTemp,0,0,ptSize.x,ptSize.y,hdcSave,0,0,SRCCOPY);

	//delete the memory bitmaps

	DeleteObject(SelectObject(hdcBack,bmBackOld));
	DeleteObject(SelectObject(hdcObject,bmObjectOld));
	DeleteObject(SelectObject(hdcMem,bmMemOld));
	DeleteObject(SelectObject(hdcSave,bmSaveOld));

	//delete the memory dcs

	DeleteDC(hdcMem);
	DeleteDC(hdcBack);
	DeleteDC(hdcObject);
	DeleteDC(hdcSave);
	DeleteDC(hdcTemp);

    pDC->SelectPalette (pOldPal,TRUE);
	return TRUE;
}
BOOL CDib::Display(int nEffect,CDC *pDC,int x,int y,int nDeta,
		         DWORD dwDelayTime,DWORD dwRop)
{
	if(nEffect==EFFECT_FADE)
		return DisplayFadeIn(pDC,x,y,nDeta,dwDelayTime);
	else if(nEffect==EFFECT_MOSIAC)
		return DisplayMosiacIn(pDC,x,y,nDeta,dwDelayTime,dwRop);

	CDC MemDC;
	MemDC.CreateCompatibleDC (pDC);
	CBitmap* pOldBmp=MemDC.SelectObject (m_pBitmap);
	CPalette* pOldPal=pDC->SelectPalette (m_pPalette,TRUE);
	pDC->RealizePalette ();
	long i=0;
	BOOL bDone=FALSE;
	while(!bDone)
	{

    switch(nEffect)
	{
   	case EFFECT_SCANDOWN:
		{ 
		if(i>GetHeight())
		{
			i=GetHeight();
			bDone=TRUE;
		}//end if 
		pDC->BitBlt (x,y+i,GetWidth(),nDeta,
			         &MemDC,0,i,dwRop);
		i+=nDeta;
		break;
		}//end of case EFFECT_SCANDOWN
	case EFFECT_SCANUP:
		{ 
		if(i>GetHeight())
		{
			i=GetHeight();
			bDone=TRUE;
		}//end if 
		pDC->BitBlt (x,y+GetHeight()-i,GetWidth(),nDeta,
			         &MemDC,0,GetHeight()-i,dwRop);
		i+=nDeta;
		break;
		}//end of case EFFECT_SCANDUP
	case EFFECT_SCANRIGHT:
		{ 
		if(i>GetWidth())
		{
			i=GetWidth();
			bDone=TRUE;
		}//end if 
		pDC->BitBlt (x+i,y,nDeta,GetHeight(),
			         &MemDC,i,0,dwRop);
		i+=nDeta;
		break;
		}//end of case EFFECT_SCANRIGHT
    case EFFECT_SCANLEFT:
		{ 
		if(i>GetWidth())
		{
			i=GetWidth();
			bDone=TRUE;
		}//end if 
		pDC->BitBlt (x+GetWidth()-i,y,nDeta,GetHeight(),
			         &MemDC,GetWidth()-i,0,dwRop);
		i+=nDeta;
		break;
		}//end of case EFFECT_SCANLEFT
	case EFFECT_VSPLITSCAN:
		{ 
		if(i>GetHeight()/2)
		{
			i=GetHeight()/2;
			bDone=TRUE;
		}//end if 

⌨️ 快捷键说明

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