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

📄 calcborn.cpp

📁 预产期的计算
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_ARCHIVE, NULL);
	
	if(hFile == INVALID_HANDLE_VALUE || !ReadFile(hFile, pBuffData,
		dwLength, &dwBuffSize, NULL) || dwBuffSize != dwLength)
		{delete[] pBuffData; pBuffData = NULL; dwBuffSize = 0L;}
	CloseHandle(hFile); return (dwBuffSize == dwLength);
}

/* 将内部的资源文件导出为二进制的文件 */
BOOL ExportResAsBinFile(LPCTSTR lpFile, HMODULE hModule,
						DWORD dwName, LPCTSTR lpType)
{
	if(!lpFile || !hModule || !lpType) return FALSE;
	BOOL bSuccess = FALSE;
	HRSRC hRes = FindResource(hModule, MAKEINTRESOURCE(dwName), lpType);
	DWORD dwSize = SizeofResource(hModule, hRes);
	HGLOBAL hMem = LoadResource(hModule, hRes);
	BYTE *pData = (BYTE *)LockResource(hMem);
	if(pData && dwSize > 0) bSuccess = SaveBinaryFile(lpFile, pData, dwSize);
	FreeResource(hMem); return bSuccess;
}

/*=========================================================================*/

/* 申请动态二维数组空间模板(申请块内存,DOS下有64K限制) */
BOOL NewByte2D(BYTE **&pImage, short nWide, short nHigh)
{
	pImage = new BYTE*[nHigh];						/* 申请行内存 */
	if(pImage == NULL) return (FALSE);				/* 申请块内存 */
	BYTE *pBuffer = new BYTE[(long)nWide * (long)nHigh];
	if(!pBuffer) {delete[] pImage; pImage = NULL; return (FALSE);}
	
	for(register short j=0; j<nHigh; j++)			/* 定位行指针 */
	{
		pImage[j] = pBuffer; pBuffer += nWide;		/* 移动nWide */
	}
	return (pImage != NULL);						/* 返回为成功 */
}

/* 释放动态二维数组空间模板,并赋值为NULL(简单数据类型) */
VOID DelByte2D(BYTE **&pImage)
{
	if(pImage == NULL) return;						/* 安全性检查 */
	delete[] *pImage;								/* 释放块内存 */
	delete[] pImage; pImage = NULL;					/* 释放行内存 */
}

/* 初始化二维动态数组空间(简单数据类型) */
VOID IniByte2D(BYTE **pImage, short nWide,
			 short nHigh, BYTE data)
{
	if(!pImage) return; register SHORT j = -1;
	while(++j < nHigh) memset(pImage[j], data, nWide);
}

/* 将等大小的二维图像,由源区拷贝到目标区,可指定翻转 */
VOID CpyByte2D(BYTE **pDes, BYTE **pSrc,
			  short nWide, short nHigh, int bFlip)
{
	if(!pDes || !pSrc) return; register SHORT j = -1;
	while(++j < nHigh) memcpy( \
		pDes[bFlip ? (nHigh - 1 - j) : j], pSrc[j], nWide);
}

/*=========================================================================*/

/* 将指定256级灰度图像绘画到指定的设备中去(4的倍数宽,含放缩) */
VOID DrawZnnImage(CDC *pDC, BYTE *pImage, int nWide, int nHigh,
				CONST LPCRECT pSrcRect/* = NULL*/,	/* 源图中某区域 */
				CONST LPCRECT pDesRect/* = NULL*/,	/* 设备中某区域 */
				BOOL bReverse/* = TRUE*/,			/* 是否翻转显示 */
				BOOL bColor24/* = FALSE*/)			/* 是否是彩色图 */
{
	if(!pDC || !pImage || (nWide % 4) != 0) return;	/* 检查参数有效 */
	CWnd *pWnd = pDC->GetWindow();
	if(!pWnd || nWide < 1 || nHigh < 1) return;		/* 可显示指定区 */
	
	CRect rcSrc(0, 0, nWide - 1, nHigh - 1), rcDes;	/* 源区和目标区 */
	if(pSrcRect) rcSrc = *pSrcRect;
	if(pDesRect) rcDes = *pDesRect;					/* 默认为全部区 */
	else {pWnd->GetClientRect(&rcDes); rcDes.right--; rcDes.bottom--;}
	if(rcSrc.left < 0 || rcSrc.top < 0 || rcSrc.right >= nWide
		|| rcSrc.bottom >= nHigh) return;			/* 区域内的矩形 */
	INT nSrcY = nHigh - 1 - rcSrc.top - rcSrc.Height();
	
	int nOldMode = ::SetStretchBltMode(pDC->m_hDC, COLORONCOLOR);
	struct CBitmapInfoSck							/* 自定图像信息 */
	{
		BITMAPINFOHEADER	bmiHeader;				/* BMP信息头 */
		RGBQUAD				bmiColors[256];			/* 256调色板 */
	} bmi;
	
	/* biHeight为负值,表示DIB图像存储是由上到下的,颠倒的 */
	bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);/* 信息头大小 */
	bmi.bmiHeader.biWidth				= nWide;	/* 图像宽度 */
	bmi.bmiHeader.biHeight = bReverse ? -nHigh : nHigh; /* 图像高度 */
	bmi.bmiHeader.biPlanes				= 1;		/* 必须为1 */
	bmi.bmiHeader.biBitCount = (bColor24 ? 24 : 8);	/* 8位色/24位色 */
	bmi.bmiHeader.biCompression			= 0;		/* 数据不压缩 */
	bmi.bmiHeader.biSizeImage			= 0;		/* 不压缩时可以为0 */
	bmi.bmiHeader.biXPelsPerMeter	= 19685;		/* 设备水平分辨率 */
	bmi.bmiHeader.biYPelsPerMeter	= 19685;		/* 设备垂直分辨率 */
	bmi.bmiHeader.biClrUsed				= 0;		/* 2^biBitCount为0 */
	bmi.bmiHeader.biClrImportant		= 0;		/* 所有的都重要为0 */
	
	for(WORD i=0; i<256; i++)						/* 创建BMP调色板 */
	{
		bmi.bmiColors[i].rgbBlue		= (BYTE)i;	/* 读取红色分量 */
		bmi.bmiColors[i].rgbGreen		= (BYTE)i;	/* 读取绿色分量 */
		bmi.bmiColors[i].rgbRed			= (BYTE)i;	/* 读取蓝色分量 */
		bmi.bmiColors[i].rgbReserved	= (BYTE)0;	/* 保留位置为零 */
	}
	LPBITMAPINFO lpBmi = (LPBITMAPINFO)(&bmi);		/* 图像信息指针 */
	
	/* 原始区域与视图窗口的大小一致,原样拷贝 */
	if(rcDes.Width() == rcSrc.Width() && rcDes.Height() \
		== rcSrc.Height())							/* equal size */
	{
		::SetDIBitsToDevice(pDC->m_hDC, 			/* hDC */
			rcDes.left, rcDes.top,					/* DesX, DesY */
			rcSrc.Width() + 1, rcSrc.Height() + 1,	/* SrcWd, SrcHi */
			rcSrc.left, nSrcY,						/* SrcX, SrcY */
			0, nHigh,								/* Start, NumScans */
			pImage, lpBmi,							/* lpBits, lpInfo */
			DIB_RGB_COLORS);						/* wUsage */
	}
	
	/* 原始区域与视图窗口的大小不一致,放缩拷贝 */
	else
	{
		::StretchDIBits(pDC->m_hDC,					/* hDC */
			rcDes.left, rcDes.top,					/* DesX, DesY */
			rcDes.Width() + 1, rcDes.Height() + 1,	/* DesWd, DesHi */
			rcSrc.left, nSrcY,						/* SrcX, SrcY */
			rcSrc.Width() + 1, rcSrc.Height() + 1,	/* SrcWd, SrcHi */
			pImage, lpBmi,							/* lpBits, lpInfo */
			DIB_RGB_COLORS, SRCCOPY);				/* wUsage, dwROP */
	}
	::SetStretchBltMode(pDC->m_hDC, nOldMode);		/* 恢复显示模式 */
}

