OSDN Git Service

add lightenmode
[multipleexposed/multipleexposedholic.git] / MultiExposedHolic.pde
1 import controlP5.*;
2
3 ControlP5 cp5;
4 ControlWindow controlWindow;
5 ControlWindow viewWindow;
6 Textlabel readmeText;
7
8 ListBox l;
9
10 int blendmode = 0;
11
12 String imgPath;
13
14 PImage img0; // source image(base)
15 PImage img1; // source image
16 PImage tuned_img0; // source image(base)
17 PImage tuned_img1; // source image
18 PImage writeimg; // multiple exposed image
19
20 float gamma_s = 1.0; // gamma value for source image
21 float gamma_m = 1.0; // gamma value for multiple exposed image
22
23 float gain_s = 1;
24 float gain_m = 1;
25
26 float[] lut_s = new float[256];
27 float[] lut_m = new float[256];
28
29 //Window Size
30 int view_width=1024, view_height=768;
31 int view_swidth0, view_sheight0;
32 int view_swidth1, view_sheight1;
33
34 int size_sx = 160;
35 int size_sy = 120;
36
37 int size_x = 800;
38 int size_y = 640;
39
40
41 void TuneImage(){
42   for (int i = 0; i < 256; i++){
43     lut_s[i] = 255*pow(((float)i/255),(1/gamma_s));
44   }
45
46   for (int i = 0; i < 256; i++){
47     lut_m[i] = 255*pow(((float)i/255),(1/gamma_m));
48   }
49
50   tuned_img0 = createImage(img0.width, img0.height, RGB);
51   tuned_img1 = createImage(img1.width, img1.height, RGB);
52
53   img0.loadPixels();
54   img1.loadPixels();
55
56   for(int i = 0; i < img0.width*img0.height; i++){
57     color tmp_color = img0.pixels[i];
58
59     int tmp_r = (int)(lut_s[(int)red(tmp_color)]*gain_s);
60     int tmp_g = (int)(lut_s[(int)green(tmp_color)]*gain_s);
61     int tmp_b = (int)(lut_s[(int)blue(tmp_color)]*gain_s);
62      
63     tuned_img0.pixels[i] = color(tmp_r, tmp_g, tmp_b);
64   }
65
66   for(int i = 0; i < img1.width*img1.height; i++){
67     color tmp_color = img1.pixels[i];
68
69     int tmp_r = (int)(lut_m[(int)red(tmp_color)]*gain_m);
70     int tmp_g = (int)(lut_m[(int)green(tmp_color)]*gain_m);
71     int tmp_b = (int)(lut_m[(int)blue(tmp_color)]*gain_m);
72
73     tuned_img1.pixels[i] = color(tmp_r, tmp_g, tmp_b);
74   }
75 }
76
77 void ImageMultiExposed(){
78   writeimg = createImage(img0.width, img0.height, RGB);
79
80   if(writeimg.width > size_x || writeimg.height > size_y){
81     float k_width = (float)writeimg.width / (float)size_x;
82     float k_height = (float)writeimg.height / (float)size_y;
83     float k_max;
84
85     if(k_width > k_height){
86       k_max = k_width;
87     }else{
88       k_max = k_height;
89     }
90
91     view_width = (int)(writeimg.width/k_max);
92     view_height = (int)(writeimg.height/k_max);
93   }else{
94     view_width = writeimg.width;
95     view_height = writeimg.height;
96   }
97
98   tuned_img0.loadPixels();
99   tuned_img1.loadPixels();
100
101   switch(blendmode){
102     case 1: // Screen
103       for(int i = 0; i < img0.width*img0.height; i++){
104         color tmp_color0 = tuned_img0.pixels[i];
105         color tmp_color1 = tuned_img1.pixels[i];
106         int r = ((int)red(tmp_color0) + (int)red(tmp_color1))
107                 - ((int)red(tmp_color0) * (int)red(tmp_color1))/0xff;
108         int g = ((int)green(tmp_color0) + (int)green(tmp_color1))
109                 -((int)green(tmp_color0) * (int)green(tmp_color1))/0xff;
110         int b = ((int)blue(tmp_color0) + (int)blue(tmp_color1))
111                 -((int)blue(tmp_color0) * (int)blue(tmp_color1))/0xff;
112         writeimg.pixels[i] = color(r,g,b);
113       }
114       break;
115     case 2: // Multiply
116       for(int i = 0; i < img0.width*img0.height; i++){
117         color tmp_color0 = tuned_img0.pixels[i];
118         color tmp_color1 = tuned_img1.pixels[i];
119         int r = ((int)red(tmp_color0) * (int)red(tmp_color1))/0xff;
120         int g = ((int)green(tmp_color0) * (int)green(tmp_color1))/0xff;
121         int b = ((int)blue(tmp_color0) * (int)blue(tmp_color1))/0xff;
122         writeimg.pixels[i] = color(r,g,b);
123       }
124       break;
125     case 3: // Overlay
126       for(int i = 0; i < img0.width*img0.height; i++){
127         color tmp_color0 = tuned_img0.pixels[i];
128         color tmp_color1 = tuned_img1.pixels[i];
129         int r,g,b;
130         if((int)red(tmp_color0)>=0x80){
131           r = 2*(((int)red(tmp_color0) + (int)red(tmp_color1))
132                   - ((int)red(tmp_color0) * (int)red(tmp_color1))/0xff) - 0xff;
133         }else{
134           r = ((int)red(tmp_color0) * (int)red(tmp_color1)*2)/0xff;
135         }
136
137         if((int)green(tmp_color0)>=0x80){
138           g = 2*(((int)green(tmp_color0) + (int)green(tmp_color1))
139                   - ((int)green(tmp_color0) * (int)green(tmp_color1))/0xff) - 0xff;
140         }else{
141           g = ((int)green(tmp_color0) * (int)green(tmp_color1)*2)/0xff;
142         }
143
144         if((int)blue(tmp_color0)>=0x80){
145           b = 2*(((int)blue(tmp_color0) + (int)blue(tmp_color1))
146                   - ((int)blue(tmp_color0) * (int)blue(tmp_color1))/0xff) - 0xff;
147         }else{
148           b = ((int)blue(tmp_color0) * (int)blue(tmp_color1)*2)/0xff;
149         }
150
151         writeimg.pixels[i] = color(r,g,b);
152       }
153       break;
154     case 4: // Lighten
155       for(int i = 0; i < img0.width*img0.height; i++){
156         color tmp_color0 = tuned_img0.pixels[i];
157         color tmp_color1 = tuned_img1.pixels[i];
158         int r, g, b;
159         if((int)red(tmp_color0) >  (int)red(tmp_color1)){
160           r =(int)red(tmp_color0);
161         }else{
162           r =(int)red(tmp_color1);
163         }
164
165         if((int)green(tmp_color0) >  (int)green(tmp_color1)){
166           g =(int)green(tmp_color0);
167         }else{
168           g =(int)green(tmp_color1);
169         }
170
171         if((int)blue(tmp_color0) >  (int)blue(tmp_color1)){
172           b =(int)blue(tmp_color0);
173         }else{
174           b =(int)blue(tmp_color1);
175         }
176
177         writeimg.pixels[i] = color(r,g,b);
178       }
179       break;
180     default:
181       break;
182   }
183   writeimg.updatePixels();
184 }
185
186 void setup(){
187   size(size_x, size_y+size_sy);
188
189   cp5 = new ControlP5(this);
190
191   controlWindow = cp5.addControlWindow("Tunewindow", 100, 100, 360, 600)
192     .hideCoordinates()
193     .setBackground(color(40))
194     ;
195
196   cp5.addButton("Load Source Image")
197      .setPosition(40,40)
198      .setSize(130,39)
199      .moveTo(controlWindow)
200      ;
201
202   cp5.addSlider("gamma_s")
203      .setRange(0, 2)
204      .setPosition(40, 100)
205      .setSize(100, 25)
206      .moveTo(controlWindow)
207      ;
208
209   cp5.addSlider("gain_s")
210      .setRange(0, 4)
211      .setPosition(40, 140)
212      .setSize(100, 25)
213      .moveTo(controlWindow)
214      ;
215
216   cp5.addButton("Load MultipleExposed Image")
217      .setPosition(200,40)
218      .setSize(130,39)
219      .moveTo(controlWindow)
220      ;
221
222   cp5.addSlider("gamma_m")
223      .setRange(0, 2)
224      .setPosition(200, 100)
225      .setSize(100, 25)
226      .moveTo(controlWindow)
227      ;
228
229   cp5.addSlider("gain_m")
230      .setRange(0, 4)
231      .setPosition(200, 140)
232      .setSize(100, 25)
233      .moveTo(controlWindow)
234      ;
235
236   l = cp5.addListBox("myList")
237          .setPosition(40, 250)
238          .setSize(120, 180)
239          .setItemHeight(39)
240          .setBarHeight(20)
241          .setColorBackground(color(40, 128))
242          .setColorActive(color(255, 128))
243          .moveTo(controlWindow)
244          ;
245
246   l.captionLabel().toUpperCase(true);
247   l.captionLabel().set("MultiExposed Mode");
248   l.captionLabel().setColor(0xffff0000);
249   l.captionLabel().style().marginTop = 3;
250   l.valueLabel().style().marginTop = 3;
251   
252   ListBoxItem lbi;
253   lbi = l.addItem("Screen", 0);
254   lbi.setColorBackground(0xffff0000);
255   lbi = l.addItem("Multiply", 1);
256   lbi.setColorBackground(0xffff0000);
257   lbi = l.addItem("Overlay", 2);
258   lbi.setColorBackground(0xffff0000);
259   lbi = l.addItem("Lighten", 3);
260   lbi.setColorBackground(0xffff0000);
261
262   cp5.addButton("Save Image")
263      .setPosition(40,500)
264      .setSize(100,39)
265      .moveTo(controlWindow)
266      ;
267
268   cp5.addButton("Exit")
269      .setPosition(160,500)
270      .setSize(100,39)
271      .moveTo(controlWindow)
272      ;
273
274   img0 = createImage(size_sx, size_sy, RGB);
275   img1 = createImage(size_sx, size_sy, RGB);
276   writeimg = createImage(size_x, size_y, RGB);
277 }
278
279 public void controlEvent(ControlEvent theEvent) {
280   if(theEvent.isFrom("Load Source Image")) {
281     imgPath = selectInput();
282     img0 = loadImage(imgPath);
283
284     if(img0.width > size_sx || img0.height > size_sy){
285       float k_width = (float)img0.width / (float)size_sx;
286       float k_height = (float)img0.height / (float)size_sy;
287       float k_max;
288
289       if(k_width > k_height){
290         k_max = k_width;
291       }else{
292         k_max = k_height;
293       }
294       view_swidth0 = (int)(img0.width/k_max);
295       view_sheight0 = (int)(img0.height/k_max);
296     }else{
297       view_swidth0 = img0.width;
298       view_sheight0 = img0.height;
299     }
300   }
301
302   if(theEvent.isFrom("Load MultipleExposed Image")) {
303     imgPath = selectInput();
304     img1 = loadImage(imgPath);
305
306     if(img1.width > size_sx || img1.height > size_sy){
307       float k_width = (float)img1.width / (float)size_sx;
308       float k_height = (float)img1.height / (float)size_sy;
309       float k_max;
310
311       if(k_width > k_height){
312         k_max = k_width;
313       }else{
314         k_max = k_height;
315       }
316       view_swidth1 = (int)(img1.width/k_max);
317       view_sheight1 = (int)(img1.height/k_max);
318     }else{
319       view_swidth1 = img1.width;
320       view_sheight1 = img1.height;
321     }
322   }
323
324   if (theEvent.isGroup()) {
325     // an event from a group e.g. scrollList
326     // +1 is offset
327     blendmode = (int)theEvent.group().value()+1;
328   }
329
330   if(theEvent.isFrom("Save Image")) {
331     String imgPath = selectOutput();
332     writeimg.save(imgPath);
333   }
334
335   if(theEvent.isFrom("Exit")) {
336     exit();
337   }
338 }
339
340 void draw(){
341   background(0);
342   tuned_img0 = img0;
343   tuned_img1 = img1;
344
345   if(img0.width == img1.width && img0.height == img1.height){
346     TuneImage();
347     ImageMultiExposed();
348   }
349
350   image(tuned_img0, 0, 0, view_swidth0, view_sheight0);
351   image(tuned_img1, size_sx, 0, view_swidth1, view_sheight1);
352
353   if(img0.width == img1.width && img0.height == img0.height){
354     image(writeimg, 0, size_sy, view_width, view_height);
355   }
356 }