CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
花落谁家,你作主! 盛大widget设计大赛英雄榜
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  图形处理/算法

怎样把一个24位的灰度图转为8位的图?要gdi/gdi+两种方式实现

楼主Z27149(卧底)2004-09-03 22:25:14 在 VC/MFC / 图形处理/算法 提问

如题 问题点数:0、回复次数:7Top

1 楼fanoble(fanoble)回复于 2004-09-04 13:17:10 得分 0

24位的灰度图?Top

2 楼CaptainIII(山上人)回复于 2004-09-04 13:50:07 得分 0

24bit   bmp   change   to   8bit   bmp?Top

3 楼Z27149(卧底)回复于 2004-09-04 14:58:12 得分 0

对,24位bmp->8位bmpTop

4 楼puhuofeie(扑火飞蛾)回复于 2004-09-04 15:43:01 得分 0

GDI+我不会。  
  24位转8位。。。  
  我有个函数。  
  不知道是否满足楼主的要求!  
   
  /仅对8位,24位图像进行灰度处理,将灰度图存为   8   位,并赋值处理数组。  
  void   CDib::Gray()  
  {  
  long   linebits   =   WIDTHBYTES(8*m_nWidth);  
  //分配处理数组内存  
  if(!m_pDataS)  
  {  
  m_pDataS   =   new   double[linebits*m_nHeight];  
  }  
   
  unsigned   char   bitCount=GetBitCount();  
        //   灰度映射表  
  unsigned   char   bMap[256];  
  if(bitCount==8)  
  {  
   
  for(int   i=0;i<256;i++)  
  {  
  bMap[i]=(unsigned   char)(0.299*m_pRGBQuad[i].rgbRed+  
  0.587*m_pRGBQuad[i].rgbGreen+  
  0.114*m_pRGBQuad[i].rgbBlue+0.5);  
  m_pRGBQuad[i].rgbRed=i;  
  m_pRGBQuad[i].rgbGreen=i;  
  m_pRGBQuad[i].rgbBlue=i;  
  m_pRGBQuad[i].rgbReserved=0;  
  }  
  //   更换每个象素的颜色索引(即按照灰度映射表换成灰度值)  
  long   lw=WIDTHBYTES(m_nWidth*8);  
  for(long   j=0l;j<m_nHeight;j++)  
  {  
  for(long   i=0l;i<m_nWidth;i++)  
  {  
  long   jj=j*lw+i;  
  m_pDibData[jj]=bMap[m_pDibData[jj]];  
  m_pDataS[j*m_nWidth+i]=(double)bMap[m_pDibData[jj]];  
  }  
  }  
  }  
  else   if(bitCount==24)  
  {  
  //计算相应的   8   位图大小  
  unsigned   long   dwFileSize   =   sizeof(BITMAPFILEHEADER)   +   m_pBitmapInfoHeader->biSize  
  +   256   *   sizeof(RGBQUAD)   +   WIDTHBYTES(m_nWidth*8)   *   m_nHeight;  
   
  //写   BITMAPFILEHEADER  
  BITMAPFILEHEADER   bfh;  
  memcpy(&bfh,m_pBitmapFileHeader,sizeof(BITMAPFILEHEADER));  
  bfh.bfOffBits   =   sizeof(BITMAPFILEHEADER)   +   m_pBitmapInfoHeader->biSize  
  +   256   *   sizeof(RGBQUAD);  
  bfh.bfSize   =   dwFileSize;  
  m_fileLeng   =   dwFileSize;  
  //写   BITMAPINFOHEADER  
  BITMAPINFOHEADER   bih;  
  memcpy(&bih,m_pBitmapInfoHeader,m_pBitmapInfoHeader->biSize);  
  bih.biBitCount   =   8;  
  bih.biSizeImage   =   (unsigned   long)WIDTHBYTES(m_nWidth*8)   *   (unsigned   long)m_nHeight;  
  bih.biClrUsed   =   256;  
   
  //写   RGBQUAD  
  RGBQUAD   rgbq[256];  
  for(int   i=0;i<256;i++)  
  {  
  rgbq[i].rgbRed=i;  
  rgbq[i].rgbGreen=i;  
  rgbq[i].rgbBlue=i;  
  rgbq[i].rgbReserved=0;  
  }  
   
  //写位图数据  
  unsigned   char*   pData   =   new   unsigned   char[bih.biSizeImage];  
  long   lw=WIDTHBYTES(m_nWidth*24);  
   
  for(long   j=0l;j<m_nHeight;j++)  
  {  
  for(long   i=0l;i<m_nWidth;i++)  
  {  
  long   jj=j*lw;  
  long   ii=3*i;  
  unsigned   char   gray   =   (unsigned   char)(0.299*(m_pDibData[jj+ii])+  
  0.587*(m_pDibData[jj+ii+1])+0.114*(m_pDibData[jj+ii+2])+0.5);  
  pData[j*linebits+i]   =   gray;  
  m_pDataS[j*linebits+i]   =   gray;  
  }  
  }  
  //重新申请内存文件  
  m_pFileData   =   m_memFile.Detach();  
  ASSERT(m_pFileData   =   (BYTE   *)   realloc((void   *   )m_pFileData,dwFileSize));  
  m_memFile.Attach(m_pFileData,dwFileSize,   GROWBYTES);  
  m_memFile.Seek(0l,CFile::begin);  
  m_memFile.Write(&bfh,sizeof(BITMAPFILEHEADER));  
  m_memFile.Write(&bih,sizeof(BITMAPINFOHEADER));  
  m_memFile.Write(rgbq,256   *   sizeof(RGBQUAD));  
  m_memFile.Write(pData,bih.biSizeImage);  
   
  SetPara();  
  delete[]   pData;  
  }  
  }  
   
  还有一些相关的函数,如果楼主觉得可以,我可以把这个CDib类给你。  
  Top

5 楼Z27149(卧底)回复于 2004-09-04 15:59:01 得分 0

谢谢~~~  
  zaqizaba001@163.comTop

6 楼keiy()回复于 2004-09-04 16:18:58 得分 0

http://www.chinaoak.com/download/sources/multimedia.htm  
  其中imageedit2有你要的Top

7 楼CaptainIII(山上人)回复于 2004-09-05 11:58:35 得分 0

gdi+应该很简单,算法已经提供,各种格式的转换.Top

相关问题

  • 请问如何把有灰度的图片转为黑白的?
  • 如何实现将灰度图像转换伪彩色图像????
  • 帮忙看一下这个把555的16bit图像转为8bit(256灰度)图像的函数哪里错啦?
  • 我是一个新人,现在急需VC++或BCB把彩图转为灰度的代码
  • 图像问题 请问如何把 真彩图像 分别转为 256色索引图 和 灰度图
  • 请问怎么编程实现24bit BMP file转化为256色 灰度
  • 请问怎么编程实现24bit BMP file转化为256色 灰度
  • javascript在客户端如何实现任意调节图片的灰度?
  • 如何用VC实现,彩色图像转化成灰度图像?我的分数太多了,一定给分。
  • C#的ASP.NET中如何实现将字符串转为ASCII,将ASCII转为字符串?急!!!

关键词

  • gdi+
  • 灰度
  • gdi
  • bih
  • pbitmapinfoheader
  • bfh
  • widthbytes
  • bisize
  • nheight
  • nwidth

得分解答快速导航

  • 帖主:Z27149

相关链接

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

广告也精彩

反馈

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