FC 3D Image Tool beta

Fotocommunity Image Tool for 3D Images beta

  1. // ==UserScript==
  2. // @name FC 3D Image Tool beta
  3. // @namespace http://userscripts.org/users/75950
  4. // @description Fotocommunity Image Tool for 3D Images beta
  5. // @include http://www.fotocommunity.de/*/display/*
  6. // @version 0.0.1.20140527152834
  7. // ==/UserScript==
  8.  
  9. window.addEventListener('load', startUp, false);
  10.  
  11. var ctx = null;
  12. var theImage = null;
  13. var flipped = false;
  14. var theCenter = 0;
  15. var linesshown = false;
  16. var isredcyan = false;
  17. var isinterlaced = false;
  18. var ismonochrom = false;
  19. var sfIsOriginal = 'original';
  20. var sfOffset = 0;
  21. var preselect = '';
  22.  
  23. function detectPage() {
  24. if(preselect != '') return preselect;
  25. if(location.href.indexOf('/5584/') != -1) return 'kreuz';
  26. if(location.href.indexOf('/5585/') != -1) return 'parallel';
  27. if(location.href.indexOf('/2616/') != -1) return 'anaglyph';
  28. return 'sonstige';
  29. }
  30.  
  31. function startUp() {
  32. switch(detectPage()) {
  33. case 'kreuz':
  34. case 'parallel':
  35. case 'anaglyph': createCanvas();
  36. break;
  37. case 'sonstige': createLinks();
  38. break;
  39. default: break;
  40. }
  41. }
  42.  
  43. function createLinks() {
  44. var newSpan = document.createElement('span');
  45. newSpan.style.paddingRight = '5px';
  46. newSpan.id = 'fc_links_label';
  47. var theText = document.createTextNode('Bei diesem Foto handelt es sich um ein: ');
  48. newSpan.appendChild(theText);
  49. document.getElementById('display_foto').insertBefore(newSpan, document.getElementById('fc_image'));
  50.  
  51. newSpan = document.createElement('span');
  52. newSpan.style.paddingRight = '5px';
  53. newSpan.id = 'fc_links_kreuz';
  54. var newAnchor = document.createElement('a');
  55. newAnchor.href = '#';
  56. theText = document.createTextNode('Kreuzblickstereo');
  57. newAnchor.appendChild(theText);
  58. newSpan.appendChild(newAnchor);
  59. document.getElementById('display_foto').insertBefore(newSpan, document.getElementById('fc_image'));
  60. document.getElementById('fc_links_kreuz').addEventListener('click', function() {
  61. preselect = 'kreuz';
  62. removeLinks();
  63. createCanvas();
  64. return false;
  65. }, false);
  66. newSpan = document.createElement('span');
  67. newSpan.style.paddingRight = '5px';
  68. newSpan.id = 'fc_links_sep1';
  69. theText = document.createTextNode('/');
  70. newSpan.appendChild(theText);
  71. document.getElementById('display_foto').insertBefore(newSpan, document.getElementById('fc_image'));
  72.  
  73. newSpan = document.createElement('span');
  74. newSpan.style.paddingRight = '5px';
  75. newSpan.id = 'fc_links_parallel';
  76. newAnchor = document.createElement('a');
  77. newAnchor.href = '#';
  78. theText = document.createTextNode('Parallelblickstereo');
  79. newAnchor.appendChild(theText);
  80. newSpan.appendChild(newAnchor);
  81. document.getElementById('display_foto').insertBefore(newSpan, document.getElementById('fc_image'));
  82. document.getElementById('fc_links_parallel').addEventListener('click', function() {
  83. preselect = 'parallel';
  84. removeLinks();
  85. createCanvas();
  86. return false;
  87. }, false);
  88. newSpan = document.createElement('span');
  89. newSpan.style.paddingRight = '5px';
  90. newSpan.id = 'fc_links_sep2';
  91. theText = document.createTextNode('/');
  92. newSpan.appendChild(theText);
  93. document.getElementById('display_foto').insertBefore(newSpan, document.getElementById('fc_image'));
  94.  
  95. newSpan = document.createElement('span');
  96. newSpan.style.paddingRight = '5px';
  97. newSpan.id = 'fc_links_anaglyph';
  98. newAnchor = document.createElement('a');
  99. newAnchor.href = '#';
  100. theText = document.createTextNode('Anaglyphenstereo');
  101. newAnchor.appendChild(theText);
  102. newSpan.appendChild(newAnchor);
  103. document.getElementById('display_foto').insertBefore(newSpan, document.getElementById('fc_image'));
  104. document.getElementById('fc_links_anaglyph').addEventListener('click', function() {
  105. preselect = 'anaglyph';
  106. removeLinks();
  107. createCanvas();
  108. return false;
  109. }, false);
  110. }
  111.  
  112. function removeLinks() {
  113. document.getElementById('fc_links_label').parentNode.removeChild(document.getElementById('fc_links_label'));
  114. document.getElementById('fc_links_kreuz').parentNode.removeChild(document.getElementById('fc_links_kreuz'));
  115. document.getElementById('fc_links_sep1').parentNode.removeChild(document.getElementById('fc_links_sep1'));
  116. document.getElementById('fc_links_parallel').parentNode.removeChild(document.getElementById('fc_links_parallel'));
  117. document.getElementById('fc_links_sep2').parentNode.removeChild(document.getElementById('fc_links_sep2'));
  118. document.getElementById('fc_links_anaglyph').parentNode.removeChild(document.getElementById('fc_links_anaglyph'));
  119. }
  120.  
  121. function createCanvas() {
  122. theImagesrc = document.getElementById('fc_image').src;
  123. GM_xmlhttpRequest({
  124. method: 'GET',
  125. url: theImagesrc,
  126. overrideMimeType: 'text/plain; charset=x-user-defined',
  127. onload: function ( xhr ) {
  128. var data = '';
  129. theImage = new Image();
  130.  
  131. for ( var i = 0; i < xhr.responseText.length; i++ ) data += String.fromCharCode( ( xhr.responseText[ i ].charCodeAt(0) & 0xff ) );
  132. // Convert raw data to base64.
  133. data = btoa( data );
  134. // Write Base64 data to a image
  135. theImage.src = 'data:image/jpg;base64,' + data; // This will change depending on image type
  136.  
  137. // Listener fires when image is ready
  138. theImage.addEventListener( 'load', function() {
  139. GM_addStyle('canvas {position: relative; text-align:center; left: '+window.getComputedStyle(document.getElementById('fc_image'),false).left+';} #showwait {position: fixed; top: 200px; left: 490px; padding: 3px; width: 100px; border: 1px solid black; z-index: 10000; color: black; background-color: white;}');
  140. var newCanvas = unsafeWindow.document.createElement('canvas');
  141. newCanvas.id = 'fc_image_canvas';
  142. newCanvas.width = document.getElementById('fc_image').width;
  143. newCanvas.height = document.getElementById('fc_image').height;
  144. if(detectPage() == 'anaglyph') newCanvas.style.display = 'none';
  145. unsafeWindow.document.getElementById('display_foto').insertBefore(newCanvas, unsafeWindow.document.getElementById('fc_image'));
  146. var canvas = unsafeWindow.document.getElementById('fc_image_canvas');
  147. ctx = canvas.getContext('2d');
  148. ctx.drawImage(theImage, 0, 0 );
  149. theCenter = Math.floor(theImage.width / 2);
  150. }, false );
  151.  
  152. }
  153. });
  154.  
  155. if(detectPage() != 'anaglyph') {
  156. document.getElementById('fc_image').style.display = 'none';
  157. var theButton = document.createElement('input');
  158. theButton.id = 'fc_image_flip';
  159. theButton.type = 'button';
  160. if(detectPage() == 'kreuz') {
  161. theButton.value = '-> Parallelblick';
  162. } else {
  163. theButton.value = '-> Kreuzblick';
  164. }
  165. document.getElementById('display_foto').insertBefore(theButton, document.getElementById('fc_image'));
  166. document.getElementById('fc_image_flip').addEventListener('click', flipImage, false);
  167.  
  168. theButton = document.createElement('input');
  169. theButton.id = 'fc_image_showline';
  170. theButton.type = 'button';
  171. theButton.value = 'Hilfslinien';
  172. document.getElementById('display_foto').insertBefore(theButton, document.getElementById('fc_image'));
  173. document.getElementById('fc_image_showline').addEventListener('click', showLine, false);
  174.  
  175. theButton = document.createElement('input');
  176. theButton.id = 'fc_image_redcyan';
  177. theButton.type = 'button';
  178. theButton.style.marginLeft = '10px';
  179. theButton.value = 'Red/Cyan';
  180. document.getElementById('display_foto').insertBefore(theButton, document.getElementById('fc_image'));
  181. document.getElementById('fc_image_redcyan').addEventListener('click', showWait, false);
  182. var theCheckbox = document.createElement('input');
  183. theCheckbox.id = 'fc_image_halftone';
  184. theCheckbox.type = 'checkbox';
  185. theCheckbox.checked = false;
  186. document.getElementById('display_foto').insertBefore(theCheckbox, document.getElementById('fc_image'));
  187. document.getElementById('fc_image_halftone').addEventListener('click', toggleHalftone, false);
  188.  
  189. var theSpan = document.createElement('span');
  190. theSpan.id = 'fc_image_halftonelabel';
  191. var theText = document.createTextNode('Halbton');
  192. theSpan.appendChild(theText);
  193. document.getElementById('display_foto').insertBefore(theSpan, document.getElementById('fc_image'));
  194.  
  195. theButton = document.createElement('input');
  196. theButton.id = 'fc_image_interlaced';
  197. theButton.type = 'button';
  198. theButton.style.marginLeft = '10px';
  199. theButton.value = 'Zalman Interlaced';
  200. document.getElementById('display_foto').insertBefore(theButton, document.getElementById('fc_image'));
  201. document.getElementById('fc_image_interlaced').addEventListener('click', showWaitInterlaced, false);
  202. theCheckbox = document.createElement('input');
  203. theCheckbox.id = 'fc_image_interlaceswitch';
  204. theCheckbox.type = 'checkbox';
  205. theCheckbox.checked = false;
  206. document.getElementById('display_foto').insertBefore(theCheckbox, document.getElementById('fc_image'));
  207. document.getElementById('fc_image_interlaceswitch').addEventListener('click', toggleInterlace, false);
  208.  
  209. theSpan = document.createElement('span');
  210. theSpan.id = 'fc_image_iswitchlabel';
  211. theText = document.createTextNode('gerade/ungerade tauschen');
  212. theSpan.appendChild(theText);
  213. document.getElementById('display_foto').insertBefore(theSpan, document.getElementById('fc_image'));
  214.  
  215. var newDiv = document.createElement('div');
  216. newDiv.id = 'showwait';
  217. var theText = document.createTextNode('Bitte warten...');
  218. newDiv.appendChild(theText);
  219. document.getElementById('display_foto').appendChild(newDiv);
  220. document.getElementById('showwait').style.display = 'none';
  221. } else {
  222. var theSpan = document.createElement('span');
  223. theSpan.id = 'fc_image_sfOffsetLabel';
  224. theSpan.style.paddingRight = '5px';
  225. var theText = document.createTextNode('Horiz. Verschiebung: ');
  226. theSpan.appendChild(theText);
  227. document.getElementById('display_foto').insertBefore(theSpan, document.getElementById('fc_image'));
  228. theSpan = document.createElement('span');
  229. theSpan.id = 'fc_image_sfOffset';
  230. theSpan.style.paddingRight = '5px';
  231. theText = document.createTextNode(sfOffset.toString());
  232. theSpan.appendChild(theText);
  233. document.getElementById('display_foto').insertBefore(theSpan, document.getElementById('fc_image'));
  234. var theButton = document.createElement('input');
  235. theButton.id = 'fc_image_monokreuz';
  236. theButton.type = 'button';
  237. theButton.value = 'Monochrom Kreuzblick';
  238. document.getElementById('display_foto').insertBefore(theButton, document.getElementById('fc_image'));
  239. document.getElementById('fc_image_monokreuz').addEventListener('click', showWaitMono, false);
  240.  
  241. theButton = document.createElement('input');
  242. theButton.id = 'fc_image_scheinfenster';
  243. theButton.type = 'button';
  244. theButton.value = 'Scheinfenster';
  245. document.getElementById('display_foto').insertBefore(theButton, document.getElementById('fc_image'));
  246. document.getElementById('fc_image_scheinfenster').addEventListener('click', scheinFenster, false);
  247.  
  248. var newDiv = document.createElement('div');
  249. newDiv.id = 'showwait';
  250. var theText = document.createTextNode('Bitte warten...');
  251. newDiv.appendChild(theText);
  252. document.getElementById('display_foto').appendChild(newDiv);
  253. document.getElementById('showwait').style.display = 'none';
  254. }
  255. }
  256.  
  257. function scheinFenster() {
  258. if(!ctx) return;
  259. if(sfIsOriginal=='original') {
  260. document.getElementById('fc_image').style.display = 'none';
  261. document.getElementById('fc_image_monokreuz').style.display = 'none';
  262. document.getElementById('fc_image_canvas').style.display = '';
  263. var theButton = document.createElement('input');
  264. theButton.id = 'fc_image_ziehen';
  265. theButton.type = 'button';
  266. theButton.value = 'Scheinfenster ziehen';
  267. document.getElementById('display_foto').insertBefore(theButton, document.getElementById('fc_image_canvas'));
  268. document.getElementById('fc_image_ziehen').addEventListener('click', sfZiehen, false);
  269.  
  270. theButton = document.createElement('input');
  271. theButton.id = 'fc_image_druecken';
  272. theButton.type = 'button';
  273. theButton.value = 'Scheinfenster druecken';
  274. document.getElementById('display_foto').insertBefore(theButton, document.getElementById('fc_image_canvas'));
  275. document.getElementById('fc_image_druecken').addEventListener('click', sfDruecken, false);
  276. theButton = document.createElement('input');
  277. theButton.id = 'fc_image_reset';
  278. theButton.type = 'button';
  279. theButton.value = 'Reset';
  280. document.getElementById('display_foto').insertBefore(theButton, document.getElementById('fc_image_canvas'));
  281. document.getElementById('fc_image_reset').addEventListener('click', sfReset, false);
  282.  
  283. sfDrawLines();
  284. document.getElementById('fc_image_scheinfenster').value = 'Anwenden';
  285. sfIsOriginal = 'verschoben';
  286. } else {
  287. if(sfIsOriginal == 'verschoben') {
  288. ctx.drawImage(theImage, 0, 0);
  289. document.getElementById('showwait').style.display = '';
  290. window.setTimeout(redrawAnaglyph, 300);
  291. } else {
  292. // neuanaglyph (Button Original gedrueckt)
  293. document.getElementById('fc_image_scheinfenster').value = 'Scheinfenster';
  294. document.getElementById('fc_image').style.display = '';
  295. document.getElementById('fc_image_monokreuz').style.display = '';
  296. document.getElementById('fc_image_canvas').style.display = 'none';
  297. document.getElementById('fc_image_canvas2').parentNode.removeChild(document.getElementById('fc_image_canvas2'));
  298. sfIsOriginal = 'original';
  299. }
  300. }
  301. }
  302.  
  303. function redrawAnaglyph() {
  304. // Scheinfensterverschiebung anwenden
  305. if(sfOffset!=0) {
  306. var newCanvas = unsafeWindow.document.createElement('canvas');
  307. newCanvas.id = 'fc_image_canvas2';
  308. newCanvas.width = theImage.width*2;
  309. newCanvas.height = theImage.height;
  310. unsafeWindow.document.getElementById('display_foto').insertBefore(newCanvas, unsafeWindow.document.getElementById('fc_image_canvas'));
  311. var canvas = unsafeWindow.document.getElementById('fc_image_canvas2');
  312. ctx2 = canvas.getContext('2d');
  313. if(sfOffset<0) {
  314. ctx2.drawImage(unsafeWindow.document.getElementById('fc_image_canvas'), theImage.width, 0); // rechts
  315. ctx2.drawImage(unsafeWindow.document.getElementById('fc_image_canvas'), sfOffset, 0); // links
  316. var theImageData_links = ctx2.getImageData(0, 0, theImage.width+sfOffset, theImage.height);
  317. var theImageData_rechts = ctx2.getImageData(theImage.width, 0, theImage.width+sfOffset, theImage.height);
  318. } else {
  319. ctx2.drawImage(unsafeWindow.document.getElementById('fc_image_canvas'), theImage.width+sfOffset, 0); // rechts
  320. ctx2.drawImage(unsafeWindow.document.getElementById('fc_image_canvas'), sfOffset, 0); // links
  321. var theImageData_links = ctx2.getImageData(sfOffset, 0, theImage.width-2*sfOffset, theImage.height);
  322. var theImageData_rechts = ctx2.getImageData(theImage.width+2*sfOffset, 0, theImage.width-2*sfOffset, theImage.height);
  323. }
  324. var pixels_links = theImageData_links.data;
  325. var pixels_rechts = theImageData_rechts.data;
  326. for (var i = 0, n = pixels_links.length; i < n; i += 4) {
  327. pixels_links[i] = pixels_links[i]; // rot vom linken Bild, blau und gruen vom rechten
  328. pixels_links[i+1] = pixels_rechts[i+1];
  329. pixels_links[i+2] = pixels_rechts[i+2];
  330.  
  331. // Rechtes Teilbild in FC Farben
  332. pixels_rechts[i] = 34;
  333. pixels_rechts[i+1] = 34;
  334. pixels_rechts[i+2] = 34;
  335. }
  336. // Draw the ImageData at the given (x,y) coordinates.
  337. ctx2.putImageData(theImageData_links, 0, 0);
  338. ctx2.putImageData(theImageData_rechts, theImage.width, 0);
  339. delete theImageData_links;
  340. theImageData_links = null;
  341. delete theImageData_rechts;
  342. theImageData_rechts = null;
  343.  
  344. document.getElementById('showwait').style.display = 'none';
  345. sfIsOriginal = 'neuanaglyph';
  346. sfRemoveButtons();
  347. document.getElementById('fc_image_scheinfenster').value = 'Original';
  348. document.getElementById('fc_image').style.display = 'none';
  349. document.getElementById('fc_image_monokreuz').style.display = 'none';
  350. document.getElementById('fc_image_canvas').style.display = 'none';
  351. } else {
  352. document.getElementById('showwait').style.display = 'none';
  353. sfIsOriginal = 'original';
  354. sfRemoveButtons();
  355. document.getElementById('fc_image_scheinfenster').value = 'Scheinfenster';
  356. document.getElementById('fc_image').style.display = '';
  357. document.getElementById('fc_image_monokreuz').style.display = '';
  358. document.getElementById('fc_image_canvas').style.display = 'none';
  359. }
  360. }
  361.  
  362. function sfDrawLines() {
  363. if(sfOffset>=0) {
  364. // linker Rand
  365. ctx.beginPath();
  366. ctx.moveTo(sfOffset, 0);
  367. ctx.lineTo(sfOffset, theImage.height);
  368. ctx.closePath();
  369. ctx.strokeStyle = "rgba(255, 0, 0, 1)";
  370. ctx.stroke();
  371. }
  372. if(sfOffset<=0) {
  373. // rechter Rand
  374. ctx.beginPath();
  375. ctx.moveTo(theImage.width+sfOffset, 0);
  376. ctx.lineTo(theImage.width+sfOffset, theImage.height);
  377. ctx.closePath();
  378. ctx.strokeStyle = "rgba(255, 0, 0, 1)";
  379. ctx.stroke();
  380. }
  381. document.getElementById('fc_image_sfOffset').textContent = sfOffset.toString();
  382. }
  383.  
  384. function sfRemoveButtons() {
  385. document.getElementById('fc_image_scheinfenster').value = 'Scheinfenster';
  386. var theButton = document.getElementById('fc_image_ziehen');
  387. document.getElementById('display_foto').removeChild(theButton);
  388. theButton = document.getElementById('fc_image_druecken');
  389. document.getElementById('display_foto').removeChild(theButton);
  390. theButton = document.getElementById('fc_image_reset');
  391. document.getElementById('display_foto').removeChild(theButton);
  392. document.getElementById('fc_image').style.display = '';
  393. document.getElementById('fc_image_monokreuz').style.display = '';
  394. document.getElementById('fc_image_canvas').style.display = 'none';
  395. }
  396.  
  397. function sfZiehen() {
  398. sfOffset--;
  399. ctx.drawImage(theImage, 0, 0);
  400. sfDrawLines();
  401. }
  402.  
  403. function sfDruecken() {
  404. sfOffset++;
  405. ctx.drawImage(theImage, 0, 0);
  406. sfDrawLines();
  407. }
  408.  
  409. function sfReset() {
  410. sfOffset = 0;
  411. ctx.drawImage(theImage, 0, 0);
  412. sfDrawLines();
  413. }
  414.  
  415. function showWaitMono() {
  416. if(!ctx) return;
  417. document.getElementById('showwait').style.display = 'block';
  418. window.setTimeout(monoKreuz, 300);
  419. }
  420.  
  421. function monoKreuz() {
  422. if(!ismonochrom) {
  423. document.getElementById('fc_image').style.display = 'none';
  424. document.getElementById('fc_image_scheinfenster').style.display = 'none';
  425. var newCanvas = unsafeWindow.document.createElement('canvas');
  426. newCanvas.id = 'fc_image_canvas2';
  427. newCanvas.width = theImage.width+20;
  428. newCanvas.height = Math.floor(theImage.height/2)+1;
  429. unsafeWindow.document.getElementById('display_foto').insertBefore(newCanvas, unsafeWindow.document.getElementById('fc_image_canvas'));
  430. var canvas = unsafeWindow.document.getElementById('fc_image_canvas2');
  431. ctx2 = canvas.getContext('2d');
  432. ctx2.drawImage(document.getElementById('fc_image_canvas'), 0, 0, Math.floor(theImage.width/2), Math.floor(theImage.height/2) );
  433. ctx2.drawImage(document.getElementById('fc_image_canvas'), Math.floor(theImage.width/2)+20, 0, Math.floor(theImage.width/2), Math.floor(theImage.height/2));
  434. var theImageData = ctx2.getImageData(0, 0, Math.floor(theImage.width/2), Math.floor(theImage.height/2));
  435. var pixels = theImageData.data;
  436. for (var i = 0, n = pixels.length; i < n; i += 4) {
  437. var theGray = Math.floor((pixels[i+1]+pixels[i+2])/2);
  438. pixels[i] = theGray;
  439. pixels[i+1] = theGray;
  440. pixels[i+2] = theGray;
  441. }
  442. ctx2.putImageData(theImageData, 0, 0);
  443. delete theImageData;
  444. theImageData = null;
  445.  
  446. theImageData = ctx2.getImageData(Math.floor(theImage.width/2)+20, 0, Math.floor(theImage.width/2), Math.floor(theImage.height/2));
  447. pixels = theImageData.data;
  448. for (var i = 0, n = pixels.length; i < n; i += 4) {
  449. pixels[i+1] = pixels[i];
  450. pixels[i+2] = pixels[i];
  451. }
  452. ctx2.putImageData(theImageData, Math.floor(theImage.width/2)+20, 0);
  453. delete theImageData;
  454. theImageData = null;
  455. ismonochrom = true;
  456. document.getElementById('fc_image_monokreuz').value = 'Original';
  457. } else {
  458. var CanvasToDelete = document.getElementById('fc_image_canvas2');
  459. CanvasToDelete.parentNode.removeChild(CanvasToDelete);
  460. document.getElementById('fc_image').style.display = '';
  461. document.getElementById('fc_image_scheinfenster').style.display = '';
  462. ismonochrom = false;
  463. document.getElementById('fc_image_monokreuz').value = 'Monochrom Kreuzblick';
  464. }
  465. document.getElementById('showwait').style.display = 'none';
  466. }
  467.  
  468. function toggleHalftone() {
  469. isredcyan = false;
  470. }
  471.  
  472. function toggleInterlace() {
  473. isinterlaced = false;
  474. }
  475.  
  476. function flipImage() {
  477. if(!ctx) return;
  478. if(linesshown) {
  479. RemoveButtons();
  480. linesshown = false;
  481. }
  482. if(!flipped) {
  483. // Paste image two times
  484. // First image is moved half way to the left
  485. // second image is moved half way to the right
  486. ctx.drawImage(theImage, -theCenter, 0);
  487. ctx.drawImage(theImage, theCenter, 0);
  488. flipped = true;
  489. } else {
  490. ctx.drawImage(theImage, 0, 0);
  491. flipped = false;
  492. }
  493. ButtonText();
  494. isredcyan = false;
  495. isinterlaced = false;
  496. }
  497.  
  498. function ButtonText() {
  499. var theButton = document.getElementById('fc_image_flip');
  500. if(detectPage() == 'kreuz') {
  501. if(flipped) {
  502. theButton.value = '-> Kreuzblick';
  503. } else {
  504. theButton.value = '-> Parallelblick';
  505. }
  506. } else {
  507. if(flipped) {
  508. theButton.value = '-> Parallelblick';
  509. } else {
  510. theButton.value = '-> Kreuzblick';
  511. }
  512. }
  513. }
  514.  
  515. function showLine() {
  516. if(!ctx) return;
  517. ctx.drawImage(theImage, 0, 0);
  518. flipped = false;
  519. ButtonText();
  520. isredcyan = false;
  521. isinterlaced = false;
  522. if(!linesshown) {
  523. // linker Rand
  524. ctx.beginPath();
  525. ctx.moveTo(0, 0);
  526. ctx.lineTo(0, theImage.height);
  527. ctx.closePath();
  528. ctx.strokeStyle = "rgba(0, 255, 0, 0.5)";
  529. ctx.stroke();
  530. // rechter Rand
  531. ctx.beginPath();
  532. ctx.moveTo(theImage.width, 0);
  533. ctx.lineTo(theImage.width, theImage.height);
  534. ctx.closePath();
  535. ctx.strokeStyle = "rgba(0, 255, 0, 0.5)";
  536. ctx.stroke();
  537. // Mitte
  538. ctx.beginPath();
  539. ctx.moveTo(theCenter, 0);
  540. ctx.lineTo(theCenter, theImage.height);
  541. ctx.closePath();
  542. ctx.strokeStyle = "rgba(255, 0, 0, 0.5)";
  543. ctx.stroke();
  544.  
  545. var theButton = document.createElement('input');
  546. theButton.id = 'fc_image_left';
  547. theButton.type = 'button';
  548. theButton.value = '<';
  549. document.getElementById('display_foto').insertBefore(theButton, document.getElementById('fc_image_redcyan'));
  550. document.getElementById('fc_image_left').addEventListener('click', moveLineLeft, false);
  551.  
  552. theButton = document.createElement('input');
  553. theButton.id = 'fc_image_right';
  554. theButton.type = 'button';
  555. theButton.value = '>';
  556. document.getElementById('display_foto').insertBefore(theButton, document.getElementById('fc_image_redcyan'));
  557. document.getElementById('fc_image_right').addEventListener('click', moveLineRight, false);
  558. theButton = document.createElement('input');
  559. theButton.id = 'fc_image_center';
  560. theButton.type = 'button';
  561. theButton.value = 'Center';
  562. document.getElementById('display_foto').insertBefore(theButton, document.getElementById('fc_image_redcyan'));
  563. document.getElementById('fc_image_center').addEventListener('click', moveLineCenter, false);
  564.  
  565. document.getElementById('fc_image_showline').value = 'Hilfslinien ausblenden';
  566. linesshown = true;
  567. } else {
  568. RemoveButtons();
  569. linesshown = false;
  570. }
  571. }
  572.  
  573. function RemoveButtons() {
  574. document.getElementById('fc_image_showline').value = 'Hilfslinien';
  575. var theButton = document.getElementById('fc_image_left');
  576. document.getElementById('display_foto').removeChild(theButton);
  577. theButton = document.getElementById('fc_image_right');
  578. document.getElementById('display_foto').removeChild(theButton);
  579. theButton = document.getElementById('fc_image_center');
  580. document.getElementById('display_foto').removeChild(theButton);
  581. }
  582.  
  583. function moveLineLeft() {
  584. ctx.drawImage(theImage, 0, 0);
  585. theCenter--;
  586. if(theCenter<0) theCenter = 0;
  587. // linker Rand
  588. ctx.beginPath();
  589. ctx.moveTo(0, 0);
  590. ctx.lineTo(0, theImage.height);
  591. ctx.closePath();
  592. ctx.strokeStyle = "rgba(0, 255, 0, 0.5)";
  593. ctx.stroke();
  594. // rechter Rand
  595. ctx.beginPath();
  596. ctx.moveTo(theImage.width, 0);
  597. ctx.lineTo(theImage.width, theImage.height);
  598. ctx.closePath();
  599. ctx.strokeStyle = "rgba(0, 255, 0, 0.5)";
  600. ctx.stroke();
  601. // Mitte
  602. ctx.beginPath();
  603. ctx.moveTo(theCenter, 0);
  604. ctx.lineTo(theCenter, theImage.height);
  605. ctx.closePath();
  606. ctx.strokeStyle = "rgba(255, 0, 0, 0.5)";
  607. ctx.stroke();
  608. }
  609.  
  610. function moveLineRight() {
  611. ctx.drawImage(theImage, 0, 0);
  612. theCenter++;
  613. if(theCenter>(theImage.width-1)) theCenter = theImage.width-1;
  614. // linker Rand
  615. ctx.beginPath();
  616. ctx.moveTo(0, 0);
  617. ctx.lineTo(0, theImage.height);
  618. ctx.closePath();
  619. ctx.strokeStyle = "rgba(0, 255, 0, 0.5)";
  620. ctx.stroke();
  621. // rechter Rand
  622. ctx.beginPath();
  623. ctx.moveTo(theImage.width, 0);
  624. ctx.lineTo(theImage.width, theImage.height);
  625. ctx.closePath();
  626. ctx.strokeStyle = "rgba(0, 255, 0, 0.5)";
  627. ctx.stroke();
  628. // Mitte
  629. ctx.beginPath();
  630. ctx.moveTo(theCenter, 0);
  631. ctx.lineTo(theCenter, theImage.height);
  632. ctx.closePath();
  633. ctx.strokeStyle = "rgba(255, 0, 0, 0.5)";
  634. ctx.stroke();
  635. }
  636.  
  637. function moveLineCenter() {
  638. ctx.drawImage(theImage, 0, 0);
  639. theCenter = Math.floor(theImage.width / 2);
  640. // linker Rand
  641. ctx.beginPath();
  642. ctx.moveTo(0, 0);
  643. ctx.lineTo(0, theImage.height);
  644. ctx.closePath();
  645. ctx.strokeStyle = "rgba(0, 255, 0, 0.5)";
  646. ctx.stroke();
  647. // rechter Rand
  648. ctx.beginPath();
  649. ctx.moveTo(theImage.width, 0);
  650. ctx.lineTo(theImage.width, theImage.height);
  651. ctx.closePath();
  652. ctx.strokeStyle = "rgba(0, 255, 0, 0.5)";
  653. ctx.stroke();
  654. // Mitte
  655. ctx.beginPath();
  656. ctx.moveTo(theCenter, 0);
  657. ctx.lineTo(theCenter, theImage.height);
  658. ctx.closePath();
  659. ctx.strokeStyle = "rgba(255, 0, 0, 0.5)";
  660. ctx.stroke();
  661. }
  662.  
  663. function showWait() {
  664. if(!ctx) return;
  665. if(isredcyan) return;
  666. document.getElementById('showwait').style.display = 'block';
  667. var isHalftone = document.getElementById('fc_image_halftone').checked;
  668. if(!isHalftone) {
  669. window.setTimeout(makeAnaglyph, 300);
  670. } else {
  671. window.setTimeout(HalftoneAnaglyph, 300);
  672. }
  673. }
  674.  
  675. function makeAnaglyph() {
  676. ctx.drawImage(theImage, 0, 0);
  677. flipped = false;
  678. ButtonText();
  679. isredcyan = true;
  680. isinterlaced = false;
  681. if(linesshown) {
  682. RemoveButtons();
  683. linesshown = false;
  684. }
  685. var centerDiff = theCenter - Math.floor(theImage.width / 2);
  686. if(detectPage() == 'kreuz') {
  687. // Kreuzblick
  688. // links muss rot weg, rechts muss gruen/blau weg
  689. if(centerDiff<=0) {
  690. var theImageData_links = ctx.getImageData(0, 0, theCenter, theImage.height);
  691. var theImageData_rechts = ctx.getImageData(theCenter, 0, theCenter, theImage.height);
  692. } else {
  693. var theImageData_links = ctx.getImageData(0, 0, theCenter-(centerDiff*2), theImage.height);
  694. var theImageData_rechts = ctx.getImageData(theCenter, 0, theCenter-(centerDiff*2), theImage.height);
  695. }
  696. var pixels_links = theImageData_links.data;
  697. var pixels_rechts = theImageData_rechts.data;
  698. for (var i = 0, n = pixels_links.length; i < n; i += 4) {
  699. pixels_links[i] = pixels_rechts[i]; // rot vom rechten Bild blau und gruen vom linken
  700.  
  701. // Rechtes Teilbild in FC Farben
  702. pixels_rechts[i] = 34;
  703. pixels_rechts[i+1] = 34;
  704. pixels_rechts[i+2] = 34;
  705. }
  706. // Draw the ImageData at the given (x,y) coordinates.
  707. ctx.putImageData(theImageData_links, 0, 0);
  708. ctx.putImageData(theImageData_rechts, theCenter, 0);
  709. delete theImageData_links;
  710. theImageData_links = null;
  711. delete theImageData_rechts;
  712. theImageData_rechts = null;
  713. } else {
  714. // Parallelblick
  715. // links muss gruen/blau weg, rechts muss rot weg
  716. if(centerDiff<=0) {
  717. var theImageData_links = ctx.getImageData(0, 0, theCenter, theImage.height);
  718. var theImageData_rechts = ctx.getImageData(theCenter, 0, theCenter, theImage.height);
  719. } else {
  720. var theImageData_links = ctx.getImageData(0, 0, theCenter-(centerDiff*2), theImage.height);
  721. var theImageData_rechts = ctx.getImageData(theCenter, 0, theCenter-(centerDiff*2), theImage.height);
  722. }
  723. var pixels_links = theImageData_links.data;
  724. var pixels_rechts = theImageData_rechts.data;
  725. for (var i = 0, n = pixels_links.length; i < n; i += 4) {
  726. pixels_links[i] = pixels_links[i]; // rot vom linken Bild, blau und gruen vom rechten
  727. pixels_links[i+1] = pixels_rechts[i+1];
  728. pixels_links[i+2] = pixels_rechts[i+2];
  729.  
  730. // Rechtes Teilbild in FC Farben
  731. pixels_rechts[i] = 34;
  732. pixels_rechts[i+1] = 34;
  733. pixels_rechts[i+2] = 34;
  734. }
  735. // Draw the ImageData at the given (x,y) coordinates.
  736. ctx.putImageData(theImageData_links, 0, 0);
  737. ctx.putImageData(theImageData_rechts, theCenter, 0);
  738. delete theImageData_links;
  739. theImageData_links = null;
  740. delete theImageData_rechts;
  741. theImageData_rechts = null;
  742. }
  743. document.getElementById('showwait').style.display = 'none';
  744. }
  745.  
  746. function HalftoneAnaglyph() {
  747. // A halftone algorithm from http://3dtv.at/Knowhow/AnaglyphComparison_en.aspx
  748. ctx.drawImage(theImage, 0, 0);
  749. flipped = false;
  750. ButtonText();
  751. isredcyan = true;
  752. isinterlaced = false;
  753. if(linesshown) {
  754. RemoveButtons();
  755. linesshown = false;
  756. }
  757. var centerDiff = theCenter - Math.floor(theImage.width / 2);
  758. if(detectPage() == 'kreuz') {
  759. // Kreuzblick
  760. // links muss rot weg, rechts muss gruen/blau weg
  761. if(centerDiff<=0) {
  762. var theImageData_links = ctx.getImageData(0, 0, theCenter, theImage.height);
  763. var theImageData_rechts = ctx.getImageData(theCenter, 0, theCenter, theImage.height);
  764. } else {
  765. var theImageData_links = ctx.getImageData(0, 0, theCenter-(centerDiff*2), theImage.height);
  766. var theImageData_rechts = ctx.getImageData(theCenter, 0, theCenter-(centerDiff*2), theImage.height);
  767. }
  768. var pixels_links = theImageData_links.data;
  769. var pixels_rechts = theImageData_rechts.data;
  770. for (var i = 0, n = pixels_links.length; i < n; i += 4) {
  771. // pixels_links[i] = 0.7*pixels_rechts[i+1] + 0.3*pixels_rechts[i+2]; // rot halftone Wimmer
  772. pixels_links[i] = 0.299*pixels_rechts[i] + 0.587*pixels_rechts[i+1] + 0.114*pixels_rechts[i+2]; // rot halftone common
  773.  
  774. // Rechtes Teilbild in FC Farben
  775. pixels_rechts[i] = 34;
  776. pixels_rechts[i+1] = 34;
  777. pixels_rechts[i+2] = 34;
  778. }
  779. // Draw the ImageData at the given (x,y) coordinates.
  780. ctx.putImageData(theImageData_links, 0, 0);
  781. ctx.putImageData(theImageData_rechts, theCenter, 0);
  782. delete theImageData_links;
  783. theImageData_links = null;
  784. delete theImageData_rechts;
  785. theImageData_rechts = null;
  786. } else {
  787. // Parallelblick
  788. // links muss gruen/blau weg, rechts muss rot weg
  789. if(centerDiff<=0) {
  790. var theImageData_links = ctx.getImageData(0, 0, theCenter, theImage.height);
  791. var theImageData_rechts = ctx.getImageData(theCenter, 0, theCenter, theImage.height);
  792. } else {
  793. var theImageData_links = ctx.getImageData(0, 0, theCenter-(centerDiff*2), theImage.height);
  794. var theImageData_rechts = ctx.getImageData(theCenter, 0, theCenter-(centerDiff*2), theImage.height);
  795. }
  796. var pixels_links = theImageData_links.data;
  797. var pixels_rechts = theImageData_rechts.data;
  798. for (var i = 0, n = pixels_links.length; i < n; i += 4) {
  799. // pixels_links[i] = 0.7*pixels_rechts[i+1] + 0.3*pixels_rechts[i+2]; // rot halftone Wimmer
  800. pixels_links[i] = 0.299*pixels_links[i] + 0.587*pixels_links[i+1] + 0.114*pixels_links[i+2]; // rot halftone common
  801. pixels_links[i+1] = pixels_rechts[i+1];
  802. pixels_links[i+2] = pixels_rechts[i+2];
  803.  
  804. // Rechtes Teilbild in FC Farben
  805. pixels_rechts[i] = 34;
  806. pixels_rechts[i+1] = 34;
  807. pixels_rechts[i+2] = 34;
  808. }
  809. // Draw the ImageData at the given (x,y) coordinates.
  810. ctx.putImageData(theImageData_links, 0, 0);
  811. ctx.putImageData(theImageData_rechts, theCenter, 0);
  812. delete theImageData_links;
  813. theImageData_links = null;
  814. delete theImageData_rechts;
  815. theImageData_rechts = null;
  816. }
  817. document.getElementById('showwait').style.display = 'none';
  818. }
  819.  
  820. function showWaitInterlaced() {
  821. if(!ctx) return;
  822. if(isinterlaced) return;
  823. document.getElementById('showwait').style.display = 'block';
  824. window.setTimeout(makeInterlace, 300);
  825. }
  826.  
  827. function makeInterlace() {
  828. var isSwitched = document.getElementById('fc_image_interlaceswitch').checked;
  829. ctx.drawImage(theImage, 0, 0);
  830. flipped = false;
  831. ButtonText();
  832. isinterlaced = true;
  833. isredcyan = false;
  834. if(linesshown) {
  835. RemoveButtons();
  836. linesshown = false;
  837. }
  838. var centerDiff = theCenter - Math.floor(theImage.width / 2);
  839. if(detectPage() == 'kreuz') {
  840. // Kreuzblick
  841. if(centerDiff<=0) {
  842. var theImageData_links = ctx.getImageData(0, 0, theCenter, theImage.height);
  843. var theImageData_rechts = ctx.getImageData(theCenter, 0, theCenter, theImage.height);
  844. var theWidth = theCenter;
  845. } else {
  846. var theImageData_links = ctx.getImageData(0, 0, theCenter-(centerDiff*2), theImage.height);
  847. var theImageData_rechts = ctx.getImageData(theCenter, 0, theCenter-(centerDiff*2), theImage.height);
  848. var theWidth = theCenter-(centerDiff*2);
  849. }
  850. var pixels_links = theImageData_links.data;
  851. var pixels_rechts = theImageData_rechts.data;
  852. var zeile = 1;
  853. var spalte = 0;
  854. if(isSwitched) zeile = 0;
  855.  
  856. for (var i = 0, n = pixels_links.length; i < n; i += 4) {
  857. if(spalte == theWidth) {
  858. zeile++;
  859. spalte = 0;
  860. }
  861. if(zeile % 2 == 0) {
  862. // gerade Zeilen von rechts die ungeraden sind automatisch von links
  863. pixels_links[i] = pixels_rechts[i];
  864. pixels_links[i+1] = pixels_rechts[i+1];
  865. pixels_links[i+2] = pixels_rechts[i+2];
  866. }
  867. // rechte Pixel zuruecksetzen
  868. pixels_rechts[i] = 34;
  869. pixels_rechts[i+1] = 34;
  870. pixels_rechts[i+2] = 34;
  871.  
  872. spalte++;
  873. }
  874. // Draw the ImageData at the given (x,y) coordinates.
  875. ctx.putImageData(theImageData_links, 0, 0);
  876. ctx.putImageData(theImageData_rechts, theCenter, 0);
  877. delete theImageData_links;
  878. theImageData_links = null;
  879. delete theImageData_rechts;
  880. theImageData_rechts = null;
  881. } else {
  882. // Parallelblick
  883. if(centerDiff<=0) {
  884. var theImageData_links = ctx.getImageData(0, 0, theCenter, theImage.height);
  885. var theImageData_rechts = ctx.getImageData(theCenter, 0, theCenter, theImage.height);
  886. var theWidth = theCenter;
  887. } else {
  888. var theImageData_links = ctx.getImageData(0, 0, theCenter-(centerDiff*2), theImage.height);
  889. var theImageData_rechts = ctx.getImageData(theCenter, 0, theCenter-(centerDiff*2), theImage.height);
  890. var theWidth = theCenter-(centerDiff*2);
  891. }
  892. var pixels_links = theImageData_links.data;
  893. var pixels_rechts = theImageData_rechts.data;
  894. var zeile = 1;
  895. var spalte = 0;
  896. if(isSwitched) zeile = 0;
  897.  
  898. for (var i = 0, n = pixels_links.length; i < n; i += 4) {
  899. if(spalte == theWidth) {
  900. zeile++;
  901. spalte = 0;
  902. }
  903. if(zeile % 2 != 0) {
  904. // ungerade Zeilen von rechts die geraden sind automatisch von links
  905. pixels_links[i] = pixels_rechts[i];
  906. pixels_links[i+1] = pixels_rechts[i+1];
  907. pixels_links[i+2] = pixels_rechts[i+2];
  908. }
  909. // rechte Pixel zuruecksetzen
  910. pixels_rechts[i] = 34;
  911. pixels_rechts[i+1] = 34;
  912. pixels_rechts[i+2] = 34;
  913.  
  914. spalte++;
  915. }
  916. // Draw the ImageData at the given (x,y) coordinates.
  917. ctx.putImageData(theImageData_links, 0, 0);
  918. ctx.putImageData(theImageData_rechts, theCenter, 0);
  919. delete theImageData_links;
  920. theImageData_links = null;
  921. delete theImageData_rechts;
  922. theImageData_rechts = null;
  923. }
  924. document.getElementById('showwait').style.display = 'none';
  925. }