added another example and (untested) jpg support
This commit is contained in:
parent
f9e67a8437
commit
f57ae8380e
3 changed files with 112 additions and 1 deletions
|
@ -33,6 +33,7 @@
|
||||||
4263431915FA67D500977AF9 /* png.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = png.hpp; sourceTree = "<group>"; };
|
4263431915FA67D500977AF9 /* png.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = png.hpp; sourceTree = "<group>"; };
|
||||||
4263431A15FA686300977AF9 /* basics.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = basics.hpp; sourceTree = "<group>"; };
|
4263431A15FA686300977AF9 /* basics.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = basics.hpp; sourceTree = "<group>"; };
|
||||||
4263431B15FA6A3200977AF9 /* libpng.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = libpng.framework; path = Library/Frameworks/libpng.framework; sourceTree = SDKROOT; };
|
4263431B15FA6A3200977AF9 /* libpng.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = libpng.framework; path = Library/Frameworks/libpng.framework; sourceTree = SDKROOT; };
|
||||||
|
4263431D1604A79F00977AF9 /* jpg.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = jpg.hpp; sourceTree = "<group>"; };
|
||||||
/* End PBXFileReference section */
|
/* End PBXFileReference section */
|
||||||
|
|
||||||
/* Begin PBXFrameworksBuildPhase section */
|
/* Begin PBXFrameworksBuildPhase section */
|
||||||
|
@ -72,6 +73,7 @@
|
||||||
4263431A15FA686300977AF9 /* basics.hpp */,
|
4263431A15FA686300977AF9 /* basics.hpp */,
|
||||||
4263431815FA679600977AF9 /* bmp.hpp */,
|
4263431815FA679600977AF9 /* bmp.hpp */,
|
||||||
4263431915FA67D500977AF9 /* png.hpp */,
|
4263431915FA67D500977AF9 /* png.hpp */,
|
||||||
|
4263431D1604A79F00977AF9 /* jpg.hpp */,
|
||||||
);
|
);
|
||||||
path = ImageStreams;
|
path = ImageStreams;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
|
|
89
ImageStreams/jpg.hpp
Normal file
89
ImageStreams/jpg.hpp
Normal file
|
@ -0,0 +1,89 @@
|
||||||
|
//
|
||||||
|
// jpg.hpp
|
||||||
|
// ImageStreams
|
||||||
|
//
|
||||||
|
// Created by Joshua Moerman on 9/15/12.
|
||||||
|
// Copyright (c) 2012 Vadovas. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef ImageStreams_jpg_hpp
|
||||||
|
#define ImageStreams_jpg_hpp
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdexcept>
|
||||||
|
#include <vector>
|
||||||
|
#include <jpeglib.h>
|
||||||
|
#include "basics.hpp"
|
||||||
|
|
||||||
|
/*
|
||||||
|
JPEG only supports 8bits or 24bits per pixel (eg grayscale or full color).
|
||||||
|
Top to bottom
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace jpg{
|
||||||
|
|
||||||
|
template <typename P = pixel_formats::rgb>
|
||||||
|
struct ostream{
|
||||||
|
typedef P pixel;
|
||||||
|
|
||||||
|
ostream() = delete;
|
||||||
|
ostream(ostream const &) = delete;
|
||||||
|
ostream & operator=(ostream const &) = delete;
|
||||||
|
|
||||||
|
ostream(uint32_t width, uint32_t height, std::string filename)
|
||||||
|
: fp(0)
|
||||||
|
, cinfo()
|
||||||
|
, jerr()
|
||||||
|
, row(width)
|
||||||
|
, x(0)
|
||||||
|
{
|
||||||
|
fp = fopen(filename.c_str(), "wb");
|
||||||
|
if(!fp) throw std::runtime_error("Could not open file");
|
||||||
|
|
||||||
|
cinfo.err = jpeg_std_error(&jerr);
|
||||||
|
jpeg_create_compress(&cinfo);
|
||||||
|
jpeg_stdio_dest(&cinfo, fp);
|
||||||
|
|
||||||
|
cinfo.image_width = width;
|
||||||
|
cinfo.image_height = height;
|
||||||
|
cinfo.input_components = pixel_formats::traits<pixel>::num_colors;
|
||||||
|
//cinfo.in_color_space = JCS_RGB; // or JCS_GRAYSCALE, will be set in jpeg_set_defaults()
|
||||||
|
|
||||||
|
jpeg_set_defaults(&cinfo);
|
||||||
|
//jpeg_set_quality(&cinfo, 75, true); // quality in [0, 100], boolean indicates "force_baseline" (only matters when quality < 25)
|
||||||
|
jpeg_start_compress(&cinfo, true); // true means we will write completely
|
||||||
|
}
|
||||||
|
|
||||||
|
~ostream(){
|
||||||
|
jpeg_finish_compress(&cinfo);
|
||||||
|
fclose(fp);
|
||||||
|
jpeg_destroy_compress(&cinfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
ostream& operator<<(pixel const & p){
|
||||||
|
row[x] = p;
|
||||||
|
++x;
|
||||||
|
if(x >= row.size()){
|
||||||
|
// this will return the number of scanlines written
|
||||||
|
jpeg_write_scanlines(&cinfo, reinterpret_cast<unsigned char const*>(row.data()), 1);
|
||||||
|
x = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
FILE* fp;
|
||||||
|
jpeg_compress_struct cinfo;
|
||||||
|
jpeg_error_mgr jerr;
|
||||||
|
|
||||||
|
std::vector<pixel> row;
|
||||||
|
uint32_t x;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef ostream<> colored_ostream;
|
||||||
|
typedef ostream<pixel_formats::gray> gray_ostream;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
|
@ -91,12 +91,29 @@ void logistic(std::string filename) {
|
||||||
|
|
||||||
ImageType image(size, size, filename);
|
ImageType image(size, size, filename);
|
||||||
for(int i = 0; i < size*size; ++i){
|
for(int i = 0; i < size*size; ++i){
|
||||||
double c = start + i * (end - start) / (size*size);
|
double c = start + i * (end - start) / double(size*size - 1);
|
||||||
// I know; the order of evaluation is implementation defined
|
// I know; the order of evaluation is implementation defined
|
||||||
image << typename ImageType::pixel(x = logistic_step(x, c), x = logistic_step(x, c), x = logistic_step(x, c));
|
image << typename ImageType::pixel(x = logistic_step(x, c), x = logistic_step(x, c), x = logistic_step(x, c));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename ImageType>
|
||||||
|
void logistic2(std::string filename) {
|
||||||
|
size_t width = 1280;
|
||||||
|
size_t height = 800;
|
||||||
|
double start = 3.847;
|
||||||
|
double end = 3.9;
|
||||||
|
|
||||||
|
ImageType image(width, height, filename);
|
||||||
|
for(int y = 0; y < height; ++y){
|
||||||
|
double z = 0.5 * y / double(height - 1);
|
||||||
|
for(int x = 0; x < width; ++x){
|
||||||
|
double c = start + x * (end - start) / double(width - 1);
|
||||||
|
image << typename ImageType::pixel(z = logistic_step(z, c), z = logistic_step(z, c), z = logistic_step(z, c));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, const char * argv[]){
|
int main(int argc, const char * argv[]){
|
||||||
xor_color<png::colored_ostream>("xor_color.png");
|
xor_color<png::colored_ostream>("xor_color.png");
|
||||||
xor_color<bmp::colored_ostream>("xor_color.bmp");
|
xor_color<bmp::colored_ostream>("xor_color.bmp");
|
||||||
|
@ -112,5 +129,8 @@ int main(int argc, const char * argv[]){
|
||||||
|
|
||||||
logistic<png::colored_ostream>("logistic.png");
|
logistic<png::colored_ostream>("logistic.png");
|
||||||
logistic<bmp::colored_ostream>("logistic.bmp");
|
logistic<bmp::colored_ostream>("logistic.bmp");
|
||||||
|
|
||||||
|
logistic2<png::colored_ostream>("logistic2.png");
|
||||||
|
logistic2<bmp::colored_ostream>("logistic2.bmp");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Reference in a new issue