/* 是否为Znn格式图像,若是则以像素为单位,返回高,及4的整数倍宽 */
BOOL IsmeZnnImage(LPCTSTR chFile,					/* 输入读取文件 */
				  WORD *pwWide/* = NULL*/, WORD *pwHigh/* = NULL*/)
{
	BITMAPFILEHEADER fileHdr; BITMAPINFOHEADER infoHdr;
	BOOL bRet = FALSE; DWORD dwLen = 0; FILE *fp;
	const DWORD dwHdr = sizeof(fileHdr) + sizeof(infoHdr);
	
	/* 判断文件是否存在,及大小,并打开文件 */
	if(!IsFileExist(chFile, &dwLen)) return (FALSE);
	if(dwLen < dwHdr) return (FALSE);
	if((fp = fopen(chFile, "rb")) == NULL) return (FALSE);
	
	/* 读取文件头,及信息头数据,并判断相关成员量 */
	if(fread(&fileHdr, sizeof(fileHdr), 1, fp) == 1 && \
		fread(&infoHdr, sizeof(infoHdr), 1, fp) == 1)
	{
		infoHdr.biHeight = abs(infoHdr.biHeight);
		bRet = (fileHdr.bfType == 19778) &&
			(fileHdr.bfOffBits >= dwHdr) &&
			(infoHdr.biSize == sizeof(infoHdr)) &&
			(infoHdr.biWidth > 0 && infoHdr.biWidth < 32760) &&
			(infoHdr.biHeight > 0 && infoHdr.biHeight < 32760) &&
			(infoHdr.biPlanes == 1) &&
			(infoHdr.biBitCount == 1 || infoHdr.biBitCount == 4 ||
			infoHdr.biBitCount == 8 || infoHdr.biBitCount == 16 ||
			infoHdr.biBitCount == 24 || infoHdr.biBitCount == 32) &&
			(infoHdr.biCompression == 0);
	}
	
	/* 若格式符合要求,则返回高度,及4整数倍宽度 */
	if(bRet)
	{
		if(pwWide) *pwWide = (WORD)(WIDTHBYTES(infoHdr.biWidth * 8));
		if(pwHigh) *pwHigh = (WORD)infoHdr.biHeight;
	}
	if(fp) {fclose(fp); fp = NULL;} return (bRet);
}

