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

📄 imageview.cpp

📁 一种实现图片无缝接合软件的源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:

void CImageView::OnSave() 
{
	int temp1,temp2,x0,y0,x1,y1;
	temp1=m_nX1<m_nX2?m_nX1:m_nX2;
	if(m_sPath3!="")
	{
		if(m_sPath4!="")
			temp2=m_nX3<m_nX4?m_nX3:m_nX4;
		else
			temp2=m_nX3;
		x0=temp1<temp2?temp1:temp2;
	}
	else
		x0=temp1;

	temp1=m_nY1<m_nY2?m_nY1:m_nY2;
	if(m_sPath3!="")
	{
		if(m_sPath4!="")
			temp2=m_nY3<m_nY4?m_nY3:m_nY4;
		else
			temp2=m_nY3;
		y0=temp1<temp2?temp1:temp2;
	}
	else
		y0=temp1;
	temp1=m_nX1+m_nWidth1>m_nX2+m_nWidth2?m_nX1+m_nWidth1:m_nX2+m_nWidth2;
	if(m_sPath3!="")
	{
		if(m_sPath4!="")
			temp2=m_nX3+m_nWidth3>m_nX4+m_nWidth4?m_nX3+m_nWidth3:m_nX4+m_nWidth4;
		else
			temp2=m_nX3+m_nWidth3;
		x1=temp1>temp2?temp1:temp2;
	}
	else
		x1=temp1;
	temp1=m_nY1+m_nHeight1>m_nY2+m_nHeight2?m_nY1+m_nHeight1:m_nY2+m_nHeight2;
	if(m_sPath3!="")
	{
		if(m_sPath4!="")
			temp2=m_nY3+m_nHeight3>m_nY4+m_nHeight4?m_nY3+m_nHeight3:m_nY4+m_nHeight4;
		else
			temp2=m_nY3+m_nHeight3;
		y1=temp1>temp2?temp1:temp2;
	}
	else
		y1=temp1;
	CRect rect(x0,y0,x1,y1);
	ClientToScreen(&rect);
	HBITMAP hbmp=CopyScreenToBitmap(&rect);
	CString m_sPath;
	CFileDialog dlg(FALSE,"bmp","*.bmp",OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"BMP位图文件(*.bmp)|*.bmp||",NULL);
	if(dlg.DoModal()==IDOK)
	{
		m_sPath=dlg.GetPathName();
		char path[255];
		::strcpy(path,m_sPath);
		SaveBitmapToFile(hbmp,path);
	}
	OnNew();
	HBITMAP hbitmap;
	m_sPath1=m_sPath;
	hbitmap=(HBITMAP)LoadImage(AfxGetInstanceHandle(),m_sPath1,IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
	hMemDC1=::CreateCompatibleDC(NULL);
	SelectObject(hMemDC1,hbitmap);
	::DeleteObject(hbitmap);		
	m_nX1=x0;
	m_nY1=y0;
	m_nWidth1=x1-x0;
	m_nHeight1=y1-y0;
	Invalidate();
}

HBITMAP CImageView::CopyScreenToBitmap(LPRECT lpRect)
{
	HDC hScrDC, hMemDC; 		// 屏幕和内存设备描述表
	HBITMAP hBitmap, hOldBitmap;// 位图句柄
	int nX, nY, nX2, nY2;		// 选定区域坐标
	int nWidth, nHeight;		// 位图宽度和高度
	int xScrn, yScrn;			// 屏幕分辨率  
	// 确保选定区域不为空矩形  
	if(IsRectEmpty(lpRect))     
		return NULL;
	//为屏幕创建设备描述表 
	hScrDC = CreateDC("DISPLAY", NULL, NULL, NULL);
	//为屏幕设备描述表创建兼容的内存设备描述表 
	hMemDC = CreateCompatibleDC(hScrDC);   
	// 获得选定区域坐标
	nX = lpRect->left;
	nY = lpRect->top;
	nX2 = lpRect->right;
	nY2 = lpRect->bottom;
	// 获得屏幕分辨率   
	xScrn = GetDeviceCaps(hScrDC, HORZRES);
	yScrn = GetDeviceCaps(hScrDC, VERTRES);   
	//确保选定区域是可见的 
	if(nX<0)
		nX = 0;
	if(nY<0)
		nY = 0;
	if(nX2>xScrn)
		nX2 = xScrn;
	if(nY2>yScrn)
		nY2 = yScrn;
	nWidth = nX2 - nX;   
	nHeight = nY2 - nY;
	// 创建一个与屏幕设备描述表兼容的位图
	hBitmap = CreateCompatibleBitmap(hScrDC, nWidth, nHeight);
	// 把新位图选到内存设备描述表中
	hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap); 
	// 把屏幕设备描述表拷贝到内存设备描述表中
	BitBlt(hMemDC, 0, 0, nWidth, nHeight, hScrDC, nX, nY, SRCCOPY);   
	//得到屏幕位图的句柄
	hBitmap =(HBITMAP)SelectObject(hMemDC, hOldBitmap);  
	//清除
    DeleteDC(hScrDC);
	DeleteDC(hMemDC);
	// 返回位图句柄  
	return hBitmap;
}

