ImageFileListReader.cpp 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. #include "core/image/ImageFileListReader.h"
  2. #include "core/image/Convert.h"
  3. #include "core/basics/Log.h"
  4. #include <fstream>
  5. namespace NICE {
  6. ImageFileListReader::ImageFileListReader(const char* fileName, bool _preload) {
  7. init(std::string(fileName), _preload);
  8. }
  9. ImageFileListReader::ImageFileListReader(const std::string& fileName, bool _preload) {
  10. init(fileName, _preload);
  11. }
  12. void ImageFileListReader::init(const std::string& fileName, bool _preload) {
  13. preload = _preload;
  14. inputFileName = fileName;
  15. if (inputFileName.isDirectory()) {
  16. inputFileName.removeSlash();
  17. FileName lastPart = inputFileName.extractFileName();
  18. inputFileName.addSlash();
  19. inputFileName = FileName(inputFileName.str() + lastPart.str() + ".txt");
  20. }
  21. std::ifstream file( inputFileName.str().c_str() );
  22. if (!file.good()) {
  23. fthrow(ImageException,
  24. std::string("ImageFileListReader: Error opening filelist: ")
  25. + inputFileName.str());
  26. }
  27. FileName basePath = FileName(inputFileName).extractPath();
  28. while (!file.eof()) {
  29. char fileNameFrame[256];
  30. fileNameFrame[0] = 0;
  31. file >> fileNameFrame;
  32. if (strlen(fileNameFrame) > 0) {
  33. fileList.push_back(new std::string(basePath.str() + fileNameFrame));
  34. }
  35. }
  36. file.close();
  37. currentFrame = 0;
  38. // read width and height (of the first image)
  39. std::auto_ptr<ColorImage> image(doReadColorImage());
  40. currentFrame = 0;
  41. if (image.get() == NULL) {
  42. width = 0;
  43. height = 0;
  44. } else {
  45. width = image->width();
  46. height = image->height();
  47. }
  48. image.reset(NULL);
  49. if (preload) {
  50. for (unsigned int i = 0; i < numberOfFrames(); i++) {
  51. ColorImage* image = doReadColorImage();
  52. images.push_back(image);
  53. }
  54. reset();
  55. }
  56. }
  57. ImageFileListReader::~ImageFileListReader() {
  58. for (unsigned int i = 0; i < fileList.size(); i++) {
  59. delete fileList.at(i);
  60. }
  61. if (preload) {
  62. for (unsigned int i = 0; i < images.size(); i++) {
  63. delete images.at(i);
  64. }
  65. }
  66. }
  67. bool ImageFileListReader::endOfStream() {
  68. return currentFrame >= numberOfFrames();
  69. }
  70. void ImageFileListReader::readColorImage(ColorImage& buffer) {
  71. if (preload) {
  72. if (endOfStream()) {
  73. fthrow(ImageException, "End of stream reached.");
  74. }
  75. buffer = *images.at(currentFrame);
  76. currentFrame++;
  77. } else {
  78. doReadColorImage(&buffer);
  79. }
  80. }
  81. void ImageFileListReader::readGrayImage(Image& buffer) {
  82. if (preload) {
  83. if (endOfStream()) {
  84. fthrow(ImageException, "End of stream reached.");
  85. }
  86. rgbToGray(*images.at(currentFrame), &buffer);
  87. currentFrame++;
  88. } else {
  89. ColorImage image;
  90. doReadColorImage(&image);
  91. rgbToGray(image, &buffer);
  92. }
  93. }
  94. void ImageFileListReader::readColorImage(ColorImage& buffer, unsigned int index) {
  95. if (preload) {
  96. buffer = *images.at(index);
  97. } else {
  98. buffer.read(ImageFile(*fileList.at(index)));
  99. }
  100. }
  101. void ImageFileListReader::readGrayImage(Image& buffer, unsigned int index) {
  102. if (preload) {
  103. rgbToGray(*images.at(index), &buffer);
  104. } else {
  105. ColorImage image;
  106. image.read(ImageFile(*fileList.at(index)));
  107. rgbToGray(image, &buffer);
  108. }
  109. }
  110. ColorImage* ImageFileListReader::doReadColorImage(ColorImage* buffer) {
  111. if (endOfStream()) {
  112. //fthrow(ImageException, "End of stream reached.");
  113. return NULL;
  114. }
  115. ColorImage* image = buffer;
  116. if (buffer == NULL) {
  117. image = new ColorImage(*fileList.at(currentFrame));
  118. } else {
  119. buffer->read(ImageFile(*fileList.at(currentFrame)));
  120. }
  121. currentFrame++;
  122. return image;
  123. }
  124. int ImageFileListReader::imageHeight() {
  125. return height;
  126. }
  127. int ImageFileListReader::imageWidth(){
  128. return width;
  129. }
  130. unsigned int ImageFileListReader::numberOfFrames() const {
  131. return fileList.size();
  132. }
  133. void ImageFileListReader::reset() {
  134. currentFrame = 0;
  135. }
  136. void ImageFileListReader::ignoreFrames(int frames) {
  137. currentFrame += frames;
  138. }
  139. } // namespace