c++ 图像平移画布变大
时间:2011-12-09
来源:互联网
/*************************************************************************
* 函数名称:
* TranslationDIB1()
* 参数:
* LPSTR lpDIBBits - 指向源DIB图像指针
* LONG lWidth - 源图像宽度(象素数)
* LONG lHeight - 源图像高度(象素数)
* LONG lXOffset - X轴平移量(象素数)
* LONG lYOffset - Y轴平移量(象素数)
* 返回值:
* BOOL - 平移成功返回TRUE,否则返回FALSE。
* 说明:
* 该函数用来水平移动DIB图像。函数不会改变图像的大小,移出的部分图像
* 将截去,空白部分用白色填充。
************************************************************************/
BOOL CDibImage::TranslationDIB1(LPSTR lpDIBBits, LONG lWidth, LONG lHeight,
LONG lXOffset, LONG lYOffset)
{
LPSTR lpSrc; // 指向源图像的指针
LPSTR lpDst; // 指向要复制区域的指针
LPSTR lpNewDIBBits; // 指向复制图像的指针
HLOCAL hNewDIBBits;
LONG i; // 象素在新DIB中的坐标
LONG j;
LONG i0; // 象素在源DIB中的坐标
LONG j0;
LONG lLineBytes; // 图像每行的字节数
lLineBytes = WIDTHBYTES(lWidth * 8);// 计算图像每行的字节数
// 暂时分配内存,以保存新图像
hNewDIBBits = LocalAlloc(LHND, (lLineBytes+lXOffset) * (lHeight+lYOffset));
if (hNewDIBBits == NULL)
{
return FALSE;
}
lpNewDIBBits = (char * )LocalLock(hNewDIBBits);
for(i = 0; i < lHeight; i++) // 每行
{
for(j = 0; j < lWidth; j++) // 每列
{
// 指向新DIB第i行,第j个象素的指针
// 注意由于DIB中图像第一行其实保存在最后一行的位置,因此lpDst
// 值不是(char *)lpNewDIBBits + lLineBytes * i + j,而是
// (char *)lpNewDIBBits + lLineBytes * (lHeight - 1 - i) + j
lpDst = (char *)lpNewDIBBits + lLineBytes *(lHeight - 1 - i) + j;//
// 计算该象素在源DIB中的坐标
i0 = i - lXOffset;
j0 = j - lYOffset;
// 判断是否在源图范围内
if( (j0 >= 0) && (j0 < lWidth) && (i0 >= 0) && (i0 < lHeight))
{
// 指向源DIB第i0行,第j0个象素的指针
// 同样要注意DIB上下倒置的问题
lpSrc = (char *)lpDIBBits + (lLineBytes) * (lHeight - 1 - i0) + j0;
*lpDst = *lpSrc; // 复制象素
}
else
{
// 对于源图中没有的象素,直接赋值为255
* ((unsigned char*)lpDst) = 255;
}
}
}
// 复制平移后的图像
memcpy(lpDIBBits, lpNewDIBBits, (lLineBytes) * (lHeight));
LocalUnlock(hNewDIBBits);
LocalFree(hNewDIBBits);
return TRUE;
}
怎么让我的画布变大成 lWidth+lXOffset lHeight+lYOffset
* 函数名称:
* TranslationDIB1()
* 参数:
* LPSTR lpDIBBits - 指向源DIB图像指针
* LONG lWidth - 源图像宽度(象素数)
* LONG lHeight - 源图像高度(象素数)
* LONG lXOffset - X轴平移量(象素数)
* LONG lYOffset - Y轴平移量(象素数)
* 返回值:
* BOOL - 平移成功返回TRUE,否则返回FALSE。
* 说明:
* 该函数用来水平移动DIB图像。函数不会改变图像的大小,移出的部分图像
* 将截去,空白部分用白色填充。
************************************************************************/
BOOL CDibImage::TranslationDIB1(LPSTR lpDIBBits, LONG lWidth, LONG lHeight,
LONG lXOffset, LONG lYOffset)
{
LPSTR lpSrc; // 指向源图像的指针
LPSTR lpDst; // 指向要复制区域的指针
LPSTR lpNewDIBBits; // 指向复制图像的指针
HLOCAL hNewDIBBits;
LONG i; // 象素在新DIB中的坐标
LONG j;
LONG i0; // 象素在源DIB中的坐标
LONG j0;
LONG lLineBytes; // 图像每行的字节数
lLineBytes = WIDTHBYTES(lWidth * 8);// 计算图像每行的字节数
// 暂时分配内存,以保存新图像
hNewDIBBits = LocalAlloc(LHND, (lLineBytes+lXOffset) * (lHeight+lYOffset));
if (hNewDIBBits == NULL)
{
return FALSE;
}
lpNewDIBBits = (char * )LocalLock(hNewDIBBits);
for(i = 0; i < lHeight; i++) // 每行
{
for(j = 0; j < lWidth; j++) // 每列
{
// 指向新DIB第i行,第j个象素的指针
// 注意由于DIB中图像第一行其实保存在最后一行的位置,因此lpDst
// 值不是(char *)lpNewDIBBits + lLineBytes * i + j,而是
// (char *)lpNewDIBBits + lLineBytes * (lHeight - 1 - i) + j
lpDst = (char *)lpNewDIBBits + lLineBytes *(lHeight - 1 - i) + j;//
// 计算该象素在源DIB中的坐标
i0 = i - lXOffset;
j0 = j - lYOffset;
// 判断是否在源图范围内
if( (j0 >= 0) && (j0 < lWidth) && (i0 >= 0) && (i0 < lHeight))
{
// 指向源DIB第i0行,第j0个象素的指针
// 同样要注意DIB上下倒置的问题
lpSrc = (char *)lpDIBBits + (lLineBytes) * (lHeight - 1 - i0) + j0;
*lpDst = *lpSrc; // 复制象素
}
else
{
// 对于源图中没有的象素,直接赋值为255
* ((unsigned char*)lpDst) = 255;
}
}
}
// 复制平移后的图像
memcpy(lpDIBBits, lpNewDIBBits, (lLineBytes) * (lHeight));
LocalUnlock(hNewDIBBits);
LocalFree(hNewDIBBits);
return TRUE;
}
怎么让我的画布变大成 lWidth+lXOffset lHeight+lYOffset
作者: gao8467524 发布时间: 2011-12-09
该函数用来水平移动DIB图像。函数不会改变图像的大小,移出的部分图像
* 将截去,空白部分用白色填充。
就是改变图像大小,移出的部分不截去
* 将截去,空白部分用白色填充。
就是改变图像大小,移出的部分不截去
作者: gao8467524 发布时间: 2011-12-11
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28