返回信息流我想通过像素点到像素点复制的方法实现图像逆时针旋转90度的功能。我的思路是这样的:通过对新图像每行每列的操作——指针指向新图像上某行某列的一个像素点,然后寻找这一像素点在源图像上该对应像素点的坐标,用一指针指向源图像上该点,将该点内容赋给新图像上的点,循环实现所有点的操作,最后实现旋转。
部分代码如下:
// 针对新图像每行进行操作
for(i = 0; i < lNewHeight; i++)
{
//针对新图像每列进行操作
for(j = 0; j < lNewWidth; j++)
{
// 指向新DIB第i行,第j个象素的指针
// 注意此处宽度和高度是新DIB的宽度和高度
lpDst = (char *)lpNewDIBBits + lNewLineBytes *i + j; //lpNewDIBBits是指向数据段起始地址的指针,lNewLineBytes是每行的字节数
// 计算该象素在源DIB中的坐标(由于是逆时针旋转90度,新图像的高是源图像的宽,新图像的宽是源图像的高,我直接计算了对应坐标的公式)
i0 =j ;
j0 = lWidth - 1 -i ;
// 判断是否在源图范围内
if( (j0 >= 0) && (j0 < lWidth) && (i0 >= 0)&& (i0 < lHeight))
{
// 指向源DIB第i0行,第j0个象素的指针
lpSrc = (char *)lpDIBBits + lLineBytes * i0 + j0;
// 复制象素
*lpDst = *lpSrc;
}
然而最终显示的图像是一张乱七八糟的图。我认为可能是计算新图像坐标与源图像对应坐标的公式出了问题,但是我自己想不出来是什么原因出错,因为我用了很多像素点来试觉得可以。我水平有限,特来请教各位高手,多谢多谢。
这是一条镜像帖。来源:北邮人论坛 / cpp / #73150同步于 2013/8/10
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
[问题]MFC中关于图像旋转的问题
Elky
2013/8/10镜像同步6 回复
订阅后,新回复会通过你的通知中心匿名送达。
6 条回复
【 在 hangtj 的大作中提到: 】
: 图片信息不单单是像素数据而已的,不同格式的相片有不同的图片存储格式,你可以去谷歌一下相关信息。出发你得到的图片信息只有像素数据可以用你这种方法转。
认真查了查,想了想,改了一些代码,最后可以实现了,多谢多谢!
【 在 colorest 的大作中提到: 】
: 又重新弄个轮子,用opencv多好
用opencv的确很方便,但我是为了给一个很老的程序做功能扩展,如果用opencv跟原程序有很多冲突。所以就想尝试自己写一下,查了一些资料,虽然花了更多时间,但都学到了不少东西。
如果表达成置换更为通用?实现各种奇怪的功能?
【 在 Elky 的大作中提到: 】
: 用opencv的确很方便,但我是为了给一个很老的程序做功能扩展,如果用opencv跟原程序有很多冲突。所以就想尝试自己写一下,查了一些资料,虽然花了更多时间,但都学到了不少东西。