函数编写】 棋子位图的原始像素放在全局数组unsigned char *g_pRawChessBmpBits中, 棋盘位图的原始像素放在全局数组unsigned char *g_pRawBoardBmpBits中, 函数的功能是,利用这两个原始像素数组,根据参数传下来的尺寸、坐标和透明度,计算新的半透明效果的玻璃棋子位图的像素值,并放在第一个参数指定的数组中。(不得修改两个全局数组) */ //--------------------------------------------------------------------------------------------------------------------------------------------------------- void ModifyChessBmp( unsigned char *pPixel, //将修改后的像素RGB值放在这个数组中 int iChessBmpWidth, //棋子位图的宽度(以像素为单位) int iChessBmpHeight, //棋子位图的高度(以像素为单位) int iBoardBmpWidth, //棋盘位图的宽度(以像素为单位) int iDrawingX, //棋子位图被贴到棋盘位图的X坐标(水平向右为正向)(以像素为单位) int iDrawingY, //棋子位图被贴到棋盘位图的Y坐标(垂直向下为正向)(以像素为单位) float fTransparency //透明度,值为0.0-1.0 ) { }
时间: 2023-08-15 15:36:28 浏览: 128
以下是实现ModifyChessBmp函数的代码:
```c++
void ModifyChessBmp(unsigned char *pPixel, int iChessBmpWidth, int iChessBmpHeight,
int iBoardBmpWidth, int iDrawingX, int iDrawingY, float fTransparency) {
// 计算棋子在棋盘上的起始位置
int iStartX = iDrawingX < 0 ? -iDrawingX : 0;
int iStartY = iDrawingY < 0 ? -iDrawingY : 0;
// 计算棋子在棋盘上的结束位置
int iEndX = iDrawingX + iChessBmpWidth > iBoardBmpWidth ? iBoardBmpWidth - iDrawingX : iChessBmpWidth;
int iEndY = iDrawingY + iChessBmpHeight > iBoardBmpHeight ? iBoardBmpHeight - iDrawingY : iChessBmpHeight;
// 计算透明度的系数
int iAlpha = static_cast<int>(fTransparency * 255);
// 遍历棋子位图的像素
for (int y = iStartY; y < iEndY; y++) {
for (int x = iStartX; x < iEndX; x++) {
// 获取棋子位图中的像素值
int iChessIndex = (y * iChessBmpWidth + x) * 4;
int iChessR = g_pRawChessBmpBits[iChessIndex];
int iChessG = g_pRawChessBmpBits[iChessIndex + 1];
int iChessB = g_pRawChessBmpBits[iChessIndex + 2];
int iChessA = g_pRawChessBmpBits[iChessIndex + 3];
// 获取棋盘位图中的像素值
int iBoardIndex = ((y + iDrawingY) * iBoardBmpWidth + x + iDrawingX) * 4;
int iBoardR = g_pRawBoardBmpBits[iBoardIndex];
int iBoardG = g_pRawBoardBmpBits[iBoardIndex + 1];
int iBoardB = g_pRawBoardBmpBits[iBoardIndex + 2];
// 计算新的像素值
int iNewR = iChessR * iAlpha / 255 + iBoardR * (255 - iAlpha) / 255;
int iNewG = iChessG * iAlpha / 255 + iBoardG * (255 - iAlpha) / 255;
int iNewB = iChessB * iAlpha / 255 + iBoardB * (255 - iAlpha) / 255;
// 将新的像素值保存到数组中
pPixel[iBoardIndex] = static_cast<unsigned char>(iNewR);
pPixel[iBoardIndex + 1] = static_cast<unsigned char>(iNewG);
pPixel[iBoardIndex + 2] = static_cast<unsigned char>(iNewB);
pPixel[iBoardIndex + 3] = 255;
}
}
}
```
该函数的实现思路如下:
1. 计算棋子在棋盘上的起始位置和结束位置,以便在处理时不会越界。
2. 计算透明度的系数,以便在混合颜色时使用。
3. 遍历棋子位图的像素,获取棋子位图和棋盘位图中的像素值,并根据透明度的系数计算新的像素值。
4. 将新的像素值保存到指定的数组中。注意,alpha通道的值应该设为255,表示完全不透明。
需要注意的是,该函数并没有对传入的参数进行有效性检查,因此在调用函数之前,需要确保传入的参数都是有效的。
阅读全文