📄 calcborn.cpp
字号:
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 + -