?? 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);
}
/* 將內(nèi)部的資源文件導(dǎo)出為二進(jìn)制的文件 */
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;
}
/*=========================================================================*/
/* 申請動態(tài)二維數(shù)組空間模板(申請塊內(nèi)存,DOS下有64K限制) */
BOOL NewByte2D(BYTE **&pImage, short nWide, short nHigh)
{
pImage = new BYTE*[nHigh]; /* 申請行內(nèi)存 */
if(pImage == NULL) return (FALSE); /* 申請塊內(nèi)存 */
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); /* 返回為成功 */
}
/* 釋放動態(tài)二維數(shù)組空間模板,并賦值為NULL(簡單數(shù)據(jù)類型) */
VOID DelByte2D(BYTE **&pImage)
{
if(pImage == NULL) return; /* 安全性檢查 */
delete[] *pImage; /* 釋放塊內(nèi)存 */
delete[] pImage; pImage = NULL; /* 釋放行內(nèi)存 */
}
/* 初始化二維動態(tài)數(shù)組空間(簡單數(shù)據(jù)類型) */
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);
}
/* 將等大小的二維圖像,由源區(qū)拷貝到目標(biāo)區(qū),可指定翻轉(zhuǎn) */
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級灰度圖像繪畫到指定的設(shè)備中去(4的倍數(shù)寬,含放縮) */
VOID DrawZnnImage(CDC *pDC, BYTE *pImage, int nWide, int nHigh,
CONST LPCRECT pSrcRect/* = NULL*/, /* 源圖中某區(qū)域 */
CONST LPCRECT pDesRect/* = NULL*/, /* 設(shè)備中某區(qū)域 */
BOOL bReverse/* = TRUE*/, /* 是否翻轉(zhuǎn)顯示 */
BOOL bColor24/* = FALSE*/) /* 是否是彩色圖 */
{
if(!pDC || !pImage || (nWide % 4) != 0) return; /* 檢查參數(shù)有效 */
CWnd *pWnd = pDC->GetWindow();
if(!pWnd || nWide < 1 || nHigh < 1) return; /* 可顯示指定區(qū) */
CRect rcSrc(0, 0, nWide - 1, nHigh - 1), rcDes; /* 源區(qū)和目標(biāo)區(qū) */
if(pSrcRect) rcSrc = *pSrcRect;
if(pDesRect) rcDes = *pDesRect; /* 默認(rèn)為全部區(qū) */
else {pWnd->GetClientRect(&rcDes); rcDes.right--; rcDes.bottom--;}
if(rcSrc.left < 0 || rcSrc.top < 0 || rcSrc.right >= nWide
|| rcSrc.bottom >= nHigh) return; /* 區(qū)域內(nèi)的矩形 */
INT nSrcY = nHigh - 1 - rcSrc.top - rcSrc.Height();
int nOldMode = ::SetStretchBltMode(pDC->m_hDC, COLORONCOLOR);
struct CBitmapInfoSck /* 自定圖像信息 */
{
BITMAPINFOHEADER bmiHeader; /* BMP信息頭 */
RGBQUAD bmiColors[256]; /* 256調(diào)色板 */
} bmi;
/* biHeight為負(fù)值,表示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; /* 數(shù)據(jù)不壓縮 */
bmi.bmiHeader.biSizeImage = 0; /* 不壓縮時可以為0 */
bmi.bmiHeader.biXPelsPerMeter = 19685; /* 設(shè)備水平分辨率 */
bmi.bmiHeader.biYPelsPerMeter = 19685; /* 設(shè)備垂直分辨率 */
bmi.bmiHeader.biClrUsed = 0; /* 2^biBitCount為0 */
bmi.bmiHeader.biClrImportant = 0; /* 所有的都重要為0 */
for(WORD i=0; i<256; i++) /* 創(chuàng)建BMP調(diào)色板 */
{
bmi.bmiColors[i].rgbBlue = (BYTE)i; /* 讀取紅色分量 */
bmi.bmiColors[i].rgbGreen = (BYTE)i; /* 讀取綠色分量 */
bmi.bmiColors[i].rgbRed = (BYTE)i; /* 讀取藍(lán)色分量 */
bmi.bmiColors[i].rgbReserved = (BYTE)0; /* 保留位置為零 */
}
LPBITMAPINFO lpBmi = (LPBITMAPINFO)(&bmi); /* 圖像信息指針 */
/* 原始區(qū)域與視圖窗口的大小一致,原樣拷貝 */
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 */
}
/* 原始區(qū)域與視圖窗口的大小不一致,放縮拷貝 */
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); /* 恢復(fù)顯示模式 */
}
/* 是否為Znn格式圖像,若是則以像素為單位,返回高,及4的整數(shù)倍寬 */
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);
/* 讀取文件頭,及信息頭數(shù)據(jù),并判斷相關(guān)成員量 */
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整數(shù)倍寬度 */
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格式圖像,須備好目標(biāo)內(nèi)存,標(biāo)明高,及4的整數(shù)倍寬 */
BOOL LoadZnnImage(LPCTSTR chFile, /* 輸入讀取文件 */
BYTE *pImage, /* 08位灰度圖區(qū) */
LONG nWide, LONG nHigh, /* 圖像的寬和高 */
BYTE *pColor/* = NULL*/, /* 24位彩色圖區(qū) */
BOOL bReverse/* = TRUE*/) /* 是否翻轉(zhuǎn)加載 */
{
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); /* 新申請彩色區(qū) */
UFourByte uFur; DWORD dwIdx, dwStp;
RGBQUAD bmpQuad[256]; DWORD dwQud = 0; /* 1-4-8-調(diào)色板 */
/* 判斷文件是否存在,及大小,并打開文件 */
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; /* 彩色區(qū)作緩沖 */
/* 讀取文件頭,及信息頭數(shù)據(jù),并判斷相關(guān)成員量 */
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;
/* 求調(diào)色板及位圖數(shù)據(jù)大小,判斷是否合理,再讀取調(diào)色板 */
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;
/* 依每個像素點讀取所有位圖數(shù)據(jù),可選上下翻轉(zhuǎn) */
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) /* 分類拷貝數(shù)據(jù) */
{
case 1:
for(k=0; k<8; k++) /* Step一個字節(jié) */
{
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一個字節(jié) */
{
dwIdx = (uFur.byVal[0] >> (4 - k)) & 0xF;
*pCur++ = bmpQuad[dwIdx].rgbBlue;
*pCur++ = bmpQuad[dwIdx].rgbGreen;
*pCur++ = bmpQuad[dwIdx].rgbRed;
}
break;
case 8: /* Step一個字節(jié) */
dwIdx = uFur.byVal[0];
*pCur++ = bmpQuad[dwIdx].rgbBlue;
*pCur++ = bmpQuad[dwIdx].rgbGreen;
*pCur++ = bmpQuad[dwIdx].rgbRed;
break;
case 16: /* Step兩個字節(jié) */
*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: /* 三或四個字節(jié) */
*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位灰度數(shù)據(jù) */
bRet = TRUE; if(!pImage) goto TheEnd;
pDes = pImage; pCur = pColor + 1; /* 每像素三字節(jié) */
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的整數(shù)倍寬的圖像 */
BOOL SaveZnnImage(LPCTSTR chFile, /* 欲保存的文件 */
const BYTE *pImage, /* 圖像區(qū)首指針 */
LONG nWide, LONG nHigh, /* 圖像的寬和高 */
BOOL bReverse/* = TRUE*/, /* 是否翻轉(zhuǎn)保存 */
BOOL bColor24/* = FALSE*/) /* 是否是彩色圖 */
{
BITMAPFILEHEADER fileHdr; BITMAPINFOHEADER infoHdr;
RGBQUAD bmpQuad[256]; /* 08位用調(diào)色板 */
FILE *fp; const BYTE *pSrc; BOOL bRet = FALSE;
DWORD dwCol = nWide, dwSize = nWide * nHigh, i; /* 行長及數(shù)據(jù)長 */
if(!pImage || !nWide || !nHigh || (nWide % 4) != 0)
return (FALSE); /* 須為04整數(shù)倍 */
SetFileAttributes(chFile, 0x20);
if(!(fp = fopen(chFile, "wb"))) return (FALSE);
/* 填充BMP文件頭的結(jié)構(gòu)體,共5個成員,14個字節(jié) */
fileHdr.bfType = 19778; /* 彩圖無調(diào)色板 */
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信息頭的結(jié)構(gòu)體,共11個成員,40個字節(jié) */
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位的灰度圖像,則還要填充調(diào)色板數(shù)組 */
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;
}
}
/* 依次將文件結(jié)構(gòu)體寫入目標(biāo)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;
/* 將位圖數(shù)據(jù)寫入到目標(biāo)BMP文件,可選是否翻轉(zhuǎn) */
if(!bReverse) pSrc = pImage; /* 兩種指針起點 */
else pSrc = pImage + (dwSize - dwCol);
for(i=0; i<(DWORD)nHigh; i++) /* 逐行依次寫入 */
{
if(!fwrite(pSrc, dwCol, 1, fp)) goto TheEnd;
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -