Browse Source

changed everything to lowercase, made test3 simpler

master
Joshua Moerman 12 years ago
parent
commit
27db4e00ee
  1. 27
      ImageStreams/basics.hpp
  2. 6
      ImageStreams/bmp.hpp
  3. 23
      ImageStreams/main.cpp
  4. 2
      ImageStreams/png.hpp

27
ImageStreams/basics.hpp

@ -18,6 +18,9 @@
p(int v) p(int v)
p(double v) p(double v)
The order in the ctor is rgb even though the internal structure may be
different
It should be trivially writable with memcpy (TODO: check exact requirement) It should be trivially writable with memcpy (TODO: check exact requirement)
Furthermore it should have a static constexpr size_t num_colors indicating the Furthermore it should have a static constexpr size_t num_colors indicating the
@ -30,35 +33,35 @@ namespace pixel_formats {
return std::min(255, std::max(0, n)); return std::min(255, std::max(0, n));
} }
struct Gray { struct gray {
static constexpr size_t num_colors = 1; static constexpr size_t num_colors = 1;
static constexpr size_t bits_per_color = 8; static constexpr size_t bits_per_color = 8;
Gray() : value(0) {} gray() : value(0) {}
Gray(double intensity) : value(clamp(255*intensity)) {} gray(double intensity) : value(clamp(255*intensity)) {}
Gray(int intensity) : value(clamp(intensity)) {} gray(int intensity) : value(clamp(intensity)) {}
private: private:
uint8_t value; uint8_t value;
}; };
struct RGB { struct rgb {
static constexpr size_t num_colors = 3; static constexpr size_t num_colors = 3;
static constexpr size_t bits_per_color = 8; static constexpr size_t bits_per_color = 8;
RGB() rgb()
: red(0) : red(0)
, green(0) , green(0)
, blue(0) , blue(0)
{} {}
RGB(double red, double green, double blue) rgb(double red, double green, double blue)
: red(clamp(255*red)) : red(clamp(255*red))
, green(clamp(255*green)) , green(clamp(255*green))
, blue(clamp(255*blue)) , blue(clamp(255*blue))
{} {}
RGB(int red, int green, int blue) rgb(int red, int green, int blue)
: red(clamp(red)) : red(clamp(red))
, green(clamp(green)) , green(clamp(green))
, blue(clamp(blue)) , blue(clamp(blue))
@ -70,23 +73,23 @@ namespace pixel_formats {
uint8_t blue; uint8_t blue;
}; };
struct BGR{ struct bgr{
static constexpr size_t num_colors = 3; static constexpr size_t num_colors = 3;
static constexpr size_t bits_per_color = 8; static constexpr size_t bits_per_color = 8;
BGR() bgr()
: blue(0) : blue(0)
, green(0) , green(0)
, red(0) , red(0)
{} {}
BGR(double red, double green, double blue) bgr(double red, double green, double blue)
: blue(clamp(255*blue)) : blue(clamp(255*blue))
, green(clamp(255*green)) , green(clamp(255*green))
, red(clamp(255*red)) , red(clamp(255*red))
{} {}
BGR(int red, int green, int blue) bgr(int red, int green, int blue)
: blue(clamp(blue)) : blue(clamp(blue))
, green(clamp(green)) , green(clamp(green))
, red(clamp(red)) , red(clamp(red))

6
ImageStreams/bmp.hpp

@ -15,6 +15,10 @@
#include <algorithm> #include <algorithm>
#include "basics.hpp" #include "basics.hpp"
/*
Note that a bmp file is vertically flipped.
*/
namespace bmp { namespace bmp {
// file header // file header
struct bitmap_file_header { struct bitmap_file_header {
@ -92,7 +96,7 @@ namespace bmp {
struct default_color_table : public std::conditional<pixel_formats::traits<P>::bits_per_pixel <= 8, gray_color_table<pixel_formats::traits<P>::bits_per_pixel>, no_color_table>::type struct default_color_table : public std::conditional<pixel_formats::traits<P>::bits_per_pixel <= 8, gray_color_table<pixel_formats::traits<P>::bits_per_pixel>, no_color_table>::type
{}; {};
template <typename P = pixel_formats::BGR, typename CT = default_color_table<P>> template <typename P = pixel_formats::bgr, typename CT = default_color_table<P>>
struct bitmap_stream { struct bitmap_stream {
typedef P pixel; typedef P pixel;
typedef CT color_table; typedef CT color_table;

23
ImageStreams/main.cpp

@ -43,7 +43,6 @@ void test2(std::string filename){
} }
} }
// because lambdas dont work yet...
inline double nice_rand(){ inline double nice_rand(){
return rand() / double(RAND_MAX); return rand() / double(RAND_MAX);
} }
@ -51,31 +50,21 @@ inline double nice_rand(){
template <typename ImageType> template <typename ImageType>
void test3(std::string filename){ void test3(std::string filename){
size_t size = 256; size_t size = 256;
std::vector<double> arr(size*size);
std::generate_n(arr.begin(), size*size, &nice_rand);
std::vector<double> arr2(size*size, 0);
for(int i = 0; i < size*size; ++i){
for (int j = i - 5; j <= i + 5; ++j) {
if(j < 0 || j >= size*size) continue;
arr2[i] += arr[j] * 0.1;
}
}
ImageType image(size, size, filename); ImageType image(size, size, filename);
for(auto x : arr2) for(int i = 0; i < size*size; ++i)
image << typename ImageType::pixel(x); image << typename ImageType::pixel(nice_rand());
} }
int main(int argc, const char * argv[]){ int main(int argc, const char * argv[]){
test<png::png_stream<>>("test.png"); test<png::png_stream<>>("test.png");
test<bmp::bitmap_stream<>>("test.bmp"); test<bmp::bitmap_stream<>>("test.bmp");
test2<png::png_stream<pixel_formats::Gray>>("test_gray.png"); test2<png::png_stream<pixel_formats::gray>>("test_gray.png");
test2<bmp::bitmap_stream<pixel_formats::Gray>>("test_gray.bmp"); test2<bmp::bitmap_stream<pixel_formats::gray>>("test_gray.bmp");
test3<png::png_stream<pixel_formats::Gray>>("test_3.png"); test3<png::png_stream<pixel_formats::gray>>("test_3.png");
test3<bmp::bitmap_stream<pixel_formats::Gray>>("test_3.bmp"); test3<bmp::bitmap_stream<pixel_formats::gray>>("test_3.bmp");
} }

2
ImageStreams/png.hpp

@ -28,7 +28,7 @@ namespace png{
} }
} }
template <typename P = pixel_formats::RGB> template <typename P = pixel_formats::rgb>
struct png_stream{ struct png_stream{
typedef P pixel; typedef P pixel;