void CImageView::SaveBitmapToFile(HBITMAP hBitmap, LPSTR lpFileName)
{
	HDC hDC;	//设备描述表 
	int iBits;  //当前显示分辨率下每个像素所占字节数
	WORD wBitCount;      	//位图中每个像素所占字节数
    //定义调色板大小, 位图中像素字节大小 ,      位图文件大小 , 写入文件字节数
	DWORD dwPaletteSize=0,dwBmBitsSize,dwDIBSize,dwWritten;
	BITMAP Bitmap;        			//位图属性结构	
	BITMAPFILEHEADER   bmfHdr;      //位图文件头结构  
    BITMAPINFOHEADER   bi;         	//位图信息头结构 
	LPBITMAPINFOHEADER lpbi;       	//指向位图信息头结构
    HANDLE fh, hDib, hPal,hOldPal=NULL;	//定义文件,分配内存句柄,调色板句柄  
	//计算位图文件每个像素所占字节数 
	hDC = CreateDC("DISPLAY",NULL,NULL,NULL);
	iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES);
	DeleteDC(hDC);
	if (iBits <= 1)
		wBitCount = 1; 
	else if (iBits<= 4)
		wBitCount = 4; 
	else if (iBits<= 8)
		wBitCount = 8;
	else if (iBits <= 24)
		wBitCount = 24;   //计算调色板大小
	else
		wBitCount = 32;
	if (wBitCount <= 8)
		dwPaletteSize = (1<<wBitCount) *sizeof(RGBQUAD); //设置位图信息头结构
	GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&Bitmap);
	bi.biSize = sizeof(BITMAPINFOHEADER);
	bi.biWidth = Bitmap.bmWidth;
	bi.biHeight = Bitmap.bmHeight;
	bi.biPlanes = 1;
	bi.biBitCount = wBitCount;   
	bi.biCompression = BI_RGB;
	bi.biSizeImage = 0; 
	bi.biXPelsPerMeter = 0;
	bi.biYPelsPerMeter = 0;
	bi.biClrUsed = 0;
	bi.biClrImportant = 0;
	dwBmBitsSize = ((Bitmap.bmWidth*wBitCount+31)/32)*4*Bitmap.bmHeight;//为位图内容分配内存
	hDib  = GlobalAlloc(GHND,dwBmBitsSize+dwPaletteSize+sizeof(BITMAPINFOHEADER));
	lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);  
	*lpbi = bi;   // 处理调色板   
	hPal = GetStockObject(DEFAULT_PALETTE);  
	if (hPal)
	{
		hDC	= ::GetDC(NULL);
		hOldPal =SelectPalette(hDC, (HPALETTE)hPal, FALSE);
		RealizePalette(hDC); 
	}
	// 获取该调色板下新的像素值
	GetDIBits(hDC, hBitmap, 0, 
			(UINT) Bitmap.bmHeight,
			(LPSTR)lpbi + sizeof(BITMAPINFOHEADER)+dwPaletteSize,
			(BITMAPINFO*)lpbi, DIB_RGB_COLORS);
	//恢复调色板  
    if (hOldPal)
	{
		SelectPalette(hDC,(HPALETTE)hOldPal, TRUE);      
		RealizePalette(hDC);
		::ReleaseDC(NULL,hDC); 
	}
	//创建位图文件    
	fh = CreateFile(lpFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
					FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
	if (fh == INVALID_HANDLE_VALUE) 
		return ; 
	// 设置位图文件头
	bmfHdr.bfType = 0x4D42;  // "BM"
	dwDIBSize  = sizeof(BITMAPFILEHEADER) 
		       + sizeof(BITMAPINFOHEADER)
			   + dwPaletteSize + dwBmBitsSize;  
	bmfHdr.bfSize = dwDIBSize;
	bmfHdr.bfReserved1 = 0;
	bmfHdr.bfReserved2 = 0; 
	bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER)+ dwPaletteSize;   
	//写入位图文件头
	WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);   
	// 写入位图文件其余内容
	WriteFile(fh, (LPSTR)lpbi, dwDIBSize,&dwWritten, NULL);
	//清除   
	GlobalUnlock(hDib);
	GlobalFree(hDib);
	CloseHandle(fh);
}

void CImageView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	if(nChar==VK_LEFT)
	{
		switch(m_nID)
		{
		case 1:
			m_nX1--;
			break;
		case 2:
			m_nX2--;
			break;
		case 3:
			m_nX3--;
			break;
		case 4:
			m_nX4--;
			break;
		default:
			break;
		}
	}
	if(nChar==VK_RIGHT)
	{	switch(m_nID)
		{
		case 1:
			m_nX1++;
			break;
		case 2:
			m_nX2++;
			break;
		case 3:
			m_nX3++;
			break;
		case 4:
			m_nX4++;
			break;
		default:
			break;
		}
	}
	if(nChar==VK_UP)
	{	switch(m_nID)
		{
		case 1:
			m_nY1--;
			break;
		case 2:
			m_nY2--;
			break;
		case 3:
			m_nY3--;
			break;
		case 4:
			m_nY4--;
			break;
		default:
			break;
		}
	}
	if(nChar==VK_DOWN)
	{	switch(m_nID)
		{
		case 1:
			m_nY1++;
			break;
		case 2:
			m_nY2++;
			break;
		case 3:
			m_nY3++;
			break;
		case 4:
			m_nY4++;
			break;
		default:
			break;
		}
	}
	if(m_nID>0)
		Invalidate();
	CView::OnKeyDown(nChar, nRepCnt, nFlags);
}


void CImageView::OnNew() 
{
	if(m_sPath1!="")
		::DeleteDC(hMemDC1);
	if(m_sPath2!="")
		::DeleteDC(hMemDC2);
	if(m_sPath3!="")
		::DeleteDC(hMemDC3);
	if(m_sPath4!="")
		::DeleteDC(hMemDC4);

	m_sPath1="";
	m_nWidth1=0;
	m_nHeight1=0;
	m_nX1=0;
	m_nY1=0;
	m_bCanMove1=false;
	m_sPath2="";
	m_nWidth2=0;
	m_nHeight2=0;
	m_nX2=0;
	m_nY2=0;
	m_bCanMove2=false;
	m_sPath3="";
	m_nWidth3=0;
	m_nHeight3=0;
	m_nX3=0;
	m_nY3=0;
	m_bCanMove3=false;
	m_sPath4="";
	m_nWidth4=0;
	m_nHeight4=0;
	m_nX4=0;
	m_nY4=0;
	m_bCanMove4=false;
	m_dwRop=SRCINVERT;
	m_nID=0;
	Invalidate();	
}

⌨️ 快捷键说明

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