2 const CANVAS_SIZE = 512;
3 //座標取得の際、元の画像の大きさをCANVAS_SIZEの寸法でリサイズしているからIMAZE_SIZEを記憶して、取得する座標値を正確にする
4 var IMAGE_SIZE;//合成画像におけるIMAZE_SIZEはdisplay1に依存する仕様
7 function Display(_canvas,_context,_file,_image,_sorce,_number,_id){
9 this.context = _context;
13 this.thumbnail_number = _number;
14 this.thumbnail_canvas_id = _id;
15 this.magnification = 1;
19 this.config_x = "No Data.";
20 this.config_y = "No Data.";
21 this.config_z = "No Data.";
22 this.config_alfa = "No Data.";
23 this.config_beta = "No Data.";
24 this.config_offsetX = "No Data.";
25 this.config_offsetY = "No Data.";
26 this.config_angle = "No Data.";
29 var display1 = new Display(); // LM
30 var display2 = new Display(); // EM
31 var display3 = new Display(); // Blend[Color]
32 var display4 = new Display(); // Scale&MoveXY
34 var thumbnails = []; //サムネイルの配列
36 //main HTMLがロードされると呼び出される
38 display1.canvas = document.getElementById('canvas');
39 display2.canvas = document.getElementById('canvas2');
40 display3.canvas = document.getElementById('canvas3');
41 display4.canvas = document.getElementById('canvas4');
43 display1.context = display1.canvas.getContext('2d');
44 display2.context = display2.canvas.getContext('2d');
45 display3.context = display3.canvas.getContext('2d');
46 display4.context = display4.canvas.getContext('2d');
48 display1.canvas.height = CANVAS_SIZE;
49 display1.canvas.width = CANVAS_SIZE;
50 display2.canvas.height = CANVAS_SIZE;
51 display2.canvas.width = CANVAS_SIZE;
52 display3.canvas.height = CANVAS_SIZE;
53 display3.canvas.width = CANVAS_SIZE;
54 display4.canvas.height = CANVAS_SIZE;
55 display4.canvas.width = CANVAS_SIZE;
59 function loadFile(files,number){
63 display1.context.clearRect(0,0,display1.canvas.width,display1.canvas.height);
64 magnification_init(display1);
65 rotation_init(display1);
66 move_params_init(display1);
67 displayImage(display1);
68 }else if(number != -1){
69 thumbnails[number-1].file = file;
70 make_canvas(thumbnails[number-1]);
74 //ファイルを選択でローカルから画像ファイルを読み込んでcanvasに描画する
75 function displayImage(display){
81 var image = new Image();
82 var reader = new FileReader();
84 if(!display.file){//display4に対する描画
86 display.context.mozImageSmoothingEnabled = false;
87 display.context.webkitImageSmoothingEnabled = false;
88 display.context.msImageSmoothingEnabled = false;
89 display.context.imageSmoothingEnabled = false;
92 imageAspect = image.width / image.height;
93 if (imageAspect >= 1) { //画像が横長
95 width = display.canvas.width;
96 height = display.canvas.height / imageAspect;
97 to = (display.canvas.height - height) / 2;
100 width = display.canvas.width * imageAspect;
101 height = display.canvas.height;
102 left = (display.canvas.width - width) / 2;
105 //ファイルアップロード2回目以降のcanvasの初期化
106 display.context.clearRect(0,0,display.canvas.width,display.canvas.height);
107 /****************変換適用***********************************************/
108 display.context.translate(parseInt(display.canvas.width / 2),parseInt(display.canvas.height / 2)); //コンテキストに対する効果の始点を中心に移動
109 display.context.scale(display.magnification,display.magnification); //倍率をコンテキストに反映
110 display.context.rotate(display.angle / 180 * Math.PI); //回転をコンテキストに反映
111 display.context.translate(-parseInt(display.canvas.width / 2),-parseInt(display.canvas.height / 2));
112 /**************************************************************************/
114 //画像をアスペクト比を維持して中心に表示(描画時は効果を元の位置に戻す)
115 display.context.drawImage(display3.canvas, 0, 0, display.canvas.width, display.canvas.height, display.movx/display.magnification, display.movy/display.magnification, display.canvas.width, display.canvas.height);
117 /*****************変換調整***********************************************/
118 display.context.translate(parseInt(display.canvas.width / 2),parseInt(display.canvas.height / 2)); //コンテキストに対する効果の始点を中心に移動
119 display.context.scale(1 / display.magnification,1 / display.magnification); //画像の倍率の初期化
120 display.context.rotate(-1 * display.angle / 180 * Math.PI); //角度の初期化
121 display.context.translate(-parseInt(display.canvas.width / 2),-parseInt(display.canvas.height / 2));
122 /****************************************************************************/
124 reader.onload = function(event){
125 image.onload = function(){
128 display.context.mozImageSmoothingEnabled = false;
129 display.context.webkitImageSmoothingEnabled = false;
130 display.context.msImageSmoothingEnabled = false;
131 display.context.imageSmoothingEnabled = false;
133 if(display == display1){
134 if(image.width > image.height){
135 IMAGE_SIZE = image.width;
137 IMAGE_SIZE = image.height;
141 imageAspect = image.width / image.height;
142 if (imageAspect >= 1) { //画像が横長
144 width = display.canvas.width;
145 height = display.canvas.height / imageAspect;
146 to = (display.canvas.height - height) / 2;
149 width = display.canvas.width * imageAspect;
150 height = display.canvas.height;
151 left = (display.canvas.width - width) / 2;
154 //ファイルアップロード2回目以降のcanvasの初期化
155 display.context.clearRect(0,0,display.canvas.width,display.canvas.height);
157 /****************変換適用***********************************************/
158 display.context.translate(parseInt(display.canvas.width / 2),parseInt(display.canvas.height / 2)); //コンテキストに対する効果の始点を中心に移動
159 display.context.scale(display.magnification,display.magnification); //倍率をコンテキストに反映
160 display.context.rotate(display.angle / 180 * Math.PI); //回転をコンテキストに反映
161 display.context.translate(-parseInt(display.canvas.width / 2),-parseInt(display.canvas.height / 2));
162 /**************************************************************************/
164 //画像をアスペクト比を維持して中心に表示(描画時は効果を元の位置に戻す)
165 display.context.drawImage(image, 0, 0, image.width, image.height, (left+(display.movx)), (to-(display.movy)), width, height);
167 /*****************変換調整***********************************************/
168 display.context.translate(parseInt(display.canvas.width / 2),parseInt(display.canvas.height / 2)); //コンテキストに対する効果の始点を中心に移動
169 display.context.scale(1 / display.magnification,1 / display.magnification); //画像の倍率の初期化
170 display.context.rotate(-1 * display.angle / 180 * Math.PI); //角度の初期化
171 display.context.translate(-parseInt(display.canvas.width / 2),-parseInt(display.canvas.height / 2));
172 /****************************************************************************/
173 if(display == display2 && display2.thumbnail_number){
174 Display2ToThumbnails(display.thumbnail_number); //Display2のサムネイルごとにパラメータを保持
177 image.src = event.target.result;
179 if(display.file && display.file.type.match('image.*')){
180 reader.readAsDataURL(display.file);
188 function scaling(number){
190 display1.magnification = parseFloat(form1.magnification.value);
191 displayImage(display1);
192 }else if(number == 2){
193 display2.magnification = parseFloat(form2.magnification.value);
194 displayImage(display2);
195 }else if(number == 4){
196 display4.magnification = parseFloat(form4.magnification.value);
197 displayImage(display4);
202 function rotation(number){
204 display1.angle = parseFloat(form1.angle.value);
205 displayImage(display1);
206 }else if(number == 2){
207 display2.angle = parseFloat(form2.angle.value);
208 displayImage(display2);
213 function moving(number){
215 var pixel_length = d1_unit.pixel_length.value; //[unit]/px
216 var order = d1_unit.order.value; //[unit]の次数
217 var orderx = form1.orderx.value; //movexの次数
218 var ordery = form1.ordery.value; //moveyの次数
220 display1.movx = parseFloat(form1.movex.value)/pixel_length * Math.pow(10,-orderx-(-order));//px
221 display1.movy = parseFloat(form1.movey.value)/pixel_length * Math.pow(10,-ordery-(-order));
222 displayImage(display1);
223 }else if(number == 2){
224 var pixel_length = d2_unit.pixel_length.value; //[unit]/px
225 var order = d2_unit.order.value; //[unit]の次数
226 var orderx = form2.orderx.value; //movexの次数
227 var ordery = form2.ordery.value; //moveyの次数
229 display2.movx = parseFloat(form2.movex.value)/pixel_length * Math.pow(10,-orderx-(-order));
230 display2.movy = parseFloat(form2.movey.value)/pixel_length * Math.pow(10,-ordery-(-order));
231 displayImage(display2);
232 }else if(number == 4){
233 var pixel_length = d4_unit.pixel_length.value; //[unit]/px
234 var order = d4_unit.order.value; //[unit]の次数
235 var orderx = form4.orderx.value; //movexの次数
236 var ordery = form4.ordery.value; //moveyの次数
238 display4.movx = parseFloat(form4.movex.value)/pixel_length * Math.pow(10,-orderx-(-order));
239 display4.movy = parseFloat(form4.movey.value)/pixel_length * Math.pow(10,-ordery-(-order));
240 displayImage(display4);
245 function rotation_init(number,display){
247 form1.angle.value = 0;
248 display.angle = parseFloat(form1.angle.value);
249 }else if(number == 2){
250 form2.angle.value = 0;
251 display.angle = parseFloat(form2.angle.value);
256 function magnification_init(number,display){
258 form1.magnification.value = 1.00;
259 display.magnification = parseFloat(form1.magnification.value);
260 }else if(number == 2){
261 form2.magnification.value = 1.00;
262 display.magnification = parseFloat(form2.magnification.value);
263 }else if(number == 4){
264 form4.magnification.value = 1.00;
265 display.magnification = parseFloat(form4.magnification.value);
270 function move_params_init(number,display){
272 form1.movex.value = 0;
273 form1.movey.value = 0;
274 display.movx = parseFloat(form1.movex.value);
275 display.movy = parseFloat(form1.movey.value);
276 }else if(number == 2){
277 form2.movex.value = 0;
278 form2.movey.value = 0;
279 display.movx = parseFloat(form2.movex.value);
280 display.movy = parseFloat(form2.movey.value);
281 }else if(number == 4){
282 form4.movex.value = 0;
283 form4.movey.value = 0;
284 display.movx = parseFloat(form4.movex.value);
285 display.movy = parseFloat(form4.movey.value);
290 function reseting(number){
292 move_params_init(number,display1);
293 rotation_init(number,display1);
294 magnification_init(number,display1);
295 displayImage(display1);
296 }else if(number == 2){
297 move_params_init(number,display2);
298 rotation_init(number,display2);
299 magnification_init(number,display2);
300 displayImage(display2);
301 }else if(number == 4){
302 move_params_init(number,display4);
303 magnification_init(number,display4);
304 displayImage(display4);
309 function add_table(){
310 var tbody = document.getElementById("tbody_thumbnail_files");
312 if(tr.length > 0 && !thumbnails[tr.length - 1].file){
313 window.alert("Please upload image file at No." + (tr.length));
317 var new_tr = tbody.insertRow(-1);
318 var row_index = new_tr.rowIndex;
320 var number_td = new_tr.insertCell(-1);
321 var imageflie_td = new_tr.insertCell(-1);
322 var configflie_td = new_tr.insertCell(-1);
323 var delete_button = new_tr.insertCell(-1);
325 thumbnail_add(row_index);
327 number_td.innerHTML = thumbnails[row_index - 1].thumbnail_number;
328 imageflie_td.innerHTML = "<input type='file' accept='image/*' onChange='loadFile(this.files,this.parentNode.parentNode.rowIndex);'>";
329 configflie_td.innerHTML = "<input type='file' accept='text/*' onChange='config_upload(this.files, this.parentNode.parentNode.rowIndex)'>"
330 delete_button.innerHTML = "<input type='button' value='del' onClick='delete_table(this.parentNode.parentNode.rowIndex)'>";
334 function delete_table(row_index){
335 var tbody = document.getElementById("tbody_thumbnail_files");
336 var row_length = tbody.rowIndex;
338 tbody.deleteRow(row_index - 1);
339 thumbnail_del(row_index);
341 for(var j = 0; j <= thumbnails.length - row_index; j++){
342 var tr = tbody.rows[row_index + j - 1];
343 var number_td = tr.cells[0];
344 number_td.innerHTML = thumbnails[row_index + j - 1].thumbnail_number;
346 //console.log(thumbnails);
350 function clear_table(){
351 var tbody = document.getElementById("tbody_thumbnail_files");
352 var row_length = tbody.rows.length;
354 for(var i = 0; i < Math.ceil(row_length / 2); i++){//6->3,7->4
356 if(tbody.rows.length != 0){//奇数用
359 thumbnail_clr(row_length - i - 1);
364 function thumbnail_add(row_index){
365 var thumbnail = new Display();
366 thumbnail.thumbnail_number = row_index;
367 thumbnails.push(thumbnail);
368 //console.log(thumbnails);
372 function thumbnail_del(row_index){
373 var tbody = document.getElementById("thumbnail_canvas");
374 var row_length = tbody.rows.length;
376 for(var i=Math.ceil(row_index/2); i<=row_length; i++){
379 }else if(row_index%2==0){
380 for(var i=Math.ceil(row_index/2); i<row_length; i++){
383 tr = tbody.rows[Math.ceil(row_index/2) - 1];
386 thumbnails.splice(row_index-1,1);
387 for(var i=row_index; i<=thumbnails.length; i++){
388 thumbnails[i-1].thumbnail_number -= 1;
389 make_canvas(thumbnails[i-1]);
394 function thumbnail_clr(index){
395 //thumbnails[index].context.clearRect(0,0,thumbnails[index].canvas.width,thumbnails[index].canvas.height);
396 var tbody = document.getElementById("thumbnail_canvas");
397 var tr = tbody.deleteRow(-1);//canvasを消去
400 if(thumbnails.length != 0){//奇数用
403 //console.log(thumbnails);
407 function make_canvas(thumbnail){
409 var tbody = document.getElementById("thumbnail_canvas");
410 var id = "canvas_" + thumbnail.thumbnail_number;
411 thumbnail.thumbnail_canvas_id = id;
412 //odd->行追加, even->列追加
413 if(thumbnail.thumbnail_number % 2 == 1){
414 var new_tr = tbody.insertRow(-1);
415 var odd_canvas_td = new_tr.insertCell(-1);
417 odd_canvas_td.innerHTML = "<canvas id='" + id + "' style='width: 200px; height: 200px;' onClick='ThumbnailsToDisplay2(" + thumbnail.thumbnail_number + ")'></canvas><br>" + thumbnail.thumbnail_number;
418 thumbnail.canvas = document.getElementById(id);
419 thumbnail.context = thumbnail.canvas.getContext('2d');
420 displayImage(thumbnail);
422 }else if(thumbnail.thumbnail_number % 2 == 0){
423 var tr = tbody.rows[thumbnail.thumbnail_number / 2 - 1];
424 var even_canvas_td = tr.insertCell(-1);
426 even_canvas_td.innerHTML = "<canvas id='" + id + "' style='width: 200px; height: 200px;' onClick='ThumbnailsToDisplay2(" + thumbnail.thumbnail_number + ")'></canvas><br>" + thumbnail.thumbnail_number;
427 thumbnail.canvas = document.getElementById(id);
428 thumbnail.context = thumbnail.canvas.getContext('2d');
429 displayImage(thumbnail);
433 //ThumbnailからクリックでDisplay2に反映
434 function ThumbnailsToDisplay2(number){
435 display2.file = thumbnails[number-1].file;
436 display2.magnification = thumbnails[number-1].magnification;
437 display2.angle = thumbnails[number-1].angle;
438 display2.movx = thumbnails[number-1].movx;
439 display2.movy = thumbnails[number-1].movy;
440 display2.thumbnail_number = number;
441 form2.magnification.value = thumbnails[number-1].magnification;
442 form2.angle.value = thumbnails[number-1].angle;
443 form2.movex.value = thumbnails[number-1].movx;
444 form2.movey.value = thumbnails[number-1].movy;
445 displayImage(display2);
449 //Display2で表示時に変更したパラメータをデータ保持配列に格納
450 function Display2ToThumbnails(number){
451 thumbnails[number-1].file = display2.file;
452 thumbnails[number-1].magnification = display2.magnification;
453 thumbnails[number-1].angle = display2.angle;
454 thumbnails[number-1].movx = display2.movx;
455 thumbnails[number-1].movy = display2.movy;
458 //Blend Elementsの表示の削除とblend()の呼び出し
459 function blend_switch(what){
460 if(what == 'thumbnails'){
462 var blend_elements_area = document.getElementById("blend_elements");
463 blend_elements_area.innerHTML = "";
465 if(thumbnails.length == 0){
466 window.alert("Please upload image to Imagelist.");
470 blend(blend_elements,display3,1)
474 var blend_elements = [];//BlendElementsのデータ保持
477 function make_blend_elements(){//他関数内でcanvasのdata配列を取得する時canvasに完全に描画済みでないといけないので関数として分けることで冗長性を出し実現させている。
478 var blend_elements_area = document.getElementById("blend_elements");
479 blend_elements = [];//初期化
481 for(var i=0; i<=thumbnails.length; i++){
482 var id = "blend_elements" + i;
483 var text = "<canvas id='" + id + "'></canvas>";
485 blend_elements_area.insertAdjacentHTML('beforeend',text);
486 blend_elements[i] = new Display();
487 if(i==0){//dispolay1の写し
488 blend_elements[i].file = display1.file;
489 blend_elements[i].magnification = display1.magnification;
490 blend_elements[i].movx = display1.movx;
491 blend_elements[i].movy = display1.movy;
492 blend_elements[i].angle = display1.angle;
493 }else{//thumbnailの拡大写し
494 blend_elements[i].file = thumbnails[i-1].file;
495 blend_elements[i].magnification = thumbnails[i-1].magnification;
496 blend_elements[i].movx = thumbnails[i-1].movx;
497 blend_elements[i].movy = thumbnails[i-1].movy;
498 blend_elements[i].angle = thumbnails[i-1].angle;
500 blend_elements[i].canvas = document.getElementById(id);
501 blend_elements[i].context = blend_elements[i].canvas.getContext('2d');
502 blend_elements[i].canvas.width = CANVAS_SIZE;
503 blend_elements[i].canvas.height = CANVAS_SIZE;
504 displayImage(blend_elements[i]);
505 //console.log(blend_elements[i]);
510 function blend(blend_resorce, display, color_change_flag){//配列(ブレンド元),表示先,1有or0無
514 for(var i=0; i<blend_resorce.length; i++){
515 //image[i] = blend_resorce[i].context.getImageData(0,0,display.canvas.width,display.canvas.height);
516 image[i] = blend_resorce[i].context.getImageData(0,0,blend_resorce[i].canvas.width,blend_resorce[i].canvas.height);
519 var image_blend = display.context.createImageData(display.canvas.width,display.canvas.height);
522 var image_rgbas = [];
524 for(var i=0; i<blend_resorce.length; i++){
525 image_rgbas[i] = image[i].data;//2次元配列の生成
528 var image_blend_rgba = image_blend.data;//1次元配列の生成
531 if(color_change_flag){
533 for(var i=0; i<blend_resorce.length; i++){
534 image_rgbas[i] = color_change(image_rgbas[i],i);
539 image_blend_rgba = make_new_Image(image_rgbas, image_blend_rgba);//(2d,1d)
541 display.context.putImageData(image_blend, 0, 0);
543 if(color_change_flag){
545 display4.context.putImageData(image_blend, 0, 0);
549 //画像の何色を変えるか入力するフォームの生成
550 function create_color_table(){
551 var tbody = document.getElementById("color_table_tbody");
552 var tr = tbody.insertRow(-1);
553 var number_td = tr.insertCell(-1);
554 var before_color_td = tr.insertCell(-1);
555 var arrow_td = tr.insertCell(-1);
556 var after_color_td = tr.insertCell(-1);
559 tbody.innerHTML = "";
560 for( var i=0; i<thumbnails.length; i++){
562 tr = tbody.insertRow(-1);
563 number_td = tr.insertCell(-1);
564 before_color_td = tr.insertCell(-1);
565 arrow_td = tr.insertCell(-1);
566 after_color_td = tr.insertCell(-1);
568 number_td.innerHTML = thumbnails[i].thumbnail_number;
569 id_before = "before_color_" + (i+1);
570 id_after = "after_color_" + (i+1);
571 before_color_td.innerHTML = "<select id=" + id_before + "><option value='0'>select the color</option><option value='1'>Red</option><option value='2'>Yellow</option><option value='3'>Green</option><option value='4'>Cyan</option><option value='5'>Blue</option><option value='6'>Magenta</option></select>";
572 arrow_td.innerHTML = "➡︎";
573 after_color_td.innerHTML = "<select id=" + id_after + "><option value='0'>select the color</option><option value='1'>Red</option><option value='2'>Yellow</option><option value='3'>Green</option><option value='4'>Cyan</option><option value='5'>Blue</option><option value='6'>Magenta</option></select>";
577 //color tableのcolorをリセット
578 function color_reset(){
579 var before_id_d1 = "before_color_display1";
580 var after_id_d1 = "after_color_display1";
581 var before_id = "before_color_";
582 var after_id = "after_color_";
584 for(var i=0; i<=thumbnails.length; i++){
586 before_color = document.getElementById(before_id_d1);
587 after_color = document.getElementById(after_id_d1);
589 before_color = document.getElementById(before_id + i);
590 after_color = document.getElementById(after_id + i);
592 before_color.value = 0;
593 after_color.value = 0;
595 blend_switch('thumbnails');
599 function color_change(image_rgba, index){
603 var before_color,after_color;
607 var before_id = "before_color_display1";
608 var after_id = "after_color_display1";
610 var before_id = "before_color_" + index;
611 var after_id = "after_color_" + index;
614 //console.log(index);
615 before_color = document.getElementById(before_id).value;
616 after_color = document.getElementById(after_id).value;
617 diff_color = after_color - before_color;
619 console.log("before_color is..."+before_color);
620 console.log("after_color is..."+after_color);
621 console.log("diff_color is..."+diff_color);
623 /**********RGB->HSV***********/
624 for (var i = 0; i < image_rgba.length ; i++){
625 R = image_rgba[i * 4] / 255;//RGBAの値は0-255で与えられている
626 G = image_rgba[i * 4 + 1] / 255;
627 B = image_rgba[i * 4 + 2] / 255;
629 if(R == G && G == B){
631 }else if(R >= G && R >= B){
639 }else if(G >= R && G >= B){
647 }else if(B >= R && B >= G){
658 H = 60 * (G - B)/(max - min);
661 H = (60 * (B - R) / (max - min)) + 120;
664 H = (60 * (R - G) / (max - min)) + 240;
668 /*****************color change*************************/
670 if (before_color != 1 && after_color != 1){//両方赤でない
671 if(H >= (before_color-1) * 60 -30 && H < (before_color * 60 -30)){
672 H = H + 60 * diff_color;
674 }else if(before_color == 1 && after_color != 1){//前者が赤
675 if(H >= 0 && H < 30){
676 H = H + 60 * diff_color;
677 }else if(H >= 330 && H <= 360){
678 H = H - 60 * (6 - diff_color);
680 }else if(before_color != 1 && after_color == 1){//後者が赤
681 if(H >= (before_color - 1) * 60 -30 && H < (before_color - 1) * 60 ){
682 H = H + 60 * (6 + diff_color);
683 }else if(H >= (before_color - 1) * 60 && H < before_color * 60 -30){
684 H = H + 60 * diff_color;
690 /***********************HSV->RGB************************/
691 if(H >= 0 && H < 60){
693 G = (H / 60) * (max - min) + min;
695 }else if(H >= 60 && H < 120){
696 R = -((H-120) / 60) * (max - min) + min;
699 }else if(H >= 120 && H < 180){
702 B = ((H-120) / 60) * (max - min) + min;
703 }else if(H >= 180 && H < 240){
705 G = -((H-240) / 60) * (max - min) + min;
707 }else if(H >= 240 && H < 300){
708 R = ((H-240) / 60) * (max - min) + min;
711 }else if(H >= 300 && H <= 360){
714 B = (-(H-360) / 60) * (max - min) + min;
719 image_rgba[i * 4] = R * 255;
720 image_rgba[i * 4 + 1] = G * 255;
721 image_rgba[i * 4 + 2] = B * 255;
727 //getImageDataのdataで取り出される配列が持つ意味
729 image_rgba[count * 4] //R
730 image_rgba[count * 4 + 1] //G
731 image_rgba[count * 4 + 2] //B
732 image_rgba[count * 4 + 3] //A
736 function make_new_Image(image_rgbas, new_image_rgba){
737 var image_amount = 0;
738 var white_pixel_amount=0;//同座標上のピクセルでそのピクセルが白(0,0,0,0)である数
739 //new_image_rgbaは255以上になるとカンストするからこれでクッションを置く
744 //console.log(new_image_rgba.length);
745 //縮小した際に画像ではないピクセルはRGBA(0,0,0,0)だから、合成色を求める計算で母数から外している。色は足しているが各値が0なので考慮しないのと同義。
746 for(var j=0; j<new_image_rgba.length; j++){
747 new_image_rgba[j * 4] = 0;
748 new_image_rgba[j * 4 + 1] = 0;
749 new_image_rgba[j * 4 + 2] = 0;
750 new_image_rgba[j * 4 + 3] = 0;
751 for(var i=0; i<image_rgbas.length; i++){
753 new_image_rgba[j * 4] += image_rgbas[i][j * 4];
754 new_image_rgba[j * 4 + 1] += image_rgbas[i][j * 4 + 1];
755 new_image_rgba[j * 4 + 2] += image_rgbas[i][j * 4 + 2];
756 new_image_rgba[j * 4 + 3] += image_rgbas[i][j * 4 + 3];
758 new_image_r += image_rgbas[i][j * 4];
759 new_image_g += image_rgbas[i][j * 4 + 1];
760 new_image_b += image_rgbas[i][j * 4 + 2];
761 new_image_a += image_rgbas[i][j * 4 + 3];
763 if(image_rgbas[i][j*4]==0 && image_rgbas[i][j*4+1]==0 && image_rgbas[i][j*4+2]==0 && image_rgbas[i][j*4+3]==0 ){
764 white_pixel_amount++;
767 image_amount = image_rgbas.length-white_pixel_amount;
768 if(image_amount==0){//両方のキャンバスで白のピクセルは分子0分母0になるから分母1にする
772 new_image_rgba[j * 4] = new_image_r / image_amount;
773 new_image_rgba[j * 4 + 1] = new_image_g / image_amount;
774 new_image_rgba[j * 4 + 2] = new_image_b / image_amount;
775 new_image_rgba[j * 4 + 3] = new_image_a / image_amount;
782 white_pixel_amount = 0;
785 console.log(new_image_rgba.length);
786 for(var i=0; i<image_rgbas.length; i++){
787 console.log(image_rgbas[i]);
789 console.log(new_image_rgba);
791 return new_image_rgba;
795 function preview_on(){
796 //console.log("On!");
797 var preview_canvas_area = document.getElementById("preview_canvas_area");
798 var preview_canvas_update_button = document.getElementById("preview_canvas_update_button");
799 preview_canvas_update_button.innerHTML = "<input type='button' value='update' onclick='preview_update()'>";
800 preview_canvas_area.innerHTML = "<canvas id='preview_canvas'></canvas>";
801 var display_preview = new Display();
802 display_preview.canvas = document.getElementById("preview_canvas");
803 display_preview.context = preview_canvas.getContext('2d');
804 display_preview.canvas.width = CANVAS_SIZE;
805 display_preview.canvas.height = CANVAS_SIZE;
806 var blend_resorce = [display1, display2];
807 //console.log(display1);
808 blend(blend_resorce, display_preview, 0);
811 //preview displayの非表示
812 function preview_off(){
813 //console.log("Off...");
814 var preview_canvas_area = document.getElementById("preview_canvas_area");
815 var preview_canvas_update_button = document.getElementById("preview_canvas_update_button");
816 preview_canvas_update_button.innerHTML = "";
817 preview_canvas_area.innerHTML = "";
821 function preview_update(){
827 function config_upload(files, index){
832 var reader = new FileReader();
833 reader.readAsText(files[0]);
834 reader.onload = function(event){
836 csv_text = reader.result;
838 arr = csv_text.split(',');
840 for(var i=0; i<arr.length; i++){
841 arr[i] = parseFloat(arr[i].replace('"',''));
844 thumbnails[index-1].config_x = arr[0];
845 thumbnails[index-1].config_y = arr[1];
846 thumbnails[index-1].config_z = arr[2];
847 thumbnails[index-1].config_alfa = arr[3];
848 thumbnails[index-1].config_beta = arr[4];
849 thumbnails[index-1].config_offsetX = arr[5];
850 thumbnails[index-1].config_offsetY = arr[6];
851 thumbnails[index-1].config_angle = arr[7];
853 //console.log(thumbnails);
854 //show_config(index);
858 function show_config(index){
859 var x = document.getElementById("configx");
860 var y = document.getElementById("configy");
861 var z = document.getElementById("configz");
862 var alfa = document.getElementById("configalfa");
863 var beta = document.getElementById("configbeta");
864 var offsetX = document.getElementById("configoffsetx");
865 var offsetY = document.getElementById("configoffsety");
866 var angle = document.getElementById("configangle");
868 x.innerHTML = thumbnails[index-1].config_x;
869 y.innerHTML = thumbnails[index-1].config_y;
870 z.innerHTML = thumbnails[index-1].config_z;
871 alfa.innerHTML = thumbnails[index-1].config_alfa;
872 beta.innerHTML = thumbnails[index-1].config_beta;
873 offsetX.innerHTML = thumbnails[index-1].config_offsetX;
874 offsetY.innerHTML = thumbnails[index-1].config_offsetY;
875 angle.innerHTML = thumbnails[index-1].config_angle;
879 function Coordinate(_number, _x, _y, _z){
880 this.number = _number;
883 this.z = _z;//将来的に3次元での解析を見越してZ座標をメンバーとして加えている
886 //マウスカーソルのキャンバス内の座標計算
887 function calculate_xy(event){
889 var mouseX = 0; //coordinate x of mouse point
890 var mouseY = 0; //coordinate y of mouse point
891 var positionX = 0; //coordinate x of canvas
892 var positionY = 0; //coordinate y of canvas
893 var x = 0; //coordinate x of mouse point in canvas
894 var y = 0; //coordinate y of mouse point in canvas
896 var order1 = parseInt(d4_unit.order.value); //mm or μm or nm or A(angstrom)//計算用
897 var order2 = parseInt(list_form.order2.value); //mm or um or nm or A //表用
899 var pixel_length = d4_unit.pixel_length.value; //画像のピクセルの大きさ(サーバー側から受け取り可能)
901 mouseX = event.pageX;
902 mouseY = event.pageY;
904 clientRect = document.getElementById("canvas4").getBoundingClientRect();
905 positionX = clientRect.left + window.pageXOffset;
906 positionY = clientRect.top + window.pageYOffset;
908 //画像中心を原点としてピクセル座標計算(平行移動対応)
909 if(CANVAS_SIZE%2){//奇数
910 x = mouseX - positionX - (display4.canvas.width / 2) - display4.movx;
911 y = -(mouseY - positionY - (display4.canvas.height / 2)) - display4.movy;
912 }else{//偶数(偶数の場合は原点は右上を採用)
913 x = mouseX - positionX - (display4.canvas.width / 2) - display4.movx;
914 y = -(mouseY - positionY - ((display4.canvas.height / 2) - 1)) - display4.movy;
917 //小数点切り捨て(ピクセル座標を0-CANVASSIZEを整数値で表す、上のメソッド返ってくるピクセル座標が少数点あり)
922 x *= IMAGE_SIZE / CANVAS_SIZE;
923 y *= IMAGE_SIZE / CANVAS_SIZE;
925 //px -> mm,mim,nm ...ピクセルの寸法と元画像の大きさから算出
926 x *= pixel_length * Math.pow(10,-order1-(-order2)) / display4.magnification;
927 y *= pixel_length * Math.pow(10,-order1-(-order2)) / display4.magnification;
929 var coordinate = new Coordinate();
930 coordinate.x = parseFloat(x.toFixed(2));
931 coordinate.y = parseFloat(y.toFixed(2));
937 //現在のマウスカーソル座標の表示 マウスが動くと発火イベント
938 document.getElementById("canvas4").addEventListener("mousemove", function(event){
939 var current_coordinate = document.getElementById("current_coordinate");
940 var coordinate = new Coordinate();
941 coordinate = calculate_xy(event);
945 current_coordinate.innerHTML = "x: " + coordinate.x + " y:" + coordinate.y + " z:" + coordinate.z;
949 //クリックしたマウスカーソル座標を取得 クリックすると発火イベント
950 document.getElementById("canvas4").addEventListener("click", function(event){
951 if(0){//display4に合成画像が表示されているかどうか
952 window.alert("Please load image file.");
956 var current_coordinate = document.getElementById("click_coordinate");
957 var coordinate = new Coordinate();
958 coordinate = calculate_xy(event);
959 add_list(coordinate);
963 var coordinate_database = []; //座標のオブジェクトを格納する配列
965 //クリックした座標データを表に反映、データ保持配列に格納
966 function add_list(coordinate){
968 var tbody = document.getElementById("coordinate_table_tbody");
969 var new_tr = tbody.insertRow(-1);
970 var row_Index = new_tr.rowIndex; //row's index (start = 1) equal to table numbering
972 var number_td = new_tr.insertCell(-1);
973 var x_td = new_tr.insertCell(-1);
974 var y_td = new_tr.insertCell(-1);
975 var z_td = new_tr.insertCell(-1);
976 var button_td = new_tr.insertCell(-1);
978 coordinate.number = row_Index;
981 number_td.innerHTML = coordinate.number;
982 x_td.innerHTML = coordinate.x;
983 y_td.innerHTML = coordinate.y;
984 z_td.innerHTML = coordinate.z;
985 button_td.innerHTML = '<input type="button" value="delete" onClick="dele_list(this.parentNode.parentNode.rowIndex)">'//this.parentNode.parentNode.rowIndex -> Row number in list
987 //新しい座標データが来た時、coordinate_databaseに格納
988 if(coordinate_database.length == row_Index - 1){
989 coordinate_database[row_Index - 1] = new Coordinate(coordinate.number,coordinate.x,coordinate.y,coordinate.z);
992 for(var j = 0; j < coordinate_database.length; j++){
993 console.log(coordinate_database[j]);
998 //クリックした座標行を削除、データ保持配列からの削除
999 function dele_list(row_number){
1000 var tbody = document.getElementById("coordinate_table_tbody");
1001 var rows_length = tbody.rows.length;
1002 for(var i=row_number; i <= rows_length; i++){
1003 tbody.deleteRow(row_number-1);//deleteRow(0) -> delete table's 1st row.
1006 coordinate_database.splice(row_number-1,1);//delete 1 data[row_number-1] from coordinate_database
1008 //ボタンを押した階層より後の同レベル階層を削除(Table)
1009 //配列データ(coordinate database)は座標データを残しaddlistに送ってnumberを書き換えtableに反映
1010 for(j = row_number - 1; j < coordinate_database.length; j++){
1011 add_list(coordinate_database[j])
1016 function all_clear(){
1017 var tbody = document.getElementById("coordinate_table_tbody");
1018 var rows_length = tbody.rows.length;
1020 for(var i=1; i <= rows_length; i++){
1021 tbody.deleteRow(-1);
1022 coordinate_database.pop(); //最下層まで消す
1024 //console.log(coordinate_database);
1027 //座標データをファイルに書き出しローカルに保存
1028 function download(){
1036 for(var i=0; i<coordinate_database.length; i++){
1038 number = coordinate_database[i].number;
1039 x = coordinate_database[i].x;
1040 y = coordinate_database[i].y;
1041 z = coordinate_database[i].z;
1043 text += '"' + number + '","' + x + '","' + y + '","' + z + '"\n';
1046 var blob = new Blob([text], {type: 'text/plain'});
1047 var link = document.getElementById('download_link');
1048 var filename = download_form.filename.value;
1050 if(!filename){//ファイル名指定なし
1051 window.alert("Please write filename");
1055 //ボタン付近に設置したaタグにblobデータのリンクを貼り、クリックさせることで保存させる。
1056 link.href = window.URL.createObjectURL(blob);
1057 link.download = filename;
1061 //座標データが格納されたファイルを読み込んで画面のCoordinate listに反映
1062 function upload(files){
1069 var coordinate = new Coordinate;
1071 var reader = new FileReader();
1072 reader.readAsText(files[0]);
1073 reader.onload = function(event){
1075 csv_text = reader.result;
1076 array_csv = csv_text.split('\n');
1078 //2次元配列にしてオブジェクトに変更後、addlistへ渡す。
1079 for(var i=0; i<array_csv.length; i++){
1080 if(array_csv[i] == ''){
1083 arr[i] = array_csv[i].split(',');
1085 for(var j=0; j<arr[i].length; j++){
1086 arr[i][j] = parseFloat(arr[i][j].replace('"',''));
1088 coordinate.number = arr[i][0];
1089 coordinate.x = arr[i][1];
1090 coordinate.y = arr[i][2];
1091 coordinate.z = arr[i][3];
1093 add_list(coordinate);