CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  图形处理/算法

4位16色图像旋转问题

楼主tomsor(康河)2005-01-04 11:44:34 在 VC/MFC / 图形处理/算法 提问

网上及教材上普遍给出的是8位256色的图像旋转代码,请问有4位16色图像旋转代码吗?  
    谢谢! 问题点数:0、回复次数:5Top

1 楼tomsor(康河)回复于 2005-01-05 15:05:15 得分 0

怎么没人帮帮我啊!Top

2 楼fanoble(fanoble)回复于 2005-01-07 08:01:13 得分 0

应该是一样的道理吧~~~Top

3 楼Wyhshp(阿呆)回复于 2005-01-07 19:44:22 得分 0

算法是一样的,只是像素操作上有区别。Top

4 楼FengYuanMSFT((6.4 被封杀)袁峰 http://fengyuancom.spaces.live.com)回复于 2005-01-08 07:41:39 得分 0

http://safariexamples.informit.com/0130869856/Top

5 楼tomsor(康河)回复于 2005-01-11 11:14:22 得分 0

唉,我有256色图像旋转的代码,却不知道怎样改成16色图像旋转的代码,有谁可以帮帮我吗?具体代码如下:  
    HGLOBAL   WINAPI   RotateDIB(LPSTR   lpDIB,   int   iRotateAngle)  
  {  
   
  //   源图像的宽度和高度  
  LONG lWidth;  
  LONG lHeight;  
   
  //   旋转后图像的宽度和高度  
  LONG lNewWidth;  
  LONG lNewHeight;  
   
  //   图像每行的字节数  
  LONG lLineBytes;  
   
  //   旋转后图像的宽度(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;  
   
  //   旋转角度(弧度)  
  float fRotateAngle;  
   
  //   旋转角度的正弦和余弦  
  float fSina,   fCosa;  
   
  //   源图四个角的坐标(以图像中心为坐标系原点)  
  float fSrcX1,fSrcY1,fSrcX2,fSrcY2,fSrcX3,fSrcY3,fSrcX4,fSrcY4;  
   
  //   旋转后四个角的坐标(以图像中心为坐标系原点)  
  float fDstX1,fDstY1,fDstX2,fDstY2,fDstX3,fDstY3,fDstX4,fDstY4;  
   
  //   两个中间常量  
  float f1,f2;  
   
  //   找到源DIB图像象素起始位置  
  lpDIBBits   =   ::FindDIBBits(lpDIB);  
   
  //   获取图像的"宽度"(4的倍数)  
  lWidth   =   ::DIBWidth(lpDIB);  
   
  //   计算图像每行的字节数  
  lLineBytes   =   WIDTHBYTES(lWidth   *   8);  
   
  //   获取图像的高度  
  lHeight   =   ::DIBHeight(lpDIB);  
   
  //   将旋转角度从度转换到弧度  
  fRotateAngle   =   (float)   RADIAN(iRotateAngle);  
   
  //   计算旋转角度的正弦  
  fSina   =   (float)   sin((double)fRotateAngle);  
   
  //   计算旋转角度的余弦  
  fCosa   =   (float)   cos((double)fRotateAngle);  
   
  //   计算原图的四个角的坐标(以图像中心为坐标系原点)  
  fSrcX1   =   (float)   (-   (lWidth     -   1)   /   2);  
  fSrcY1   =   (float)   (     (lHeight   -   1)   /   2);  
  fSrcX2   =   (float)   (     (lWidth     -   1)   /   2);  
  fSrcY2   =   (float)   (     (lHeight   -   1)   /   2);  
  fSrcX3   =   (float)   (-   (lWidth     -   1)   /   2);  
  fSrcY3   =   (float)   (-   (lHeight   -   1)   /   2);  
  fSrcX4   =   (float)   (     (lWidth     -   1)   /   2);  
  fSrcY4   =   (float)   (-   (lHeight   -   1)   /   2);  
   
  //   计算新图四个角的坐标(以图像中心为坐标系原点)  
  fDstX1   =     fCosa   *   fSrcX1   +   fSina   *   fSrcY1;  
  fDstY1   =   -fSina   *   fSrcX1   +   fCosa   *   fSrcY1;  
  fDstX2   =     fCosa   *   fSrcX2   +   fSina   *   fSrcY2;  
  fDstY2   =   -fSina   *   fSrcX2   +   fCosa   *   fSrcY2;  
  fDstX3   =     fCosa   *   fSrcX3   +   fSina   *   fSrcY3;  
  fDstY3   =   -fSina   *   fSrcX3   +   fCosa   *   fSrcY3;  
  fDstX4   =     fCosa   *   fSrcX4   +   fSina   *   fSrcY4;  
  fDstY4   =   -fSina   *   fSrcX4   +   fCosa   *   fSrcY4;  
   
  //   计算旋转后的图像实际宽度  
  lNewWidth     =   (LONG)   (   max(   fabs(fDstX4   -   fDstX1),   fabs(fDstX3   -   fDstX2)   )   +   0.5);  
   
  //   计算新图像每行的字节数  
  lNewLineBytes   =   WIDTHBYTES(lNewWidth   *   8);  
   
  //   计算旋转后的图像高度  
  lNewHeight   =   (LONG)   (   max(   fabs(fDstY4   -   fDstY1),   fabs(fDstY3   -   fDstY2)   )     +   0.5);  
   
  //   两个常数,这样不用以后每次都计算了  
  f1   =   (float)   (-0.5   *   (lNewWidth   -   1)   *   fCosa   -   0.5   *   (lNewHeight   -   1)   *   fSina  
  +   0.5   *   (lWidth     -   1));  
  f2   =   (float)   (   0.5   *   (lNewWidth   -   1)   *   fSina   -   0.5   *   (lNewHeight   -   1)   *   fCosa  
  +   0.5   *   (lHeight   -   1));  
   
  //   分配内存,以保存新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)   (-((float)   j)   *   fSina   +   ((float)   i)   *   fCosa   +   f2   +   0.5);  
  j0   =   (LONG)   (   ((float)   j)   *   fCosa   +   ((float)   i)   *   fSina   +   f1   +   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;  
  }  
   
  Top

相关问题

  • 关于位映射图像旋转的一个技术问题
  • 图像旋转函数
  • 1byte的图像旋转
  • 图像旋转的问题
  • 求解photoshop的图像旋转算法
  • 如何旋转图像中的文字?
  • 图像旋转, 有什么好库???
  • 关于图像旋转算法
  • 位图旋转
  • 高分回赠:如何实现图像任意旋转???

关键词

  • 图像
  • 指针
  • 坐标
  • 代码
  • 旋转
  • fsrcy
  • fsrcx
  • 指向
  • 象素
  • 宽度

得分解答快速导航

  • 帖主:tomsor

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

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