ImageView.cpp
上传用户:panpan8800
上传日期:2013-06-29
资源大小:274k
文件大小:5k
源码类别:

图形图像处理

开发平台:

Visual C++

  1. // ************************************************************************
  2. //  文件名:ImageView.cpp
  3. //
  4. //  图像复原API函数库:
  5. //
  6. //  LimbPatternBayer() - 用BAYER表抖动显示图象
  7. //  DitherFloydSteinberg() - 用Floyd-Steinberg算法抖动生成图象
  8. //
  9. // *************************************************************************
  10. #include "stdafx.h"
  11. #include "GlobalApi.h"
  12. #include "Cdib.h"
  13. #include <math.h>
  14. #include <direct.h>
  15. #include <complex>
  16. using namespace std;
  17. /*************************************************************************
  18.  *
  19.  * 函数名称:
  20.  *   LimbPatternBayer()
  21.  *
  22.  * 参数:
  23.  *   CDib  *pDib       - 指向CDib类的指针
  24.  *
  25.  * 返回值:
  26.  *   BOOL               - 成功返回TRUE,否则返回FALSE。
  27.  *
  28.  * 说明:
  29.  *   该函数利用BAYER表抖动显示图象。
  30.  *
  31.  ************************************************************************/
  32. BOOL LimbPatternBayer(CDib *pDib)
  33. {
  34. // Bayer表的定义
  35. BYTE BayerPattern[8][8]={ 0, 32,  8, 40,  2, 34, 10, 42,
  36.  48, 16, 56, 24, 50, 18, 58, 26,
  37.  12, 44,  4, 36, 14, 46,  6, 38,
  38.  60, 28, 52, 20, 62, 30, 54, 22,
  39.   3, 35, 11, 43,  1, 33,  9, 41,
  40.  51, 19, 59, 27, 49, 17, 57, 25,
  41.  15, 47,  7, 39, 13, 45,  5, 37,
  42.  63, 31, 55, 23, 61, 29, 53, 21};
  43. // 指向源图像的指针
  44. BYTE * lpSrc;
  45. //图象的宽度和高度
  46. LONG    lWidth;
  47. LONG    lHeight;
  48. //得到实际的Dib图象存储大小
  49. CSize   SizeRealDim;
  50. SizeRealDim = pDib->GetDibSaveDim();
  51. // 图像每行的字节数
  52. LONG lLineBytes;
  53. //得到图象的宽度和高度
  54. CSize   SizeDim;
  55. SizeDim = pDib->GetDimensions();
  56. lWidth  = SizeDim.cx;
  57. lHeight = SizeDim.cy;;
  58. // 计算图像每行的字节数
  59. lLineBytes = SizeRealDim.cx;
  60. //图像数据的指针
  61. LPBYTE  lpDIBBits = pDib->m_lpImage;
  62. // 循环变量
  63. int i, j;
  64. // 象素的值
  65. int nPixelValue;
  66. // 将图象二值化,利用BAYER表抖动显示图象
  67. for (j = 0; j < lHeight ; j++)
  68. {
  69. for(i = 0; i < lLineBytes ; i++)
  70. {
  71. // 指向源图像倒数第j行,第i个象素的指针
  72. lpSrc = (unsigned char *)lpDIBBits + lLineBytes * j + i;
  73. nPixelValue = (*lpSrc);
  74. nPixelValue =nPixelValue;
  75. // 右移两位后做比较
  76. if ( (nPixelValue>>2) > BayerPattern[j&7][i&7]) 
  77.                 //打白点    
  78. *(lpSrc)=(unsigned char)255; 
  79. else 
  80. //打黑点
  81. *(lpSrc)=(unsigned char)0; 
  82. }
  83. }
  84. return true;
  85. }
  86. /*************************************************************************
  87.  *
  88.  * 函数名称:
  89.  *   DitherFloydSteinberg()
  90.  *
  91.  * 参数:
  92.  *   CDib  *pDib       - 指向CDib类的指针
  93.  *
  94.  * 返回值:
  95.  *   BOOL               - 成功返回TRUE,否则返回FALSE。
  96.  *
  97.  * 说明:
  98.  *   该函数用来用Floyd-Steinberg算法抖动生成图象。
  99.  *
  100.  ************************************************************************/
  101. BOOL DitherFloydSteinberg(CDib *pDib)
  102. {
  103. // 指向源图像的指针
  104. BYTE * lpSrc;
  105. //图象的宽度和高度
  106. LONG    lWidth;
  107. LONG    lHeight;
  108. // 图像每行的字节数
  109. LONG lLineBytes;
  110. //得到图象的宽度和高度
  111. CSize   SizeDim;
  112. SizeDim = pDib->GetDimensions();
  113. lWidth  = SizeDim.cx;
  114. lHeight = SizeDim.cy;
  115. //得到实际的Dib图象存储大小
  116. CSize   SizeRealDim;
  117. SizeRealDim = pDib->GetDibSaveDim();
  118. // 计算图像每行的字节数
  119. lLineBytes = SizeRealDim.cx;
  120. //图像数据的指针
  121. LPBYTE  lpDIBBits = pDib->m_lpImage;
  122. // 循环变量
  123. int i, j;
  124. // 误差传播系数
  125. double temp, error;
  126. // 象素值
  127. int nPixelValue;
  128. // 将图象二值化,并用Floyd-Steinberg算法抖动生成图象
  129. for (j = 0; j < lHeight; j++)
  130. {
  131. for(i = 0; i < lLineBytes; i++)
  132. {
  133. // 指向源图像倒数第j行,第i个象素的指针
  134. lpSrc = (unsigned char *)lpDIBBits + lLineBytes * j + i;
  135. nPixelValue = *lpSrc;
  136. //128是中值
  137. if ( nPixelValue > 128 )
  138. //打白点
  139. *lpSrc=255; 
  140. //计算误差
  141. error = (double)(nPixelValue-255.0); 
  142. }
  143. else
  144. {
  145. //打黑点
  146. *lpSrc=0; 
  147. //计算误差
  148. error = (double)nPixelValue; 
  149. }
  150. // 如果不是边界
  151. if(i < lLineBytes-1)
  152. //向右传播
  153. temp = (float)*(lpSrc+1);
  154. temp = temp + error * (1.5/8.0);
  155. if(temp > 255.0)
  156. temp = 255.0;
  157. *(lpSrc+1)=(int)temp; 
  158. }
  159. // 如果不是边界
  160. if(j < lHeight - 1)
  161. // 向下传播
  162. temp = (float)*(lpSrc + lLineBytes);
  163. temp = temp + error * (1.5/8.0);
  164. *(lpSrc+lLineBytes) = (int)temp;
  165. if(i < lLineBytes-1)
  166. {
  167. // 向右下传播
  168. temp = (float)*(lpSrc + lLineBytes + 1);
  169. temp = temp + error * (2.0/16.0);
  170. *(lpSrc + lLineBytes + 1) = (int)temp;
  171. }
  172. }
  173. }
  174. }
  175. return true;
  176. }