image.h 2 KB
#ifndef STIM_IMAGE_H
#define STIM_IMAGE_H
#define cimg_use_jpeg         //necessary for JPG files
#include "CImg.h"

#include <iostream>
namespace stim{
//This static class provides the STIM interface for loading images
//	Use this interface for all image management - that way the actual library can be changed without problems

//currently this interface uses CImg
//	T = data type (usually unsigned char)
template <class T>
class image{

	cimg_library::CImg<T> img;

public:

	//default constructor
	image(){
	}

	//constructor (load an image file)
	image(std::string filename){
		img.load(filename.c_str());
	}

	//Load an image from a file
	void load(std::string filename){
		img.load(filename.c_str());
	}

	//save a file
	void save(std::string filename){
		img.save(filename.c_str());
	}

	//create an image from an interleaved buffer
	void set_interleaved(T* buffer, unsigned int width, unsigned int height, unsigned int channels = 1){

		unsigned char* non_interleaved = (unsigned char*)malloc(width * height * 3);
		unsigned int S = width * height;

		for(unsigned int i = 0; i < S; i++){
			for(unsigned int c = 0; c < channels; c++){
				non_interleaved[i + c * S] = buffer[i * channels + c];
			}
		}

		img = cimg_library::CImg<unsigned char>(non_interleaved, width, height, 1, channels);
	}

	//fills an allocated region of memory with non-interleaved data
	void data_noninterleaved(T* data){
		memcpy(data, img.data(), sizeof(T) * size());
	}

	void data_interleaved(T* data){

		unsigned int C = channels();
		unsigned int X = size();

		T* ptr = img.data();

		//for each channel
		for(unsigned int c = 0; c < C; c++)
			//convert each pixel
			for(unsigned int x = 0; x < X; x++)
				data[x * C + c] = ptr[c * X + x];
	}

	unsigned int channels(){
		return (unsigned int)img.spectrum();
	}

	unsigned int width(){
		return img.width();
	}

	unsigned int height(){
		return img.height();
	}

	//returns the size (number of values) of the image
	unsigned long size(){
		return img.size();
	}

	



};

};		//end namespace stim


#endif