内存DC中的图片的旋转,急。

daredjever 2009-11-10 04:53:35
不知到这里会不会算我重复发帖,在语言栏发过了。

我在内存DC中绘制了一些东西,当然内存DC中已经选入一张bitmap作为绘制背景了的。
一般就是通过bitblt函数把内存DC中绘制的内容绘制出来。
但是现在需要将这些内容,也就是这张bitmap旋转一定的角度再显示出来。
网上的关于位图的旋转操作我看了不少,也试验了不少,基本能成功,但是那些都是针对DIB也就是设备无关位图进行的操作。
现在的位图位于内存DC中,请问该怎么处理呢?
可以把代码发到邮箱daredjever@126.com。
...全文
339 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
麻浦区保安 2012-07-18
  • 打赏
  • 举报
回复
很抱歉的告诉你,不能在内存DC里面做这种操作,即使操作了显示出来也是黑漆漆一片,最终还是要落在pDc上显示。
ezhuyin 2009-11-11
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 lambochan 的回复:]
这个由于没有缩放,不会导致pixel与pixel之间的不连续,一般用双线性插值就可以解决.
刚性旋转并非会如想象中失真严重~~
[/Quote]

嗯。还是需要插值处理的。每次旋转还是需要从内存DC中的原始图处理而来,不宜使用旋转处理完的图再旋转。
lambochan 2009-11-11
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 ezhuyin 的回复:]
按像素旋转不适用于地图这样精细的图形。因为根据三角函数计算目标像素以后,坐标一般就变成了浮点数,如果这时候取整,会出现问题,因为有可能两个点的坐标计算取整后是同一个点。这样的话,图形失真会很严重。
[/Quote]

这个由于没有缩放,不会导致pixel与pixel之间的不连续,一般用双线性插值就可以解决.
刚性旋转并非会如想象中失真严重~~
ezhuyin 2009-11-11
  • 打赏
  • 举报
回复
按像素旋转不适用于地图这样精细的图形。因为根据三角函数计算目标像素以后,坐标一般就变成了浮点数,如果这时候取整,会出现问题,因为有可能两个点的坐标计算取整后是同一个点。这样的话,图形失真会很严重。
lambochan 2009-11-11
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 daredjever 的回复:]
引用 6 楼 lambochan 的回复:
容易..随便转~~


你说容易确实给了我信心,时间很紧,但是我还是没头绪,我现在做到从文件读取一张图片获得一个CBitmap对象,然后对其旋转。

现在问题是要旋转的位图是在memDc中的,实在程序中绘制的。怎么去操作旋转呢?
你参看我写的大概意思的代码,就是不知道怎么把现在的旋转代码或方法同memDC中的memBitmap联系起来。
[/Quote]

假如可以使用SetWorldTransfrom()这个函数的话,转你那DDB就是小菜一碟。
假如不能,那么还可以:
一:旋转DDB
计算旋转后所需要包含你这幅DDB的大小,重create一个DDB(compatible bitmap),然后使用pixel来旋转:
for(xxxx)
for(XXXXXXXX)
destDDB.SetPixel(x,y,sourceDDB.GetPixel(sourceX,sourceY));
不过就慢。。
二:旋转位数据
create一幅等大的dib(CreateDIBSection()),把你的memdc bitblt到这个dib,然后就可以取其位数据指针ppvbits去旋转了。。这个旋转方法流行代码多的是,旋转DIB而已..
daredjever 2009-11-11
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 lambochan 的回复:]
容易..随便转~~
[/Quote]

你说容易确实给了我信心,时间很紧,但是我还是没头绪,我现在做到从文件读取一张图片获得一个CBitmap对象,然后对其旋转。

现在问题是要旋转的位图是在memDc中的,实在程序中绘制的。怎么去操作旋转呢?
你参看我写的大概意思的代码,就是不知道怎么把现在的旋转代码或方法同memDC中的memBitmap联系起来。
daredjever 2009-11-11
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 b2b160 的回复:]
PagBlt
[/Quote]

