图片裁切,上传,自动匹配颜色。
生活随笔
收集整理的這篇文章主要介紹了
图片裁切,上传,自动匹配颜色。
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
圖片裁切,上傳,自動匹配顏色。 photoclip插件學習。 https://github.com/baijunjie/PhotoClip.js是官方文檔。 使用方法很簡單。不過我在使用的過程中遇到幾個問題。 1、按官方文檔的教程寫完代碼以后,我的圖片只能左右移動,無法上下拖拽, 在豎直方向拖動的話,在拖動結束時會回到初始的豎直方向的位置。 解決方法:本來一直以為是js本地項目的js代碼與插件有沖突,不過在改動js后,本地仍然有這個問題。最后發現是本地默認的reset的樣式,改不了插件的樣式,導致無法正常使用。將 div, dt, dd, li, h3, h4, h5, h6 { max-height: 100% }默認樣式刪除后就可以正常使用了。 2、options.loadStart type: Function 圖片開始加載的回調函數。this?指向當前?PhotoClip?的實例對象,并將正在加載的 file 對象作為參數傳入。(如果是使用非 file 的方式加載圖片,則該參數為圖片的 url)
ColorThief.prototype.getColor = function(sourceImage, quality) { var palette = this.getPalette(sourceImage, 5, quality); // 改變無法讀取白色邊的情況。 -zcj if(palette==null){ palette = []; palette[0] = [255,255,255] } //兩個注釋之間為(添加)改變的代碼。強制添加了判斷。因為主色是很多像素點共同判斷的,我將 palette[0] = [255,255,255],我認為只是添加了部分白色的像素點對整體影響應該不大。 var dominantColor = palette[0]; return dominantColor; }; 此插件使用的是中位切分法來進行顏色提取,大家可以點擊此鏈接了解下這種算法。看起來還是很復雜的。https://blog.csdn.net/shanglianlm/article/details/50051269 附上demo代碼復制粘貼即可使用 demo是提取圖片四個邊的寬度為10px主題色。 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>demo2</title> <style> #result{ width:100px; height: 100px; } .div1{ width: 100%; height: 100px; } .div2{ width: 100%; height: 100px; } .div3{ width: 100%; height: 100px; } </style> </head> <body> <script src="./src/color-thief.js"></script> <script> function readAsDataURL(){ //檢驗是否為圖像文件 var file = document.getElementById("file").files[0]; if(!/image\/\w+/.test(file.type)){ alert("看清楚,這個需要圖片!"); return false; } var reader = new FileReader(); //將文件以Data URL形式讀入頁面 reader.readAsDataURL(file); reader.οnlοad=function(e){var result=document.getElementById("result"); let context = document.createElement('canvas'); context.setAttribute('width','200'); context.setAttribute('height','200'); let ctx = context.getContext('2d'); document.querySelector('body').appendChild(context) let image = new Image(); image.src = e.target.result;image.onload = function(){ ctx.drawImage(image,0,0,100,100); let context1 = document.createElement('canvas'); context1.setAttribute('width','200'); context1.setAttribute('height','200'); let ctx1 = context1.getContext('2d'); document.querySelector('body').appendChild(context1);let ctx1data = ctx.getImageData(0,0,100,10); let ctx1data1 = ctx.getImageData(0,0,10,100); let ctx1data2 = ctx.getImageData(90,0,10,100); let ctx1data3 = ctx.getImageData(0,90,100,10); console.log(ctx1data);let context2 = document.createElement('canvas'); context2.setAttribute('width','200'); context2.setAttribute('height','200'); let ctx2 = context2.getContext('2d'); document.querySelector('body').appendChild(context2);let context3 = document.createElement('canvas'); context3.setAttribute('width','200'); context3.setAttribute('height','200'); let ctx3 = context3.getContext('2d'); document.querySelector('body').appendChild(context3);let context4 = document.createElement('canvas'); context4.setAttribute('width','200'); context4.setAttribute('height','200'); let ctx4 = context4.getContext('2d'); document.querySelector('body').appendChild(context4);ctx1.putImageData(ctx1data,0,0); //top ctx2.putImageData(ctx1data1,0,0);//left ctx3.putImageData(ctx1data2,0,0);//right ctx4.putImageData(ctx1data3,0,0);//bottomlet colorThief = new ColorThief(); result.style.background = `rgb(${colorThief.getColor(image)[0]},${colorThief.getColor(image)[1]},${colorThief.getColor(image)[2]})`; let maincolor = colorThief.getColor(image); console.log(result.style.background) // console.log(colorThief.getColor(image)); 獲取整張圖片的主色 console.log(colorThief.getColor(context1)); console.log(colorThief.getColor(context2)); console.log(colorThief.getColor(context3)); console.log(colorThief.getColor(context4)); //獲取四個邊合在一起的平均色 //div2為四個邊的平均 let colorR = (colorThief.getColor(context1)[0]+colorThief.getColor(context2)[0]+colorThief.getColor(context3)[0]+colorThief.getColor(context4)[0])/4 let colorG = (colorThief.getColor(context1)[1]+colorThief.getColor(context2)[1]+colorThief.getColor(context3)[1]+colorThief.getColor(context4)[1])/4 let colorB = (colorThief.getColor(context1)[2]+colorThief.getColor(context2)[2]+colorThief.getColor(context3)[2]+colorThief.getColor(context4)[2])/4 let colorRgb = `(${colorR},${colorG},${colorB})`; //rgb console.log(colorRgb) let showcolorrgb = document.createElement('div'); showcolorrgb.classList.add('div2'); showcolorrgb.innerHTML = '四個邊的平均色' showcolorrgb.setAttribute('style',`background:rgb${colorRgb}`); document.querySelector('body').appendChild(showcolorrgb);//在六種顏色中找到最接近匹配顏色的顏色 //黃色:rgb(225,220,50),紅色(180,72,78),藍色(49,121,195),綠色(115,185,85),黑色(14,17,20),白色(255,255,255); //div3為匹配后的顏色 let min = 442; let numorder = 0; let colorlist_Arr = [[225,220,50],[180,72,78],[49,121,195],[115,185,85],[14,17,20],[255,255,255]]; for(let z=0;z<6;z++){ let minA = Math.floor(Math.sqrt(Math.pow(colorlist_Arr[z][0]-colorR,2)+Math.pow(colorlist_Arr[z][1]-colorG,2)+Math.pow(colorlist_Arr[z][2]-colorB,2))); console.log(minA) if(minA<min){ min = minA; numorder = z; }} let divv = document.createElement('div'); divv.classList.add('div3'); divv.innerHTML = '匹配后的顏色,六種顏色之1' divv.setAttribute('style',`background:rgb(${colorlist_Arr[numorder][0]},${colorlist_Arr[numorder][1]},${colorlist_Arr[numorder][2]})`); document.querySelector('body').appendChild(divv);//獲取圖片中的其他顏色 //div1為圖片中其他色,第一個為主色 let colorThiefban = colorThief.getPalette(image, 8); console.log(colorThiefban) for(let i = 0;i<colorThiefban.length;i++){ let div = document.createElement('div'); div.classList.add('div1'); div.innerHTML = '圖片中其他色,第一個為主色' div.setAttribute('style',`background:rgb(${colorThiefban[i][0]},${colorThiefban[i][1]},${colorThiefban[i][2]})`); document.querySelector('body').appendChild(div); } //顯示文件 // result.innerHTML='<img src="' + e.target.result +'" alt="" />'; }} } </script> <p> <label>請選擇一個文件:</label> <input type="file" id="file" /> <input type="button" value="讀取圖像" οnclick="readAsDataURL()" /> </p> <div id="result" name="result">為圖片的主色</div> </body> </html>
- options.loadComplete
- options.loadError
- options.done
ColorThief.prototype.getColor = function(sourceImage, quality) { var palette = this.getPalette(sourceImage, 5, quality); // 改變無法讀取白色邊的情況。 -zcj if(palette==null){ palette = []; palette[0] = [255,255,255] } //兩個注釋之間為(添加)改變的代碼。強制添加了判斷。因為主色是很多像素點共同判斷的,我將 palette[0] = [255,255,255],我認為只是添加了部分白色的像素點對整體影響應該不大。 var dominantColor = palette[0]; return dominantColor; }; 此插件使用的是中位切分法來進行顏色提取,大家可以點擊此鏈接了解下這種算法。看起來還是很復雜的。https://blog.csdn.net/shanglianlm/article/details/50051269 附上demo代碼復制粘貼即可使用 demo是提取圖片四個邊的寬度為10px主題色。 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>demo2</title> <style> #result{ width:100px; height: 100px; } .div1{ width: 100%; height: 100px; } .div2{ width: 100%; height: 100px; } .div3{ width: 100%; height: 100px; } </style> </head> <body> <script src="./src/color-thief.js"></script> <script> function readAsDataURL(){ //檢驗是否為圖像文件 var file = document.getElementById("file").files[0]; if(!/image\/\w+/.test(file.type)){ alert("看清楚,這個需要圖片!"); return false; } var reader = new FileReader(); //將文件以Data URL形式讀入頁面 reader.readAsDataURL(file); reader.οnlοad=function(e){var result=document.getElementById("result"); let context = document.createElement('canvas'); context.setAttribute('width','200'); context.setAttribute('height','200'); let ctx = context.getContext('2d'); document.querySelector('body').appendChild(context) let image = new Image(); image.src = e.target.result;image.onload = function(){ ctx.drawImage(image,0,0,100,100); let context1 = document.createElement('canvas'); context1.setAttribute('width','200'); context1.setAttribute('height','200'); let ctx1 = context1.getContext('2d'); document.querySelector('body').appendChild(context1);let ctx1data = ctx.getImageData(0,0,100,10); let ctx1data1 = ctx.getImageData(0,0,10,100); let ctx1data2 = ctx.getImageData(90,0,10,100); let ctx1data3 = ctx.getImageData(0,90,100,10); console.log(ctx1data);let context2 = document.createElement('canvas'); context2.setAttribute('width','200'); context2.setAttribute('height','200'); let ctx2 = context2.getContext('2d'); document.querySelector('body').appendChild(context2);let context3 = document.createElement('canvas'); context3.setAttribute('width','200'); context3.setAttribute('height','200'); let ctx3 = context3.getContext('2d'); document.querySelector('body').appendChild(context3);let context4 = document.createElement('canvas'); context4.setAttribute('width','200'); context4.setAttribute('height','200'); let ctx4 = context4.getContext('2d'); document.querySelector('body').appendChild(context4);ctx1.putImageData(ctx1data,0,0); //top ctx2.putImageData(ctx1data1,0,0);//left ctx3.putImageData(ctx1data2,0,0);//right ctx4.putImageData(ctx1data3,0,0);//bottomlet colorThief = new ColorThief(); result.style.background = `rgb(${colorThief.getColor(image)[0]},${colorThief.getColor(image)[1]},${colorThief.getColor(image)[2]})`; let maincolor = colorThief.getColor(image); console.log(result.style.background) // console.log(colorThief.getColor(image)); 獲取整張圖片的主色 console.log(colorThief.getColor(context1)); console.log(colorThief.getColor(context2)); console.log(colorThief.getColor(context3)); console.log(colorThief.getColor(context4)); //獲取四個邊合在一起的平均色 //div2為四個邊的平均 let colorR = (colorThief.getColor(context1)[0]+colorThief.getColor(context2)[0]+colorThief.getColor(context3)[0]+colorThief.getColor(context4)[0])/4 let colorG = (colorThief.getColor(context1)[1]+colorThief.getColor(context2)[1]+colorThief.getColor(context3)[1]+colorThief.getColor(context4)[1])/4 let colorB = (colorThief.getColor(context1)[2]+colorThief.getColor(context2)[2]+colorThief.getColor(context3)[2]+colorThief.getColor(context4)[2])/4 let colorRgb = `(${colorR},${colorG},${colorB})`; //rgb console.log(colorRgb) let showcolorrgb = document.createElement('div'); showcolorrgb.classList.add('div2'); showcolorrgb.innerHTML = '四個邊的平均色' showcolorrgb.setAttribute('style',`background:rgb${colorRgb}`); document.querySelector('body').appendChild(showcolorrgb);//在六種顏色中找到最接近匹配顏色的顏色 //黃色:rgb(225,220,50),紅色(180,72,78),藍色(49,121,195),綠色(115,185,85),黑色(14,17,20),白色(255,255,255); //div3為匹配后的顏色 let min = 442; let numorder = 0; let colorlist_Arr = [[225,220,50],[180,72,78],[49,121,195],[115,185,85],[14,17,20],[255,255,255]]; for(let z=0;z<6;z++){ let minA = Math.floor(Math.sqrt(Math.pow(colorlist_Arr[z][0]-colorR,2)+Math.pow(colorlist_Arr[z][1]-colorG,2)+Math.pow(colorlist_Arr[z][2]-colorB,2))); console.log(minA) if(minA<min){ min = minA; numorder = z; }} let divv = document.createElement('div'); divv.classList.add('div3'); divv.innerHTML = '匹配后的顏色,六種顏色之1' divv.setAttribute('style',`background:rgb(${colorlist_Arr[numorder][0]},${colorlist_Arr[numorder][1]},${colorlist_Arr[numorder][2]})`); document.querySelector('body').appendChild(divv);//獲取圖片中的其他顏色 //div1為圖片中其他色,第一個為主色 let colorThiefban = colorThief.getPalette(image, 8); console.log(colorThiefban) for(let i = 0;i<colorThiefban.length;i++){ let div = document.createElement('div'); div.classList.add('div1'); div.innerHTML = '圖片中其他色,第一個為主色' div.setAttribute('style',`background:rgb(${colorThiefban[i][0]},${colorThiefban[i][1]},${colorThiefban[i][2]})`); document.querySelector('body').appendChild(div); } //顯示文件 // result.innerHTML='<img src="' + e.target.result +'" alt="" />'; }} } </script> <p> <label>請選擇一個文件:</label> <input type="file" id="file" /> <input type="button" value="讀取圖像" οnclick="readAsDataURL()" /> </p> <div id="result" name="result">為圖片的主色</div> </body> </html>
轉載于:https://www.cnblogs.com/qdcnbj/p/9588171.html
總結
以上是生活随笔為你收集整理的图片裁切,上传,自动匹配颜色。的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 利用ConcurrentHashMap来
- 下一篇: springboot2.X 在项目启动后