点构成图形的放大问题

xt_jat 2002-07-14 09:35:02
我在用一系列点构成图形时碰到了以下问题,请求帮助:
  如:原来点的X坐标 1,2,3,4,5,6, 7
放大(乘1.2)后,成了1,2,3,4,6,7 (取整,5坐标的点没了)
  这会在点构成的图形上形成一条条的白线,请问有解决办法吗
...全文
256 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
xt_jat 2002-07-14
  • 打赏
  • 举报
回复
up
liutang 2002-07-14
  • 打赏
  • 举报
回复
放大不是简单的把图拉开,其中没有的点是需要你通过计算得到的,不知你有没有学过数值计算。通过几个点画出曲线可以用插值的方法来做到,就是你算出每一个点的坐标,然后连接起来就得到了曲线了。当然最简单的你直接把已经存在的点用直线连起来也勉强能算一条曲线,但那效果太差。
算法一时讲不清楚,但我建议你找一些数值计算的书来看一下。
lxg_dut 2002-07-14
  • 打赏
  • 举报
回复
参考一下:
HGLOBAL WINAPI ZoomImage(LPSTR lpDIB, float fXZoomRatio, float fYZoomRatio)

{

// 源图像的宽度和高度
LONG lWidth;
LONG lHeight;

// 缩放后图像的宽度和高度
LONG lNewWidth;
LONG lNewHeight;

// 缩放后图像的宽度(lNewWidth',必须是4的倍数)
LONG lNewLineBytes;

// 指向源图像的指针
LPSTR lpDIBBits;

// 指向源象素的指针
LPSTR lpSrc;

// 缩放后新DIB句柄
HDIB hDIB;

// 指向缩放图像对应象素的指针
LPSTR lpDst;

// 指向缩放图像的指针
LPSTR lpNewDIB;
LPSTR lpNewDIBBits;

// 指向BITMAPINFO结构的指针(Win3.0)
LPBITMAPINFOHEADER lpbmi;

// 指向BITMAPCOREINFO结构的指针
LPBITMAPCOREHEADER lpbmc;

// 循环变量(象素在新DIB中的坐标)
LONG i;
LONG j;

// 象素在源DIB中的坐标
LONG i0;
LONG j0;

// 图像每行的字节数
LONG lLineBytes;

// 找到源DIB图像象素起始位置
lpDIBBits = ::FindDIBBits(lpDIB);

// 获取图像的宽度
lWidth = ::DIBWidth(lpDIB);

// 计算图像每行的字节数
lLineBytes = WIDTHBYTES(lWidth * 8);

// 获取图像的高度
lHeight = ::DIBHeight(lpDIB);

// 计算缩放后的图像实际宽度
// 此处直接加0.5是由于强制类型转换时不四舍五入,而是直接截去小数部分
lNewWidth = (LONG) (::DIBWidth(lpDIB) / fXZoomRatio + 0.5);

// 计算新图像每行的字节数
lNewLineBytes = WIDTHBYTES(lNewWidth * 8);

// 计算缩放后的图像高度
lNewHeight = (LONG) (lHeight / fYZoomRatio + 0.5);

// 分配内存,以保存新DIB
hDIB = (HDIB) ::GlobalAlloc(GHND, lNewLineBytes * lNewHeight + *(LPDWORD)lpDIB + ::PaletteSize(lpDIB));

// 判断是否内存分配失败
if (hDIB == NULL)
{
// 分配内存失败
return NULL;
}

// 锁定内存
lpNewDIB = (char * )::GlobalLock((HGLOBAL) hDIB);

// 复制DIB信息头和调色板
memcpy(lpNewDIB, lpDIB, *(LPDWORD)lpDIB + ::PaletteSize(lpDIB));

// 找到新DIB象素起始位置
lpNewDIBBits = ::FindDIBBits(lpNewDIB);

// 获取指针
lpbmi = (LPBITMAPINFOHEADER)lpNewDIB;
lpbmc = (LPBITMAPCOREHEADER)lpNewDIB;

// 更新DIB中图像的高度和宽度
if (IS_WIN30_DIB(lpNewDIB))
{
// 对于Windows 3.0 DIB
lpbmi->biWidth = lNewWidth;
lpbmi->biHeight = lNewHeight;
}
else
{
// 对于其它格式的DIB
lpbmc->bcWidth = (unsigned short) lNewWidth;
lpbmc->bcHeight = (unsigned short) lNewHeight;
}

// 针对图像每行进行操作
for(i = 0; i < lNewHeight; i++)
{
// 针对图像每列进行操作
for(j = 0; j < lNewWidth; j++)
{

// 指向新DIB第i行,第j个象素的指针
// 注意此处宽度和高度是新DIB的宽度和高度
lpDst = (char *)lpNewDIBBits + lNewLineBytes * (lNewHeight - 1 - i) + j;

// 计算该象素在源DIB中的坐标,以便将原图的像素值取过来
i0 = (LONG) (i * fYZoomRatio + 0.5);
j0 = (LONG) (j * fXZoomRatio + 0.5);

// 判断是否在源图范围内
if( (j0 >= 0) && (j0 < lWidth) && (i0 >= 0) && (i0 < lHeight))
{

// 指向源DIB第i0行,第j0个象素的指针
lpSrc = (char *)lpDIBBits + lLineBytes * (lHeight - 1 - i0) + j0;

// 复制象素
*lpDst = *lpSrc;
}
else
{
// 对于源图中没有的象素,直接赋值为255
* ((unsigned char*)lpDst) = 255;
}

}
}

// 返回
return hDIB;
}
xt_jat 2002-07-14
  • 打赏
  • 举报
回复
liutang(老狐狸), 能给个例子吗?, 或者有什么电子书吗?

16,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