netpbm: add write methods with ostreams
This commit is contained in:
parent
8b2b86b945
commit
eabe3e3a3f
60
netpbm.cpp
60
netpbm.cpp
@ -63,7 +63,7 @@ write_netpbm (const uint8_t *restrict pixels,
|
||||
size_t width,
|
||||
size_t height,
|
||||
size_t stride,
|
||||
const boost::filesystem::path &path,
|
||||
std::ostream &output,
|
||||
const char* MAGIC) {
|
||||
CHECK (pixels);
|
||||
CHECK_GT (components, 0);
|
||||
@ -71,11 +71,6 @@ write_netpbm (const uint8_t *restrict pixels,
|
||||
CHECK_GE (stride, width);
|
||||
CHECK_GT (height, 0);
|
||||
|
||||
// Establish an output stream
|
||||
std::ofstream output (path.string ());
|
||||
if (!output.good ())
|
||||
throw util::output_error ("Unable to open output file");
|
||||
|
||||
// Write the PPM header.
|
||||
output << MAGIC << "\n"
|
||||
<< width << "\n"
|
||||
@ -83,11 +78,17 @@ write_netpbm (const uint8_t *restrict pixels,
|
||||
<< (size_t)std::numeric_limits<uint8_t>::max () << "\n";
|
||||
|
||||
// Write the data rows
|
||||
for (size_t y = 0; y < height; ++y) {
|
||||
for (size_t x = 0; x < width; ++x)
|
||||
for (size_t c = 0; c < components; ++c)
|
||||
output << pixels[y * stride + x * components + c];
|
||||
}
|
||||
for (size_t y = 0; y < height; ++y)
|
||||
output.write (reinterpret_cast<const char*> (pixels + y * stride), width * components);
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
void
|
||||
util::pgm::write (const util::image::buffer<uint8_t> &src,
|
||||
std::ostream &dst)
|
||||
{
|
||||
write (src.begin (), src.w, src.h, src.s, dst);
|
||||
}
|
||||
|
||||
|
||||
@ -96,6 +97,7 @@ void
|
||||
util::pgm::write (const util::image::buffer<uint8_t> &src,
|
||||
const boost::filesystem::path &path)
|
||||
{
|
||||
std::ofstream dst (path.c_str ());
|
||||
write (src.begin (), src.w, src.h, src.s, path);
|
||||
}
|
||||
|
||||
@ -106,10 +108,24 @@ util::pgm::write (const uint8_t *restrict pixels,
|
||||
size_t width,
|
||||
size_t height,
|
||||
size_t stride,
|
||||
const boost::filesystem::path &path) {
|
||||
const boost::filesystem::path &path)
|
||||
{
|
||||
std::ofstream dst (path.c_str ());
|
||||
write (pixels, width, height, stride, dst);
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
void
|
||||
util::pgm::write (const uint8_t *restrict pixels,
|
||||
size_t width,
|
||||
size_t height,
|
||||
size_t stride,
|
||||
std::ostream &dst)
|
||||
{
|
||||
// TODO: We should switch between P2 (ascii) and P5 (binary)
|
||||
static const char MAGIC[] = "P5";
|
||||
write_netpbm (pixels, 1, width, height, stride, path, MAGIC);
|
||||
write_netpbm (pixels, 1, width, height, stride, dst, MAGIC);
|
||||
}
|
||||
|
||||
|
||||
@ -119,8 +135,22 @@ util::ppm::write (const uint8_t *restrict pixels,
|
||||
size_t width,
|
||||
size_t height,
|
||||
size_t stride,
|
||||
const boost::filesystem::path &path) {
|
||||
const boost::filesystem::path &path)
|
||||
{
|
||||
std::ofstream dst (path.c_str ());
|
||||
write (pixels, width, height, stride, dst);
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
void
|
||||
util::ppm::write (const uint8_t *restrict pixels,
|
||||
size_t width,
|
||||
size_t height,
|
||||
size_t stride,
|
||||
std::ostream &dst)
|
||||
{
|
||||
// TODO: We should switch between P3 (ascii) and P6 (binary)
|
||||
static const char MAGIC[] = "P6";
|
||||
write_netpbm (pixels, 3, width, height, stride, path, MAGIC);
|
||||
write_netpbm (pixels, 3, width, height, stride, dst, MAGIC);
|
||||
}
|
||||
|
15
netpbm.hpp
15
netpbm.hpp
@ -21,6 +21,7 @@
|
||||
|
||||
#include <cstdint>
|
||||
#include <cstddef>
|
||||
#include <ostream>
|
||||
#include <boost/filesystem/path.hpp>
|
||||
|
||||
namespace util {
|
||||
@ -29,8 +30,15 @@ namespace util {
|
||||
static image::buffer<uint8_t> read (const boost::filesystem::path&);
|
||||
|
||||
static void write (const image::buffer<uint8_t> &src,
|
||||
const boost::filesystem::path &);
|
||||
const boost::filesystem::path &dst);
|
||||
static void write (const image::buffer<uint8_t> &src,
|
||||
std::ostream &dst);
|
||||
|
||||
static void write (const uint8_t *restrict pixels,
|
||||
size_t width,
|
||||
size_t height,
|
||||
size_t stride,
|
||||
std::ostream &dst);
|
||||
static void write (const uint8_t *restrict pixels,
|
||||
size_t width,
|
||||
size_t height,
|
||||
@ -45,6 +53,11 @@ namespace util {
|
||||
size_t height,
|
||||
size_t stride,
|
||||
const boost::filesystem::path &path);
|
||||
static void write (const uint8_t *restrict pixels,
|
||||
size_t width,
|
||||
size_t height,
|
||||
size_t stride,
|
||||
std::ostream &dst);
|
||||
};
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user