画像の簡易入出力とテストプログラムを追加
[cuda.git] / libutils / ImageIO.h
diff --git a/libutils/ImageIO.h b/libutils/ImageIO.h
new file mode 100644 (file)
index 0000000..c859b3d
--- /dev/null
@@ -0,0 +1,77 @@
+/*
+       Copyright (C) 2012  fmaj7b5.info
+
+       This program is free software: you can redistribute it and/or modify
+       it under the terms of the GNU General Public License as published by
+       the Free Software Foundation, either version 2 of the License, or
+       (at your option) any later version.
+
+       This program is distributed in the hope that it will be useful,
+       but WITHOUT ANY WARRANTY; without even the implied warranty of
+       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+       GNU General Public License for more details.
+
+       You should have received a copy of the GNU General Public License
+       along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef FM7b5_IMAGE_IO_H
+#define FM7b5_IMAGE_IO_H
+
+#include <string>
+#include <stdexcept>
+#include <cstdint>
+
+#include "Image.h"
+
+namespace FM7b5
+{
+       Image<std::uint8_t> loadPGM(const std::string& filename);
+
+       template <typename T>
+       void savePGM(const Image<T>& image, const std::string& filename);
+
+
+       /* implementation */
+       template <typename T>
+       void savePNM(const Image<T>& image, const std::string& filename)
+       {
+               FILE* fp(nullptr);
+
+               if (fopen_s(&fp, filename.c_str(), "wb") != 0) {
+                       throw std::runtime_error(__FUNCTION__ ": could not open a file.");
+               }
+
+               /* magic */
+               switch(image.bpp()) {
+               case 1:
+                       fprintf(fp, "P5\n");
+                       break;
+
+               case 3:
+                       fprintf(fp, "P6\n");
+                       break;
+
+               default:
+                       fclose(fp);
+                       throw std::runtime_error(__FUNCTION__ ": unknown format.");
+                       break;
+               }
+
+               /* width, height, depth */
+               fprintf(fp, "%d %d\n%d\n", image.width(), image.height(), 255);
+
+               /* binary data */
+               for (size_t h = 0; h < image.height(); ++h) {
+                       const size_t width(image.width());
+
+                       size_t ret = fwrite(image.data() + image.stride() * h, image.bpp(), width, fp);
+                       if (ret != width) {
+                               fclose(fp);
+                               throw std::runtime_error(__FUNCTION__ ": could not write correctly.");
+                       }
+               }
+       }
+}
+
+#endif /* FM7b5_IMAGE_IO_H */
\ No newline at end of file