extendedimage.cpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. #include "ExtendedImage.h"
  2. #include <cstdio>
  3. #if !defined( WIN32 ) || defined( IMT_DLL ) || defined( PLAQUE_DLL )
  4. #include <cstring>
  5. #endif
  6. #include <fstream>
  7. ExtendedImage::ExtendedImage()
  8. #if defined( WIN32 ) && !defined( IMT_DLL ) && !defined( PLAQUE_DLL )
  9. : CImage(),
  10. m_resX( 1.0 ),
  11. m_resY( 1.0 )
  12. #else
  13. : m_resX( 1.0 ),
  14. m_resY( 1.0 ),
  15. m_width( 0 ),
  16. m_height( 0 ),
  17. m_bpp( 0 ),
  18. m_buffer( NULL )
  19. #endif
  20. {
  21. }
  22. #if !defined( WIN32 ) || defined( IMT_DLL ) || defined( PLAQUE_DLL )
  23. ExtendedImage::~ExtendedImage()
  24. {
  25. Destroy();
  26. }
  27. bool ExtendedImage::Create( int width, int height, int bpp )
  28. {
  29. unsigned long n = width * height * bpp / 8;
  30. m_width = width;
  31. m_height = height;
  32. m_bpp = bpp;
  33. m_buffer = new char[ n ];
  34. if ( !m_buffer )
  35. {
  36. return false;
  37. }
  38. return true;
  39. }
  40. void ExtendedImage::Destroy()
  41. {
  42. delete[] m_buffer;
  43. m_buffer = NULL;
  44. m_width = 0;
  45. m_height = 0;
  46. m_bpp = 0;
  47. m_resX = 1.0;
  48. m_resY = 1.0;
  49. }
  50. bool ExtendedImage::IsNull()
  51. {
  52. return m_buffer ? false : true;
  53. }
  54. bool ExtendedImage::SetRaw( char* buffer, unsigned long n )
  55. {
  56. if ( buffer )
  57. {
  58. int bpp = m_bpp / 8;
  59. unsigned long deltaH = ( n / bpp ) % m_height;
  60. unsigned long scanline = m_width * bpp;
  61. int i = m_height;
  62. char* bptr = m_buffer;
  63. char* iptr = buffer;
  64. while ( i-- )
  65. {
  66. std::memcpy( bptr, iptr, scanline );
  67. bptr += scanline;
  68. iptr += scanline + deltaH;
  69. }
  70. return true;
  71. }
  72. return false;
  73. }
  74. char* ExtendedImage::GetBits()
  75. {
  76. return m_buffer;
  77. }
  78. unsigned char ExtendedImage::GetPixelRGB( int x, int y, int channel )
  79. {
  80. unsigned char *dadd;
  81. int n = m_bpp / 8;
  82. int scanline = ( ( m_width * n ) + 3 ) & ~3;
  83. dadd = (unsigned char *) m_buffer + ( scanline * y ) + (n * x);
  84. if (channel == 0) // Rouge
  85. {
  86. }
  87. else if (channel == 1) // Vert
  88. {
  89. dadd += 1;
  90. }
  91. else if (channel == 2) // Bleu
  92. {
  93. dadd += 2;
  94. }
  95. return (*dadd);
  96. }
  97. int ExtendedImage::GetPixelGray( int x, int y)
  98. {
  99. int r, v, b, moy;
  100. unsigned char* dadd;
  101. int n = m_bpp / 8;
  102. int scanline = ( ( m_width * n ) + 3 ) & ~3;
  103. dadd = (unsigned char*) m_buffer + ( scanline * y ) + (n * x) ;
  104. r = (int) * dadd;
  105. dadd++;
  106. v = (int) * dadd;
  107. dadd++;
  108. b = (int) * dadd;
  109. moy = (r + v + b) / 3;
  110. return moy;
  111. }
  112. #endif
  113. bool ExtendedImage::HasCalibration()
  114. {
  115. return ( ( m_resX > 0.0 ) && ( m_resY > 0.0 ) );
  116. }
  117. void ExtendedImage::SetResolution( double resX, double resY )
  118. {
  119. m_resX = resX;
  120. m_resY = resY;
  121. }
  122. void ExtendedImage::CopyFrom2(ExtendedImage *vSource)
  123. {
  124. unsigned char *dadd, *amax,*dadd1;
  125. int scanline = ( ( m_width * m_bpp / 8 ) + 3 ) & ~3;
  126. dadd = (unsigned char *) m_buffer;
  127. amax = dadd + (scanline * m_height);
  128. dadd1 = (unsigned char *) vSource->m_buffer;
  129. while (dadd < amax)
  130. {
  131. *dadd = *dadd1;
  132. dadd++;
  133. dadd1++;
  134. }
  135. }
  136. void ExtendedImage::Copy2(int dimh, int dimv, ExtendedImage *vSource)
  137. {
  138. char* imgPtr = (char*) GetBits();
  139. char* imgPtrSrc = (char*) vSource->GetBits();
  140. memcpy(imgPtr, imgPtrSrc, (size_t) (dimh * dimv * 3 * sizeof(unsigned char)));
  141. }
  142. void ExtendedImage::SaveImgAsRaw()
  143. {
  144. int n = m_bpp / 8;
  145. std::ofstream ofs( "C:\\Image.raw", std::ios_base::out | std::ios_base::binary );
  146. if ( ofs.good() )
  147. {
  148. int scanline = ( ( m_width * n) + 3 ) & ~3;
  149. ofs.write( (char*) m_buffer, scanline * m_height );
  150. ofs.close();
  151. }
  152. }