7#define STB_IMAGE_IMPLEMENTATION
10#define STB_IMAGE_WRITE_IMPLEMENTATION
11#include "stb_image_write.h"
18 for(
unsigned i= 0; i < image.
size(); i++)
19 tmp(i)=
srgb(image(i));
28 for(
unsigned i= 0; i < image.
size(); i++)
38 for(
unsigned i= 0; i < image.
size(); i++)
40 Color color= image(i);
41 float g= color.r + color.g + color.b;
48 for(
unsigned i= 0; i < image.
size(); i++)
50 Color color= image(i);
51 float g= color.r + color.g + color.b;
53 int b= (g - gmin) * 100 / (gmax - gmin);
61 for(
unsigned i= 0; i < 100; i++)
63 qbins= qbins + float(bins[i]) / float(image.
size());
65 return gmin + float(i+1) / 100 * (gmax - gmin);
76 float k= 1 / std::pow(saturation, 1 / 2.2f);
77 for(
unsigned i= 0; i < image.
size(); i++)
79 Color color= image(i);
80 if(std::isnan(color.r) || std::isnan(color.g) || std::isnan(color.b))
82 color=
Color(1, 0, 1);
85 color= k *
srgb(color);
87 tmp(i)=
Color(color, 1);
96 stbi_ldr_to_hdr_scale(1.0f);
97 stbi_ldr_to_hdr_gamma(2.2f);
98 stbi_set_flip_vertically_on_load(flipY);
100 int width, height, channels;
101 float *data= stbi_loadf(filename, &width, &height, &channels, 4);
104 printf(
"[error] loading '%s'...\n", filename);
108 Image image(width, height);
109 for(
unsigned i= 0, offset= 0; i < image.
size(); i++, offset+= 4)
110 image(i)=
Color( data[offset], data[offset + 1], data[offset + 2], data[offset + 3]);
112 stbi_image_free(data);
117inline float clamp(
const float x,
const float min,
const float max )
120 else if(x >
max)
return max;
126 if(image.
size() == 0)
129 std::vector<unsigned char> tmp(image.
width()*image.
height()*4);
130 for(
unsigned i= 0, offset= 0; i < image.
size(); i++, offset+= 4)
132 Color pixel= image(i) * 255;
133 tmp[offset ]= clamp(pixel.r, 0, 255);
134 tmp[offset +1]= clamp(pixel.g, 0, 255);
135 tmp[offset +2]= clamp(pixel.b, 0, 255);
136 tmp[offset +3]= clamp(pixel.a, 0, 255);
139 stbi_flip_vertically_on_write(flipY);
140 return stbi_write_png(filename, image.
width(), image.
height(), 4, tmp.data(), image.
width() * 4) != 0;
150 if(image.
size() == 0)
153 std::vector<unsigned char> tmp(image.
width()*image.
height()*4);
154 for(
unsigned i= 0, offset= 0; i < image.
size(); i++, offset+= 4)
156 Color pixel= image(i) * 255;
157 tmp[offset ]= clamp(pixel.r, 0, 255);
158 tmp[offset +1]= clamp(pixel.g, 0, 255);
159 tmp[offset +2]= clamp(pixel.b, 0, 255);
160 tmp[offset +3]= clamp(pixel.a, 0, 255);
163 stbi_flip_vertically_on_write(flipY);
164 return stbi_write_bmp(filename, image.
width(), image.
height(), 4, tmp.data()) != 0;
169 if(image.
size() == 0)
172 stbi_flip_vertically_on_write(flipY);
173 return stbi_write_hdr(filename, image.
width(), image.
height(), 4, image.
data()) != 0;
178 if(image.
size() == 0)
representation d'une image.
int height() const
renvoie la hauteur de l'image.
unsigned size() const
renvoie le nombre de pixels de l'image.
const float * data() const
renvoie un const pointeur sur le stockage des couleurs des pixels.
int width() const
renvoie la largeur de l'image.
bool write_image_png(const Image &image, const char *filename, const bool flipY)
enregistre une image au format .png
bool write_image_preview(const Image &image, const char *filename, const bool flipY)
raccourci pour write_image_png(tone(image, range(image)), "image.png")
bool write_image_hdr(const Image &image, const char *filename, const bool flipY)
enregistre une image au format .hdr
bool write_image_bmp(const Image &image, const char *filename, const bool flipY)
enregistre une image au format .bmp
Image read_image(const char *filename, const bool flipY)
charge une image .bmp .tga .jpeg .png ou .hdr
Image linear(const Image &image)
transformation couleur : srgb vers rgb lineaire
bool write_image(const Image &image, const char *filename, const bool flipY)
enregistre une image au format .png
float range(const Image &image)
evalue l'exposition d'une image.
Image srgb(const Image &image)
transformation couleur : rgb lineaire vers srgb
Image tone(const Image &image, const float saturation)
correction de l'exposition d'une image + transformation gamma.
Point max(const Point &a, const Point &b)
renvoie la plus grande composante de chaque point. x, y, z= max(a.x, b.x), max(a.y,...
Point min(const Point &a, const Point &b)
renvoie la plus petite composante de chaque point. x, y, z= min(a.x, b.x), min(a.y,...
representation d'une couleur (rgba) transparente ou opaque.