Blame view

stim/image/image.h 2.32 KB
d32a1854   David Mayerich   added framework f...
1
2
  #ifndef STIM_IMAGE_H
  #define STIM_IMAGE_H
1cb3eb53   David Mayerich   modified image.h ...
3
4
5
  #ifdef JPEG_FOUND
  	#define cimg_use_jpeg         //necessary for JPG files
  #endif
fbf0ab02   David Mayerich   added support for...
6
7
  #include "CImg.h"
  
d32a1854   David Mayerich   added framework f...
8
  #include <iostream>
7b3948ab   David Mayerich   added support for...
9
  namespace stim{
d32a1854   David Mayerich   added framework f...
10
11
12
13
14
15
16
17
  //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{
  
7b3948ab   David Mayerich   added support for...
18
  	cimg_library::CImg<T> img;
d32a1854   David Mayerich   added framework f...
19
20
21
  
  public:
  
7b3948ab   David Mayerich   added support for...
22
23
24
25
26
27
28
29
30
  	//default constructor
  	image(){
  	}
  
  	//constructor (load an image file)
  	image(std::string filename){
  		img.load(filename.c_str());
  	}
  
41acaf5d   David Mayerich   added a CUDA Gaus...
31
32
33
34
35
  	/// Constructor initializes an image to a given size
  	image(unsigned int x, unsigned int y = 1, unsigned int z = 1){
  		img = cimg_library::CImg<T>(x, y, z);
  	}
  
d32a1854   David Mayerich   added framework f...
36
37
  	//Load an image from a file
  	void load(std::string filename){
7b3948ab   David Mayerich   added support for...
38
  		img.load(filename.c_str());
d32a1854   David Mayerich   added framework f...
39
40
41
42
  	}
  
  	//save a file
  	void save(std::string filename){
7b3948ab   David Mayerich   added support for...
43
  		img.save(filename.c_str());
d32a1854   David Mayerich   added framework f...
44
45
  	}
  
8b7be670   David Mayerich   implemented savin...
46
  	//create an image from an interleaved buffer
fbf0ab02   David Mayerich   added support for...
47
48
49
50
51
52
53
54
55
56
  	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];
  			}
  		}
d32a1854   David Mayerich   added framework f...
57
  
7b3948ab   David Mayerich   added support for...
58
59
60
  		img = cimg_library::CImg<unsigned char>(non_interleaved, width, height, 1, channels);
  	}
  
32504c2c   David Mayerich   fixed some functi...
61
  	//fills an allocated region of memory with non-interleaved data
8b7be670   David Mayerich   implemented savin...
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
  	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];
  	}
  
41acaf5d   David Mayerich   added a CUDA Gaus...
80
81
82
83
84
85
86
87
88
89
90
  	image<T> channel(unsigned int c){
  
  		//create a new image
  		image<T> single;
  
  		single.img = img.channel(c);
  
  		return single;
  
  	}
  
8b7be670   David Mayerich   implemented savin...
91
92
93
94
95
96
97
98
99
100
  	unsigned int channels(){
  		return (unsigned int)img.spectrum();
  	}
  
  	unsigned int width(){
  		return img.width();
  	}
  
  	unsigned int height(){
  		return img.height();
7b3948ab   David Mayerich   added support for...
101
  	}
d32a1854   David Mayerich   added framework f...
102
  
7b3948ab   David Mayerich   added support for...
103
104
105
  	//returns the size (number of values) of the image
  	unsigned long size(){
  		return img.size();
d32a1854   David Mayerich   added framework f...
106
107
108
109
110
111
112
113
  	}
  
  	
  
  
  
  };
  
7b3948ab   David Mayerich   added support for...
114
115
  };		//end namespace stim
  
d32a1854   David Mayerich   added framework f...
116
117
  
  #endif