png++: image.hpp Source File

png++ 0.2.10

image.hpp
Go to the documentation of this file.
1/*
2 * Copyright (C) 2007,2008 Alex Shulgin
3 *
4 * This file is part of png++ the C++ wrapper for libpng. PNG++ is free
5 * software; the exact copying conditions are as follows:
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions are met:
9 *
10 * 1. Redistributions of source code must retain the above copyright notice,
11 * this list of conditions and the following disclaimer.
12 *
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
16 *
17 * 3. The name of the author may not be used to endorse or promote products
18 * derived from this software without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
21 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
22 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
23 * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
25 * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
26 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
27 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
28 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
29 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 */
31#ifndef PNGPP_IMAGE_HPP_INCLUDED
32#define PNGPP_IMAGE_HPP_INCLUDED
33
34#include <fstream>
35#include "pixel_buffer.hpp"
36#include "generator.hpp"
37#include "consumer.hpp"
38#include "convert_color_space.hpp"
39
40namespace png
41{
42
61 template< typename pixel, typename pixel_buffer_type = pixel_buffer< pixel > >
62 class image
63 {
64 public:
68 typedef pixel_traits< pixel > traits;
69
73 typedef pixel_buffer_type pixbuf;
74
78 typedef typename pixbuf::row_type row_type;
79 typedef typename pixbuf::row_access row_access;
80 typedef typename pixbuf::row_const_access row_const_access;
81
86 typedef convert_color_space< pixel > transform_convert;
87
91 struct transform_identity
92 {
93 void operator()(io_base&) const {}
94 };
95
99 image()
100 : m_info(make_image_info< pixel >())
101 {
102 }
103
107 image(uint_32 width, uint_32 height)
108 : m_info(make_image_info< pixel >())
109 {
110 resize(width, height);
111 }
112
117 explicit image(std::string const& filename)
118 {
119 read(filename, transform_convert());
120 }
121
126 template< class transformation >
127 image(std::string const& filename,
128 transformation const& transform)
129 {
130 read(filename.c_str(), transform);
131 }
132
137 explicit image(char const* filename)
138 {
139 read(filename, transform_convert());
140 }
141
146 template< class transformation >
147 image(char const* filename, transformation const& transform)
148 {
149 read(filename, transform);
150 }
151
156 explicit image(std::istream& stream)
157 {
158 read_stream(stream, transform_convert());
159 }
160
165 template< class transformation >
166 image(std::istream& stream, transformation const& transform)
167 {
168 read_stream(stream, transform);
169 }
170
175 void read(std::string const& filename)
176 {
177 read(filename, transform_convert());
178 }
179
184 template< class transformation >
185 void read(std::string const& filename, transformation const& transform)
186 {
187 read(filename.c_str(), transform);
188 }
189
194 void read(char const* filename)
195 {
196 read(filename, transform_convert());
197 }
198
203 template< class transformation >
204 void read(char const* filename, transformation const& transform)
205 {
206 std::ifstream stream(filename, std::ios::binary);
207 if (!stream.is_open())
208 {
209 throw std_error(filename);
210 }
211 stream.exceptions(std::ios::badbit);
212 read_stream(stream, transform);
213 }
214
219 void read(std::istream& stream)
220 {
221 read_stream(stream, transform_convert());
222 }
223
228 template< class transformation >
229 void read(std::istream& stream, transformation const& transform)
230 {
231 read_stream(stream, transform);
232 }
233
238 template< class istream >
239 void read_stream(istream& stream)
240 {
241 read_stream(stream, transform_convert());
242 }
243
248 template< class istream, class transformation >
249 void read_stream(istream& stream, transformation const& transform)
250 {
251 pixel_consumer pixcon(m_info, m_pixbuf);
252 pixcon.read(stream, transform);
253 }
254
258 void write(std::string const& filename)
259 {
260 write(filename.c_str());
261 }
262
266 void write(char const* filename)
267 {
268 std::ofstream stream(filename, std::ios::binary);
269 if (!stream.is_open())
270 {
271 throw std_error(filename);
272 }
273 stream.exceptions(std::ios::badbit);
274 write_stream(stream);
275 }
276
280 template< class ostream >
281 void write_stream(ostream& stream)
282 {
283 pixel_generator pixgen(m_info, m_pixbuf);
284 pixgen.write(stream);
285 }
286
290 pixbuf& get_pixbuf()
291 {
292 return m_pixbuf;
293 }
294
298 pixbuf const& get_pixbuf() const
299 {
300 return m_pixbuf;
301 }
302
308 void set_pixbuf(pixbuf const& buffer)
309 {
310 m_pixbuf = buffer;
311 }
312
313 uint_32 get_width() const
314 {
315 return m_pixbuf.get_width();
316 }
317
318 uint_32 get_height() const
319 {
320 return m_pixbuf.get_height();
321 }
322
326 void resize(uint_32 width, uint_32 height)
327 {
328 m_pixbuf.resize(width, height);
329 m_info.set_width(width);
330 m_info.set_height(height);
331 }
332
339 row_access get_row(size_t index)
340 {
341 return m_pixbuf.get_row(index);
342 }
343
350 row_const_access get_row(size_t index) const
351 {
352 return m_pixbuf.get_row(index);
353 }
354
358 row_access operator[](size_t index)
359 {
360 return m_pixbuf[index];
361 }
362
366 row_const_access operator[](size_t index) const
367 {
368 return m_pixbuf[index];
369 }
370
374 pixel get_pixel(size_t x, size_t y) const
375 {
376 return m_pixbuf.get_pixel(x, y);
377 }
378
382 void set_pixel(size_t x, size_t y, pixel p)
383 {
384 m_pixbuf.set_pixel(x, y, p);
385 }
386
387 interlace_type get_interlace_type() const
388 {
389 return m_info.get_interlace_type();
390 }
391
392 void set_interlace_type(interlace_type interlace)
393 {
394 m_info.set_interlace_type(interlace);
395 }
396
397 compression_type get_compression_type() const
398 {
399 return m_info.get_compression_type();
400 }
401
402 void set_compression_type(compression_type compression)
403 {
404 m_info.set_compression_type(compression);
405 }
406
407 filter_type get_filter_type() const
408 {
409 return m_info.get_filter_type();
410 }
411
412 void set_filter_type(filter_type filter)
413 {
414 m_info.set_filter_type(filter);
415 }
416
420 palette& get_palette()
421 {
422 return m_info.get_palette();
423 }
424
428 palette const& get_palette() const
429 {
430 return m_info.get_palette();
431 }
432
436 void set_palette(palette const& plte)
437 {
438 m_info.set_palette(plte);
439 }
440
441 tRNS const& get_tRNS() const
442 {
443 return m_info.get_tRNS();
444 }
445
446 tRNS& get_tRNS()
447 {
448 return m_info.get_tRNS();
449 }
450
451 void set_tRNS(tRNS const& trns)
452 {
453 m_info.set_tRNS(trns);
454 }
455
456 double get_gamma() const
457 {
458 return m_info.get_gamma();
459 }
460
461 void set_gamma(double gamma)
462 {
463 m_info.set_gamma(gamma);
464 }
465
466 protected:
471 template< typename base_impl >
472 class streaming_impl
473 : public base_impl
474 {
475 public:
476 streaming_impl(image_info& info, pixbuf& pixels)
477 : base_impl(info),
478 m_pixbuf(pixels)
479 {
480 }
481
486 byte* get_next_row(size_t pos)
487 {
488 typedef typename pixbuf::row_traits row_traits;
489 return reinterpret_cast< byte* >
490 (row_traits::get_data(m_pixbuf.get_row(pos)));
491 }
492
493 protected:
494 pixbuf& m_pixbuf;
495 };
496
500 class pixel_consumer
501 : public streaming_impl< consumer< pixel,
502 pixel_consumer,
503 image_info_ref_holder,
504 /* interlacing = */ true > >
505 {
506 public:
507 pixel_consumer(image_info& info, pixbuf& pixels)
508 : streaming_impl< consumer< pixel,
509 pixel_consumer,
510 image_info_ref_holder,
511 true > >(info, pixels)
512 {
513 }
514
515 void reset(size_t pass)
516 {
517 if (pass == 0)
518 {
519 this->m_pixbuf.resize(this->get_info().get_width(),
520 this->get_info().get_height());
521 }
522 }
523 };
524
528 class pixel_generator
529 : public streaming_impl< generator< pixel,
530 pixel_generator,
531 image_info_ref_holder,
532 /* interlacing = */ true > >
533 {
534 public:
535 pixel_generator(image_info& info, pixbuf& pixels)
536 : streaming_impl< generator< pixel,
537 pixel_generator,
538 image_info_ref_holder,
539 true > >(info, pixels)
540 {
541 }
542 };
543
544 image_info m_info;
545 pixbuf m_pixbuf;
546 };
547
548} // namespace png
549
550#endif // PNGPP_IMAGE_HPP_INCLUDED
png::consumer< pixel, pixel_consumer, image_info_ref_holder, true >::consumer
consumer(image_info &info)
Definition consumer.hpp:218
png::consumer::read
void read(istream &stream)
Reads an image from the stream using default io transformation.
Definition consumer.hpp:144
png::generator< pixel, pixel_generator, image_info_ref_holder, true >::generator
generator(image_info &info)
Definition generator.hpp:187
png::generator::write
void write(ostream &stream)
Writes an image to the stream.
Definition generator.hpp:129
png::image::pixel_consumer
The pixel buffer adapter for reading pixel data.
Definition image.hpp:505
png::image::pixel_consumer::pixel_consumer
pixel_consumer(image_info &info, pixbuf &pixels)
Definition image.hpp:507
png::image::pixel_consumer::reset
void reset(size_t pass)
Definition image.hpp:515
png::image::pixel_generator
The pixel buffer adapter for writing pixel data.
Definition image.hpp:533
png::image::pixel_generator::pixel_generator
pixel_generator(image_info &info, pixbuf &pixels)
Definition image.hpp:535
png::image::streaming_impl::get_next_row
byte * get_next_row(size_t pos)
Returns the starting address of a pos-th row in the image's pixel buffer.
Definition image.hpp:486
png::image::streaming_impl::streaming_impl
streaming_impl(image_info &info, pixbuf &pixels)
Definition image.hpp:476
png::image::streaming_impl::m_pixbuf
pixbuf & m_pixbuf
Definition image.hpp:494
png::image_info_ref_holder
An image_info holder class. Stores a reference to the image_info object. The image_info object itself...
Definition streaming_base.hpp:68
png::image_info
Holds information about PNG image.
Definition image_info.hpp:48
png::image::read
void read(char const *filename)
Reads an image from specified file using default converting transform.
Definition image.hpp:194
png::image::write_stream
void write_stream(ostream &stream)
Writes an image to a stream.
Definition image.hpp:281
png::image::get_interlace_type
interlace_type get_interlace_type() const
Definition image.hpp:387
png::image::set_pixel
void set_pixel(size_t x, size_t y, pixel p)
Replaces a pixel at (x,y) position.
Definition image.hpp:382
png::image::m_pixbuf
pixbuf m_pixbuf
Definition image.hpp:545
png::image::image
image(std::string const &filename, transformation const &transform)
Constructs an image reading data from specified file using custom transformaton.
Definition image.hpp:127
png::image::get_pixbuf
pixbuf const & get_pixbuf() const
Returns a const reference to image pixel buffer.
Definition image.hpp:298
png::image::m_info
image_info m_info
Definition image.hpp:544
png::image::get_pixel
pixel get_pixel(size_t x, size_t y) const
Returns a pixel at (x,y) position.
Definition image.hpp:374
png::image::get_width
uint_32 get_width() const
Definition image.hpp:313
png::image::image
image(std::string const &filename)
Constructs an image reading data from specified file using default converting transform.
Definition image.hpp:117
png::image::image
image(char const *filename, transformation const &transform)
Constructs an image reading data from specified file using custom transformaton.
Definition image.hpp:147
png::image::get_gamma
double get_gamma() const
Definition image.hpp:456
png::image::set_pixbuf
void set_pixbuf(pixbuf const &buffer)
Replaces the image pixel buffer.
Definition image.hpp:308
png::image::operator[]
row_access operator[](size_t index)
The non-checking version of get_row() method.
Definition image.hpp:358
png::image::image
image(std::istream &stream, transformation const &transform)
Constructs an image reading data from a stream using custom transformation.
Definition image.hpp:166
png::image::image
image(std::istream &stream)
Constructs an image reading data from a stream using default converting transform.
Definition image.hpp:156
png::image::read
void read(std::string const &filename, transformation const &transform)
Reads an image from specified file using custom transformaton.
Definition image.hpp:185
png::image::operator[]
row_const_access operator[](size_t index) const
The non-checking version of get_row() method.
Definition image.hpp:366
png::image::read
void read(std::istream &stream)
Reads an image from a stream using default converting transform.
Definition image.hpp:219
png::image::get_row
row_access get_row(size_t index)
Returns a reference to the row of image data at specified index.
Definition image.hpp:339
png::image::get_height
uint_32 get_height() const
Definition image.hpp:318
png::image::read
void read(std::istream &stream, transformation const &transform)
Reads an image from a stream using custom transformation.
Definition image.hpp:229
png::image::get_row
row_const_access get_row(size_t index) const
Returns a const reference to the row of image data at specified index.
Definition image.hpp:350
png::image::get_tRNS
tRNS const & get_tRNS() const
Definition image.hpp:441
png::image::get_pixbuf
pixbuf & get_pixbuf()
Returns a reference to image pixel buffer.
Definition image.hpp:290
png::image::get_palette
palette & get_palette()
Returns a reference to the image palette.
Definition image.hpp:420
png::image::read
void read(std::string const &filename)
Reads an image from specified file using default converting transform.
Definition image.hpp:175
png::image::set_tRNS
void set_tRNS(tRNS const &trns)
Definition image.hpp:451
png::image::row_const_access
pixbuf::row_const_access row_const_access
Definition image.hpp:80
png::image::set_filter_type
void set_filter_type(filter_type filter)
Definition image.hpp:412
png::image::read_stream
void read_stream(istream &stream)
Reads an image from a stream using default converting transform.
Definition image.hpp:239
png::image::set_interlace_type
void set_interlace_type(interlace_type interlace)
Definition image.hpp:392
png::image::image
image(char const *filename)
Constructs an image reading data from specified file using default converting transform.
Definition image.hpp:137
png::image::get_tRNS
tRNS & get_tRNS()
Definition image.hpp:446
png::image::set_palette
void set_palette(palette const &plte)
Replaces the image palette.
Definition image.hpp:436
png::image::row_type
pixbuf::row_type row_type
Represents a row of image pixel data.
Definition image.hpp:78
png::image::read
void read(char const *filename, transformation const &transform)
Reads an image from specified file using custom transformaton.
Definition image.hpp:204
png::image::resize
void resize(uint_32 width, uint_32 height)
Resizes the image pixel buffer.
Definition image.hpp:326
png::image::image
image(uint_32 width, uint_32 height)
Constructs an empty image of specified width and height.
Definition image.hpp:107
png::image::get_filter_type
filter_type get_filter_type() const
Definition image.hpp:407
png::image::set_compression_type
void set_compression_type(compression_type compression)
Definition image.hpp:402
png::image::set_gamma
void set_gamma(double gamma)
Definition image.hpp:461
png::image::row_access
pixbuf::row_access row_access
Definition image.hpp:79
png::image::read_stream
void read_stream(istream &stream, transformation const &transform)
Reads an image from a stream using custom transformation.
Definition image.hpp:249
png::image::write
void write(std::string const &filename)
Writes an image to specified file.
Definition image.hpp:258
png::image::get_compression_type
compression_type get_compression_type() const
Definition image.hpp:397
png::image::transform_convert
convert_color_space< pixel > transform_convert
A transformation functor to convert any image to appropriate color space.
Definition image.hpp:86
png::image::traits
pixel_traits< pixel > traits
The pixel traits type for pixel.
Definition image.hpp:68
png::image::pixbuf
pixel_buffer_type pixbuf
The pixel buffer type for pixel.
Definition image.hpp:73
png::image::get_palette
palette const & get_palette() const
Returns a const reference to the image palette.
Definition image.hpp:428
png::image::write
void write(char const *filename)
Writes an image to specified file.
Definition image.hpp:266
png::image::image
image()
Constructs an empty image.
Definition image.hpp:99
png::info
Holds information about PNG image. Adapter class for IO image operations.
Definition info.hpp:48
png::io_base
Base class for PNG reader/writer classes.
Definition io_base.hpp:63
png::row_traits
The pixel row traits class template. Provides a common way to get starting address of the row for pac...
Definition pixel_buffer.hpp:53
png::std_error
Exception class to represent standard library errors (generally IO).
Definition error.hpp:78
png::streaming_base< pixel, image_info_ref_holder >::get_info
image_info const & get_info() const
Definition streaming_base.hpp:107
consumer.hpp
convert_color_space.hpp
generator.hpp
png
Definition color.hpp:37
png::make_image_info
image_info make_image_info()
Returns an image_info object with color_type and bit_depth fields setup appropriate for the pixel typ...
Definition image_info.hpp:204
png::interlace_type
interlace_type
Definition types.hpp:80
png::palette
std::vector< color > palette
The palette type. Currently implemented as std::vector of png::color.
Definition palette.hpp:44
png::uint_32
png_uint_32 uint_32
Definition types.hpp:41
png::compression_type
compression_type
Definition types.hpp:86
png::filter_type
filter_type
Definition types.hpp:92
png::tRNS
std::vector< byte > tRNS
The palette transparency map type. Currently implemented as std::vector of png::byte.
Definition tRNS.hpp:44
pixel_buffer.hpp
png::convert_color_space
IO transformation class template. Converts image color space.
Definition convert_color_space.hpp:257
png::image::transform_identity
The default io transformation: does nothing.
Definition image.hpp:92
png::image::transform_identity::operator()
void operator()(io_base &) const
Definition image.hpp:93
png::pixel_traits
Pixel traits class template.
Definition pixel_traits.hpp:48