我是在EVC环境下写的程序,所以很多函数是不能用的。你说的这个好像就不能。

pdc的bitblt可以把内存中的一张图片绘制出来,我现在就是要把内存中的这张图旋转后再绘制出来。
请问怎么直接操作内存中的memBitmap,网上的位图操作都是直接操作DIB的,我看过一些,现在这个应该叫做DDB吧,不知道怎么操作。
daredjever 2009-11-11
  • 打赏
  • 举报
回复
回复fandh:
我的memDc里需要绘制的内容很复杂,可能包括很多张图片的拼接及剪裁。但是如果我把这些图片不通过memDC直接使用Rotate方法的话是可以单独绘制一张旋转的图片的,单独时的绘制如下:

CBitmap bitmap;
CString path;
bitmap.Attach(SHLoadDIBitmap(path));
是通过这样获得的bitmap;
然后调用写好的CBitmap的方法
bitmap.rotate(pdc,45);就可以在屏幕上输出旋转的图片了。
但是现在我不是想要显示一张存在的图片,我的图片在memDc中,而且是在程序中根据情况绘制的很多图片组成的一张bitmap,也就是之前说的memBitmap,
直接用 memBitmap.rotate(pdc,45);这样绘制不出来。
请问有什么方法可以把内存中的这张memBitmap旋转后绘制出来啊。
可以不通过rotate函数,先旋转再还是使用pdc的bitblth绘制也行。

请做过的朋友说详细点,至少提供点做的方法,有代码我自己学习也好。




b2b160 2009-11-11
  • 打赏
  • 举报
回复
PagBlt
fandh 2009-11-11
  • 打赏
  • 举报
回复
你是先要画出或者读入BMP,然后旋转的,你确信你读入的BMP或者画的BMP与旋转的BMP是同一个?还有,rotate函数成功了么?建议你调试一下!
leechrockgames 2009-11-11
  • 打赏
  • 举报
回复
bmp的做过,其它方法是访问纹理像素,x=cos(angle);y=sin(angle)
lambochan 2009-11-10
  • 打赏
  • 举报
回复
容易..随便转~~
daredjever 2009-11-10
  • 打赏
  • 举报
回复
回复fandh:

谢谢关注先。
程序很大,但是与这个问题无关,我把问题核心代码给你写一下吧。

在ondraw(CDC *pDC)函数中:

CDC memDC;
CBitmap memBitmap;

memDC.createcompatibleDC(pDC);
memBitmap.createcompatiblebitmap(pdc);
memDc.selectObject(memBitmap);
draw(memDC);//这个函数实现去在memdc上绘制各种东西,包括图片和文字图像等。

pdc->BitBlt(0,0,600,600,memDC,0,0,SRCCOPY);//吧内存DC中的内容画出来。


现在需要把memDC中的内容旋转任意角度画出来,其实memDC 中绘制的是地图!!导航用的。

我在网上找到一个CBitmap的寄生类,其中实现了一个rotate函数。
rotate(cdc pdc, int angle);


任意的bitmap
bitmap.rotate(pdc,45);就能按照参数正确的绘制在了屏幕上。

如果bitmap是直接读取磁盘的文件得到的,则结果可以。

但是我直接用我的
memBitmap.rotate(pdc,45);就画不出来内容,只有一个黑框。内容全部是黑的。
旋转memBitmap的框架了的。
所以怀疑是不是因为memBitmap是设备相关的原因?




快乐鹦鹉 2009-11-10
  • 打赏
  • 举报
回复
网上找找下个现成的类吧。
fandh 2009-11-10
  • 打赏
  • 举报
回复
设备有关与设备无关,旋转是一样的,楼主的代码量大么?不大的话,上传上来,让谁帮你调试一下!
_JeffreyWu 2009-11-10
  • 打赏
  • 举报
回复
三角函数旋转.
peterormike 2009-11-10
  • 打赏
  • 举报
回复
那你就旋转了再画到dc里面啊

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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