/* 加载Znn格式图像,须备好目标内存,标明高,及4的整数倍宽 */
BOOL LoadZnnImage(LPCTSTR chFile,					/* 输入读取文件 */
				  BYTE *pImage,						/* 08位灰度图区 */
				  LONG nWide, LONG nHigh,			/* 图像的宽和高 */
				  BYTE *pColor/* = NULL*/,			/* 24位彩色图区 */
				  BOOL bReverse/* = TRUE*/)			/* 是否翻转加载 */
{
	BOOL bRet = FALSE; DWORD dwLen, dwCol; FILE *fp;/* 文件列总大小 */
	BITMAPFILEHEADER fileHdr; BITMAPINFOHEADER infoHdr;
	const DWORD dwHdr = sizeof(fileHdr) + sizeof(infoHdr);
	
	DWORD dwClrCol = nWide * 3, dwClrSiz = dwClrCol * nHigh;
	BYTE *pDes, *pCur, *pEnd, *pLst; DWORD j, i, k;
	BOOL bNewColor = (pColor == NULL);				/* 新申请彩色区 */
	
	UFourByte uFur; DWORD dwIdx, dwStp;
	RGBQUAD bmpQuad[256]; DWORD dwQud = 0;			/* 1-4-8-调色板 */
	
	/* 判断文件是否存在,及大小,并打开文件 */
	if(!pImage && bNewColor) return (FALSE);
	if(!IsFileExist(chFile, &dwLen)) return (FALSE);
	if(dwLen < dwHdr) return (FALSE);
	
	if((fp = fopen(chFile, "rb")) == NULL) return (FALSE);
	if(bNewColor) pColor = (BYTE *)malloc(dwClrSiz);
	if(pColor == NULL) goto TheEnd;					/* 彩色区作缓冲 */
	
	/* 读取文件头,及信息头数据,并判断相关成员量 */
	if(fread(&fileHdr, sizeof(fileHdr), 1, fp) == 1 && \
		fread(&infoHdr, sizeof(infoHdr), 1, fp) == 1)
	{
		infoHdr.biHeight = abs(infoHdr.biHeight);	/* 不处理颠倒图 */
		bRet = (fileHdr.bfType == 19778) &&
			(fileHdr.bfOffBits >= dwHdr) &&
			(infoHdr.biSize == sizeof(infoHdr)) &&
			(infoHdr.biWidth > 0 && infoHdr.biWidth < 32760) &&
			(infoHdr.biHeight > 0 && infoHdr.biHeight < 32760) &&
			(infoHdr.biPlanes == 1) &&
			(infoHdr.biBitCount == 1 || infoHdr.biBitCount == 4 ||
			infoHdr.biBitCount == 8 || infoHdr.biBitCount == 16 ||
			infoHdr.biBitCount == 24 || infoHdr.biBitCount == 32) &&
			(infoHdr.biCompression == 0) &&
			(WIDTHBYTES(infoHdr.biWidth * 8) == nWide) &&
			(infoHdr.biHeight == nHigh);			/* 宽高须全一致 */
	}
	if(!bRet) goto TheEnd; bRet = FALSE;
	dwStp = infoHdr.biBitCount / 8; if(!dwStp) dwStp = 1;
	
	/* 求调色板及位图数据大小,判断是否合理,再读取调色板 */
	if(infoHdr.biBitCount < 16)
	{
		dwQud = (1L << infoHdr.biBitCount);
		if(!infoHdr.biClrUsed || infoHdr.biClrUsed > dwQud)
			infoHdr.biClrUsed = dwQud; /* all used */
		dwQud = infoHdr.biClrUsed * sizeof(RGBQUAD);
	}
	dwCol = WIDTHBYTES(infoHdr.biWidth * infoHdr.biBitCount);
	if(dwLen < dwHdr + dwQud + dwCol * nHigh) goto TheEnd;
	if(dwQud && !fread(bmpQuad, dwQud, 1, fp)) goto TheEnd;
	
	/* 依每个像素点读取所有位图数据,可选上下翻转 */
	if(bReverse) pDes = pColor + (dwClrSiz - dwClrCol);
	else pDes = pColor;
	for(j=0; j<(DWORD)nHigh; j++)
	{
		pEnd = pDes + infoHdr.biWidth * 3;			/* 一行彩色终止 */
		pCur = pDes; k = 0;
		
		for(i=0; i<dwCol; i++)						/* 读行被04整除 */
		{
			if(k >= 4) k = 0;						/* 防止越限访问 */
			if(!fread(&uFur.byVal[k], 1, 1, fp)) goto TheEnd;
			if(pCur >= pEnd || ++k < dwStp) continue;
			
			switch(infoHdr.biBitCount)				/* 分类拷贝数据 */
			{
			case 1:
				for(k=0; k<8; k++)					/* Step一个字节 */
				{
					dwIdx = (uFur.byVal[0] >> (7 - k)) & 1;
					*pCur++ = bmpQuad[dwIdx].rgbBlue;
					*pCur++ = bmpQuad[dwIdx].rgbGreen;
					*pCur++ = bmpQuad[dwIdx].rgbRed;
				}
				break;
			
			case 4:
				for(k=0; k<8; k+=4)					/* Step一个字节 */
				{
					dwIdx = (uFur.byVal[0] >> (4 - k)) & 0xF;
					*pCur++ = bmpQuad[dwIdx].rgbBlue;
					*pCur++ = bmpQuad[dwIdx].rgbGreen;
					*pCur++ = bmpQuad[dwIdx].rgbRed;
				}
				break;
			
			case 8:									/* Step一个字节 */
				dwIdx = uFur.byVal[0];
				*pCur++ = bmpQuad[dwIdx].rgbBlue;
				*pCur++ = bmpQuad[dwIdx].rgbGreen;
				*pCur++ = bmpQuad[dwIdx].rgbRed;
				break;
			
			case 16:								/* Step两个字节 */
				*pCur++ = (BYTE)(uFur.wVal[0] & 0x1F);
				*pCur++ = (BYTE)((uFur.wVal[0] >> 5) & 0x1F);
				*pCur++ = (BYTE)((uFur.wVal[0] >> 10) & 0x1F);
				break;
			
			case 24: case 32:						/* 三或四个字节 */
				*pCur++ = uFur.byVal[0];
				*pCur++ = uFur.byVal[1];
				*pCur++ = uFur.byVal[2];
				break;
			}
			k = 0;									/* 回零到单元头 */
		}
		
		pCur = pDes + infoHdr.biWidth * 3;			/* 多余的点位置 */
		pEnd = pDes + dwClrCol; pLst = pCur - 3;
		while(pCur < pEnd)
		{
			*pCur++ = pLst[0]; *pCur++ = pLst[1];	/* 置为末点颜色 */
			*pCur++ = pLst[2];
		}
		if(bReverse) pDes -= dwClrCol; else pDes += dwClrCol;
	}
	
	/* 从24位彩色图中读取绿色通道,作为8位灰度数据 */
	bRet = TRUE; if(!pImage) goto TheEnd;
	pDes = pImage; pCur = pColor + 1;				/* 每像素三字节 */
	pEnd = pColor + dwClrSiz;
	while(pCur < pEnd) {*pDes++ = *pCur; pCur += 3;}
	
TheEnd:
	if(bNewColor && pColor) {free(pColor); pColor = NULL;}
	if(fp) {fclose(fp); fp = NULL;} return (bRet);	/* 释放所用资源 */
}

