织梦CMS - 轻松建站从此开始!

罗索

PGM格式显示转换代码

落鹤生 发布于 2014-07-23 11:28 点击:次 
今天在做训练图片读取的时候,需要读取PGM图片。经过一番努力寻找,发现网上可以读取PGM图片的图片浏览器空缺,而且可以正常读取的还需要收费。所以上传自己写的PGM图片转成24BitBMP图片的代码供网友参考!
TAG: PGM  

今天在做训练图片读取的时候,需要读取PGM图片。经过一番努力寻找,发现网上可以读取PGM图片的图片浏览器空缺,而且可以正常读取的还需要收费。所以上传自己写的PGM图片转成24BitBMP图片的代码供网友参考!

 

  1. BOOL ImageDib::ReadPGM(LPCTSTR lpszPathName) 
  2. //pgm文件头信息 
  3. char *fStream; 
  4. int arg[4]; 
  5. //读模式打开图像文件 
  6. CFile file; 
  7. int i,j,start; 
  8. int tempnum; 
  9. char countarg; 
  10. if (!file.Open(lpszPathName, CFile::modeRead | CFile::shareDenyWrite)) 
  11. return FALSE; 
  12. //读取文件类型 
  13. fStream = new char[file.GetLength()]; 
  14. file.Read(fStream,file.GetLength()); 
  15. countarg = 0; 
  16. tempnum = 0; 
  17. for(i = 0; i < (int)file.GetLength(); i++) 
  18. //临时保存参数 
  19. if(fStream[i] >= '0' && fStream[i] <= '9'
  20. tempnum = tempnum * 10 + fStream[i] - '0'
  21. //判断是否又是一个新参数的开始 
  22. if(    (fStream[i] == '\n'
  23. || (fStream[i] == '\t'
  24. || (fStream[i] == ' '
  25. || (fStream[i] == 0x09)) 
  26. arg[countarg] = tempnum; 
  27. tempnum = 0; 
  28. countarg++; 
  29. //记录参数是否记录结束 
  30. if(countarg == 4) 
  31. break
  32. start = i + 1; 
  33. if(arg[0] == 5)//P5格式 
  34. //为成员变量赋值 
  35. m_imgWidth = arg[1]; 
  36. m_imgHeight = arg[2]; 
  37. m_nBitCount = 24;  
  38. int linebyte = (arg[1] * m_nBitCount / 8 + 3) / 4 * 4;//每行字节数 
  39. int pixelbyte = m_nBitCount / 8; 
  40. //为m_lpDib分配空间,设置DIB内容 
  41. if(m_lpDib!=NULL) delete []m_lpDib; 
  42. m_lpDib=new BYTE[40 + linebyte * m_imgHeight]; 
  43. //m_lpBmpInfoHead位置为m_lpDib起始位置 
  44. m_lpBmpInfoHead = (LPBITMAPINFOHEADER)m_lpDib; 
  45. //m_lpBmpInfoHead初始化 
  46. m_lpBmpInfoHead->biSize = 40; // 本结构所占用字节数,长度40字节  
  47. m_lpBmpInfoHead->biWidth = m_imgWidth;// 位图的宽度,以像素为单位  
  48. m_lpBmpInfoHead->biHeight = m_imgHeight;// 位图的高度,以像素为单位  
  49. m_lpBmpInfoHead->biPlanes = 1;// 目标设备的级别,必须为1  
  50. m_lpBmpInfoHead->biBitCount = m_nBitCount;//图像每像素宽度(单位:位) 
  51. m_lpBmpInfoHead->biCompression = 0; 
  52. m_lpBmpInfoHead->biSizeImage = linebyte 
  53. * m_lpBmpInfoHead->biHeight;// 位图的大小,以字节为单位  
  54. //计算颜色表长度 
  55. m_nColorTableLength=ComputeColorTableLength(m_nBitCount); 
  56. //如果有颜色表,则创建逻辑调色板,申请颜色表缓冲区,生成灰度图像的颜色表 
  57. m_hPalette = NULL; 
  58. if(m_nColorTableLength != 0) 
  59. m_lpColorTable = new RGBQUAD[m_nColorTableLength]; 
  60. if(m_lpColorTable == NULL) 
  61. _Error("m_lpColorTable new failed!!"); 
  62. for(int i = 0; i < m_nColorTableLength; i++) 
  63. m_lpColorTable[i].rgbBlue = i; 
  64. m_lpColorTable[i].rgbGreen = i; 
  65. m_lpColorTable[i].rgbRed = i; 
  66. m_lpColorTable[i].rgbReserved = 0; 
  67. //m_pImgData指向DIB的位图数据起始位置 
  68. m_pImgData = (LPBYTE)m_lpDib+sizeof(BITMAPINFOHEADER) + 
  69. sizeof(RGBQUAD) * m_nColorTableLength; 
  70. //拷贝文件流数据至BMP数据区指针 
  71. for(i = m_imgHeight - 1; i >= 0; i--) 
  72. for(j = 0; j < m_imgWidth; j++) 
  73. m_pImgData[i * linebyte + j * pixelbyte + 0] = fStream[start]; 
  74. m_pImgData[i * linebyte + j * pixelbyte + 1] = fStream[start]; 
  75. m_pImgData[i * linebyte + j * pixelbyte + 2] = fStream[start]; 
  76. start++; 
  77. //释放文件流指针 
  78. file.Close(); 
  79. delete fStream; 
  80. fStream = NULL; 
  81. else//P2格式 
  82. return TRUE; 
(陈修)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201407/17013.html]
本文出处:新浪博客 作者:陈修 原文
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容