请问如何在使用SetDIBitsToDevice画图时,把图像翻转180度?或如何把指向一个图像的指针的内存块倒置,使该图像在显示时翻转180度?
解决方案 »
- wtl项目CWTLClock2View::OnTimer : function does not take 1 arguments 出错
- 大家好,请教一个图形时钟绘制的问题
- ATL编写COM组件时,如何为组件接口中的方法的参数设定缺省值?
- 怎样实现层叠窗口
- VC++欢迎页
- 给些招聘网站吧
- 请教,Word、IE用的是什么显示技术?
- 【求助】看到一些对Excel进行操作的程序中都包含Excel8.h头文件,可是到哪里找Excel8.h这个文件?
- 帮帮忙,有谁知道:VC中登录域或者登录机器的函数是哪个??
- [VB]问一个老问题,在COM里你们是如何实现这种情况的?100分赠送讨论者!
- 学习sdk应看哪些书?
- 怎么画线
我简单说说你需要的第二种方式(书上抄的):
* 函数名称:
* MirrorDIB()
*
* 参数:
* LPSTR lpDIBBits - 指向源DIB图像指针
* LONG lWidth - 源图像宽度(象素数)
* LONG lHeight - 源图像高度(象素数)
* BOOL bDirection - 镜像的方向,TRUE表示水平镜像,FALSE表示垂直镜像
*
* 返回值:
* BOOL - 镜像成功返回TRUE,否则返回FALSE。
*
* 说明:
* 该函数用来镜像DIB图像。可以指定镜像的方式是水平还是垂直。
*
************************************************************************/BOOL WINAPI MirrorDIB(LPSTR lpDIBBits, LONG lWidth, LONG lHeight, BOOL bDirection)
{
// 指向源图像的指针
LPSTR lpSrc;
// 指向要复制区域的指针
LPSTR lpDst;
// 指向复制图像的指针
LPSTR lpBits;
HLOCAL hBits; // 循环变量
LONG i;
LONG j;
// 图像每行的字节数
LONG lLineBytes;
// 计算图像每行的字节数
lLineBytes = WIDTHBYTES(lWidth * 8);
// 暂时分配内存,以保存一行图像
hBits = LocalAlloc(LHND, lLineBytes);
if (hBits == NULL)
{
// 分配内存失败
return FALSE;
}
// 锁定内存
lpBits = (char * )LocalLock(hBits);
// 判断镜像方式
if (bDirection)
{
// 水平镜像
// 针对图像每行进行操作
for(i = 0; i < lHeight; i++)
{
// 针对每行图像左半部分进行操作
for(j = 0; j < lWidth / 2; j++)
{
// 指向倒数第i行,第j个象素的指针
lpSrc = (char *)lpDIBBits + lLineBytes * i + j;
// 指向倒数第i行,倒数第j个象素的指针
lpDst = (char *)lpDIBBits + lLineBytes * (i + 1) - j;
// 备份一个象素
*lpBits = *lpDst;
// 将倒数第i行,第j个象素复制到倒数第i行,倒数第j个象素
*lpDst = *lpSrc;
// 将倒数第i行,倒数第j个象素复制到倒数第i行,第j个象素
*lpSrc = *lpBits;
}
}
}
else
{
// 垂直镜像 // 针对上半图像进行操作
for(i = 0; i < lHeight / 2; i++)
{
// 指向倒数第i行象素起点的指针
lpSrc = (char *)lpDIBBits + lLineBytes * i;
// 指向第i行象素起点的指针
lpDst = (char *)lpDIBBits + lLineBytes * (lHeight - i - 1);
// 备份一行,宽度为lWidth
memcpy(lpBits, lpDst, lLineBytes);
// 将倒数第i行象素复制到第i行
memcpy(lpDst, lpSrc, lLineBytes);
// 将第i行象素复制到倒数第i行
memcpy(lpSrc, lpBits, lLineBytes);
}
}
// 释放内存
LocalUnlock(hBits);
LocalFree(hBits);
// 返回
return TRUE;
}