/* 仅按8位灰度/24位彩色,保存指定高,及4的整数倍宽的图像 */
BOOL SaveZnnImage(LPCTSTR chFile,					/* 欲保存的文件 */
				  const BYTE *pImage,				/* 图像区首指针 */
				  LONG nWide, LONG nHigh,			/* 图像的宽和高 */
				  BOOL bReverse/* = TRUE*/,			/* 是否翻转保存 */
				  BOOL bColor24/* = FALSE*/)		/* 是否是彩色图 */
{
	BITMAPFILEHEADER fileHdr; BITMAPINFOHEADER infoHdr;
	RGBQUAD bmpQuad[256];							/* 08位用调色板 */
	FILE *fp; const BYTE *pSrc; BOOL bRet = FALSE;
	DWORD dwCol = nWide, dwSize = nWide * nHigh, i;	/* 行长及数据长 */
	
	if(!pImage || !nWide || !nHigh || (nWide % 4) != 0)
		return (FALSE);								/* 须为04整数倍 */
	SetFileAttributes(chFile, 0x20);
	if(!(fp = fopen(chFile, "wb"))) return (FALSE);
	
	/* 填充BMP文件头的结构体,共5个成员,14个字节 */
	fileHdr.bfType = 19778;							/* 彩图无调色板 */
	fileHdr.bfOffBits = sizeof(fileHdr) + sizeof(infoHdr);
	if(bColor24) {dwCol *= 3; dwSize *= 3;}
	else fileHdr.bfOffBits += sizeof(bmpQuad);		/* 每像素24位彩 */
	fileHdr.bfSize = fileHdr.bfOffBits + dwSize;
	fileHdr.bfReserved1 = fileHdr.bfReserved2 = 0;
	
	/* 填充BMP信息头的结构体,共11个成员,40个字节 */
	infoHdr.biSize = sizeof(infoHdr);	infoHdr.biWidth = nWide;
	infoHdr.biHeight = nHigh;			infoHdr.biPlanes = 1;
	infoHdr.biBitCount = (bColor24 ? 24 : 8);		/* 两种颜色方案 */
	infoHdr.biCompression = 0;			infoHdr.biSizeImage = dwSize;
	infoHdr.biXPelsPerMeter = 19685;	infoHdr.biYPelsPerMeter = 19685;
	infoHdr.biClrUsed = 0;				infoHdr.biClrImportant = 0;
	
	/* 如果是8位的灰度图像,则还要填充调色板数组 */
	if(!bColor24)
	{
		for(i=0; i<256; i++)
		{
			bmpQuad[i].rgbBlue			= (BYTE)i;
			bmpQuad[i].rgbGreen			= (BYTE)i;	/* 共256个元素 */
			bmpQuad[i].rgbRed			= (BYTE)i;
			bmpQuad[i].rgbReserved		= (BYTE)0;
		}
	}
	
	/* 依次将文件结构体写入目标BMP文件 */
	if(fwrite(&fileHdr, sizeof(fileHdr), 1, fp) != 1 ||
		fwrite(&infoHdr, sizeof(infoHdr), 1, fp) != 1 ||
		(!bColor24 && !fwrite(bmpQuad, sizeof(bmpQuad), 1, fp)))
		goto TheEnd;
	
	/* 将位图数据写入到目标BMP文件,可选是否翻转 */
	if(!bReverse) pSrc = pImage;					/* 两种指针起点 */
	else pSrc = pImage + (dwSize - dwCol);
	for(i=0; i<(DWORD)nHigh; i++)					/* 逐行依次写入 */
	{
		if(!fwrite(pSrc, dwCol, 1, fp)) goto TheEnd;

⌨️ 快捷键说明

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