CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C++ Builder >  基础类

位图旋转

楼主shh03(半山腰)2002-10-10 20:25:17 在 C++ Builder / 基础类 提问

将位图(   DIB,单色,宽=高)旋转90度,我采用逐个计算新位图的像素点的方法  
  但太慢,旋转一个800   X   800   的位图用了一二十秒,相信有更好的办法  
   
  问题点数:50、回复次数:7Top

1 楼shh03(半山腰)回复于 2002-10-10 20:50:10 得分 0

高手大哥帮帮忙吧Top

2 楼aawolf(羌狼)回复于 2002-10-10 21:11:25 得分 20

TBitmap里不是有个旋转的方法吗?Top

3 楼sjd163(sjd163)回复于 2002-10-10 21:24:39 得分 5

用坐标变换:(i,j)->(x,y)  
  x=i*cos(d)-j*sin(d);  
  y=i*sin(d)+j*cos(d);  
  Top

4 楼hdaq(一生何求)回复于 2002-10-10 21:28:44 得分 0

搜索一下以前的帖子,有好多。Top

5 楼shh03(半山腰)回复于 2002-10-10 21:51:12 得分 0

to   sjd163(sjd163):  
    是图形学中的吧,学过了好久都没用过,书中又没有代码,好像涉及到了  
  矩阵操作吧,有没有简单一点的  
  Top

6 楼CCLIS(www.cclis.com)回复于 2002-10-10 23:21:49 得分 5

建议看一下  
  VC图象处理   这本书,程序是用VC写的,算法经典。Top

7 楼jishiping(JSP 季世平)回复于 2002-10-11 01:14:53 得分 20

单色DIB顺时针旋转90度:  
  HANDLE   RotateMonoDib(HANDLE   hDib)  
  {  
          int   W0,   H0;  
          int   Pitch0;  
          int   Pitch1;  
          BYTE   Mask0;  
          BYTE   Mask1;  
          BYTE   *p0,   *p1;  
          HANDLE   hDib1;  
          BITMAPINFOHEADER*   pbih;  
          BITMAPINFOHEADER*   pbih1;  
   
          pbih   =   (BITMAPINFOHEADER*)  
                  GlobalLock(hDib);  
          if   (pbih==NULL)   return   NULL;  
          if   (pbih->biBitCount   !=   1)   {  
                  //不是单色的Dib  
                  GlobalUnlock(hDib);  
                  return   NULL;  
          }  
   
          W0   =   pbih->biWidth;  
          H0   =   pbih->biHeight;  
          Pitch0   =   (W0+31)/32*4;  
          Pitch1   =   (H0+31)/32*4;  
          hDib1   =   GlobalAlloc(GHND,  
                  Pitch1*W0);  
          if   (hDib1   ==   NULL)   {  
                  //内存不够  
                  GlobalUnlock(hDib);  
                  return   NULL;  
          }  
          pbih1   =   (BITMAPINFOHEADER*)  
                  GlobalLock(hDib1);  
          memcpy(pbih1,   pbih,   40+4*2);  
          pbih1->biWidth   =   H0;  
          pbih1->biHeight   =   W0;  
          pbih1->biSizeImage   =   0;  
          p1   =   (BYTE*)(pbih1+1)   +   4*2;  
          memset(p1,   0,   Pitch1*W0);  
          for(int   h=0;   h<W0;   h++)   {  
                  int   X0   =   W0   -   1   -   h;  
                  Mask0   =   0x80   >>   (X0%8);  
                  Mask1   =   0x80;  
                  p0   =   (BYTE*)(pbih+1)   +  
                          4*2   +   (X0   /   8);  
                  p1   =   (BYTE*)(pbih1+1)   +  
                          4*2   +   Pitch1   *   h;  
                  for(int   w=0;   w<H0;   w++)   {  
                          if   (*p0   &   Mask0)  
                                  *p1   |=   Mask1;  
                          if   ((Mask1>>=1)==0)   {  
                                  Mask1   =   0x80;   p1++;  
                          }  
                          p0   +=   Pitch0;  
                  }  
          }  
          GlobalUnlock(hDib);  
          GlobalUnlock(hDib1);  
          return   hDib1;  
  }Top

相关问题

  • 图片旋转
  • 关于位图旋转的问题?
  • !!!!!! 如何旋转一个位图?
  • 位图旋转算法 谁了解啊
  • 如何90度旋转32位的bmp图啊?为什么我的函数只能旋转24位的bmp!
  • 各位兄弟!!!请问谁有位图旋转的例子~~
  • Re:VC位图旋转问题后续分数
  • Re:VC位图旋转问题后续分数2
  • Re:VC位图旋转问题后续分数3
  • Re:VC位图旋转问题后续分数4

关键词

  • null
  • pbih
  • hdib
  • pitch
  • 旋转
  • bitmapinfoheader
  • 单色
  • dib
  • 图
  • mask

得分解答快速导航

  • 帖主:shh03
  • aawolf
  • sjd163
  • CCLIS
  • jishiping

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo