Advertisement
12Me21

Image converter version IDK

Aug 18th, 2016
399
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*=============*\
  2. |░ image thing ░|
  3. \*=============*/setTimeout(function(){
  4. function log(a){
  5.     console.log("[] "+a); //just a thing so I can read the messages more easily
  6. }
  7. //variables
  8. //var canvas=document.querySelector("#chatdraw canvas");
  9. //canvas.width=300;
  10. var z=new Image(); //best variable name (c) Trinitro 2016
  11. var noise=0;
  12. var isImage=false;
  13. var elemX=0;
  14. var elemY=0;
  15. var offsetX,offsetY;
  16. var moving=false;
  17. var scale=1;
  18. var colorButtons=document.querySelectorAll("#chatdraw button-area button.colorChange");
  19. var paletteSize=colorButtons.length;
  20. document.getElementById("colorPicker").addEventListener("change",()=>{updateImage()});
  21. document.querySelector("#chatdraw button-area button").addEventListener("click",()=>{
  22.     isImage=false;
  23.     moveBoxParent.style.backgroundImage="";
  24.     pc2d.clearRect(0,0,cW,cH);
  25. });//✖ button
  26. var canvas=document.querySelector("#chatdraw canvas");
  27. var c2d=canvas.getContext("2d");
  28. var cW=canvas.width,cH=canvas.height;
  29. var cR=cW/cH;
  30. var cM=Math.min(cW,cH);
  31. //html stuff
  32. var sidePane=document.querySelector("#sidepane");
  33. //paste box
  34. var pasteImageHere=document.createElement("div");
  35. pasteImageHere.style.width="3.25rem";
  36. pasteImageHere.contentEditable=true;
  37. pasteImageHere.oninput=function(){
  38.     var thing=this.getElementsByTagName("img")[0];
  39.     if (thing) {
  40.         loadImage(thing.src);
  41.     }
  42.     while (this.firstChild) this.removeChild(this.lastChild); //delete everything
  43. };
  44. document.querySelector("#sendpane").appendChild(pasteImageHere);
  45. //file upload button
  46. var fileBrowse=document.createElement("input");
  47. fileBrowse.type="file";
  48. fileBrowse.onchange=function(){
  49.     log("User uploaded an image...");
  50.     var reader=new FileReader();
  51.     reader.readAsDataURL(this.files[0]);
  52.     reader.onload=function(){loadImage(this.result)};
  53. };
  54. sidePane.appendChild(fileBrowse);
  55. //dither slider
  56. var ditherSlider=document.createElement("input");
  57. ditherSlider.type="range";
  58. ditherSlider.min="0";
  59. ditherSlider.max="1";
  60. ditherSlider.step="0.001";
  61. ditherSlider.onchange=function(){
  62.     updateImage();
  63. };
  64. sidePane.appendChild(ditherSlider);
  65. //blurring checkbox
  66. var blurring=document.createElement("input");
  67. blurring.type="checkbox";
  68. blurring.checked=true;
  69. blurring.onchange=function(){
  70.     c2d.webkitImageSmoothingEnabled=c2d.mozImageSmoothingEnabled=c2d.imageSmoothingEnabled=this.checked;
  71.     pc2d.webkitImageSmoothingEnabled=pc2d.mozImageSmoothingEnabled=pc2d.imageSmoothingEnabled=this.checked;
  72.     updateImage();
  73. };
  74. sidePane.appendChild(blurring);
  75. //
  76. var moveBoxParent=document.createElement("div");
  77. moveBoxParent.style.width=cW+"px";
  78. moveBoxParent.style.height=cH+"px";
  79. moveBoxParent.style.backgroundSize="contain";
  80. moveBoxParent.style.backgroundRepeat="no-repeat";
  81. moveBoxParent.style.backgroundColor="white";
  82. moveBoxParent.style.border="1px solid black";
  83. moveBoxParent.onmousemove=function(e){
  84.     if (moving){
  85.         updateMoveBoxPos(e.pageX-offsetX,e.pageY-offsetY);
  86.         updatePreview();
  87.     }
  88. };
  89. moveBoxParent.onmouseup=moveBoxParent.onmouseleave=function(){
  90.     moving=false;
  91.     moveBox.style.cursor="grab";
  92.     updateImage();
  93. };
  94. var updateImageTimeout;
  95. var mouseSens=200;
  96. moveBoxParent.onwheel=function(e){
  97.     updateScale(scale+e.deltaY/mouseSens);
  98.     updatePreview();
  99.     window.clearTimeout(updateImageTimeout);
  100.     updateImageTimeout=window.setTimeout(function(){updateImage();},mouseSens);
  101. };
  102. sidepane.appendChild(moveBoxParent);
  103. var scaleSlider=document.createElement("input");
  104. scaleSlider.type="range";
  105. scaleSlider.min=0.0001;
  106. scaleSlider.max=1;
  107. scaleSlider.step=0.0001;
  108. scaleSlider.value=1;
  109. scaleSlider.oninput=function() {
  110.     updateScale(this.value);
  111. };
  112. scaleSlider.onchange=function(){updateImage()};
  113. sidepane.appendChild(scaleSlider);
  114. var pCanvas=document.createElement("canvas");
  115. pCanvas.width=cW;
  116. pCanvas.height=cH;
  117. //pCanvas.style.cursor="crosshair";//this cursor sucks...
  118. pCanvas.style.backgroundColor="white";
  119. pCanvas.style.border="1px solid black";
  120. var pc2d=pCanvas.getContext("2d");
  121. pCanvas.onclick=function(e){
  122.     if (isImage){
  123.         var rect=pCanvas.getBoundingClientRect();
  124.         var x=Math.round(e.clientX-rect.left-1);
  125.         var y=Math.round(e.clientY-rect.top-1);
  126.         var pixel=pc2d.getImageData(x,y,1,1).data;
  127.         if (pixel[3]==-0) pixel=[255,255,255,255];
  128.         var button=document.querySelector('#chatdraw button-area button[data-selectedcolor="true"]');
  129.         button.style.color=rgbToFillStyle(pixel);
  130.         log(x+","+y+" "+pixel.join());
  131.         updateImage();
  132.     }
  133.     return false;
  134. };
  135. sidePane.appendChild(pCanvas);
  136. //
  137. var moveBox=document.createElement("div");
  138. //moveBox.style.backgroundColor="rgba(128,128,128,0.5)";
  139. moveBox.style.position="relative";
  140. moveBox.style.border="1px solid red";
  141. moveBox.style.width=cW-2+"px";
  142. moveBox.style.height=cH-2+"px";
  143. moveBox.style.cursor="grab";
  144. moveBox.onmousedown=function(e){
  145.    moving=true;
  146.    moveBox.style.cursor="grabbing";
  147.    offsetX=e.pageX-elemX;
  148.    offsetY=e.pageY-elemY;
  149. };
  150. moveBoxParent.appendChild(moveBox);
  151. //more functions
  152. function updateScale(newScale){
  153.     var oldScale=scale;
  154.     scale=Math.min(Math.max(newScale,0.001),1);
  155.     midX=elemX+oldScale*cW/2;
  156.     midY=elemY+oldScale*cH/2;
  157.     updateMoveBoxPos(midX-scale*cW/2,midY-scale*cH/2);
  158.     moveBox.style.width=scale*cW-2+"px";
  159.     moveBox.style.height=scale*cH-2+"px";
  160.     scaleSlider.value=scale;
  161.     if (oldScale!=scale) updatePreview();
  162. }
  163. function updateMoveBoxPos(x,y){
  164.     elemX=Math.min(Math.max(x,0),(1-scale)*cW);
  165.     elemY=Math.min(Math.max(y,0),(1-scale)*cH);
  166.     moveBox.style.left=elemX+"px";
  167.     moveBox.style.top=elemY+"px";
  168. }
  169. function loadImage(source){
  170.     log("Found an image. (assume load failed)");
  171.     z=new Image();
  172.     z.crossOrigin="Anonymous";
  173.     z.onload=function(){
  174.         log("Image loaded successfully!");
  175.         moveBoxParent.style.backgroundImage="url('"+source+"')";
  176.         isImage=true;
  177.         updateImage();
  178.     };
  179.     z.src=source;
  180. }
  181. function updateImage(){
  182.     if (isImage){
  183.         updatePreview();
  184.         putImage(z);
  185.     }
  186. }
  187. function updatePreview(){
  188.     if (isImage){
  189.         pc2d.clearRect(0,0,cW,cH);
  190.         var maxHeight=Math.max(z.width/cW,z.height/cH)*cM;
  191.         pc2d.drawImage(z,elemX/cW*maxHeight*cR,elemY/cH*maxHeight,scale*maxHeight*cR,scale*maxHeight,0,0,cW,cH);
  192.     }
  193. }
  194. //put image on canvas, and convert to 4 colors.
  195. function putImage(img){
  196.     var dither=ditherSlider.value;
  197.     var i,palette=[];
  198.     for(i=0;i<paletteSize;i++) palette.push(fillStyleToRgb(colorButtons[i].style.color));
  199.     c2d.rect(0,0,cW,cH);c2d.fillStyle="white";c2d.fill(); //clear canvas
  200.     var maxHeight=Math.max(img.width/cW,img.height/cH)*cM;
  201.     c2d.drawImage(img,elemX/cW*maxHeight*cR,elemY/cH*maxHeight,scale*maxHeight*cR,scale*maxHeight,0,0,cW,cH);
  202.     var data=c2d.getImageData(0,0,cW,cH);
  203.     for(var x=0,bestIndex,nextErr;x<cW*cH*4;x+=4){
  204.         if (noise) for (i=0;i<3;i++) data.data[x+i]+=Math.random()*noise-noise/2;
  205.         //find the best color
  206.         var bestDist=Infinity;
  207.         for (i=0;i<paletteSize&&bestDist!==0;i++) {
  208.             for (var j=0,dist=0,color=palette[i];j<3;j++) dist+=Math.abs(data.data[x+j]-color[j])*(1+(j==1));
  209.             if (dist<bestDist){bestDist=dist;bestIndex=i}
  210.         }
  211.         //dithering
  212.         if (dither){
  213.             for (i=0;i<3;i++) {
  214.                 var err=(data.data[x+i]-palette[bestIndex][i])*dither/3;
  215.                 //if (err<0) nextErr=-err; else nextErr=0;
  216.                 data.data[x+i]=palette[bestIndex][i];
  217.                 data.data[x     +4+i]+=err;   // right
  218.                 data.data[x+cW*4-4+i]+=err/2; // bottom left
  219.                 data.data[x+cW*4  +i]+=err;   // bottom
  220.                 data.data[x+cW*4+4+i]+=err/2; // bottom right
  221.             }
  222.         } else for (i=0;i<3;i++) data.data[x+i]=palette[bestIndex][i];
  223.     }
  224.     c2d.putImageData(data,0,0);
  225.     log("Image conversion sucessful.");
  226. }
  227. },2000);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement