canvas 圖片跨域(一)
在專案中,需要生成海報。有動態資訊(微信頭像、微信暱稱、上傳圖片(oss連結)、二維碼)+ 海報背景圖生成一張海報。
技術支援:canvas 生成。
問題:canvas 圖片跨域。
解決過程(填坑歷程):
1.從網上存在如圖解決辦法 img.crossOrigin = "" (專業採坑,數年)。親測無效。很是不解。
2.網上也存在後端服務解決
A.設定header頭,或者nginx 服務配置等 允許訪問
但是,存在問題(圖片大部分為了優化,都會存放在第三方cdn.上面。這是第三方的配置,是否允許,自己很難控制)
0個小時。。。。。。。
1個小時.。。。。。。。。。。
0下午。。。。。。。。。。。。
1下午。。。。。。。。。。。。。
0天。。。。。。。。。。。。。。。。
解決辦法:採用所有圖片路徑,轉化為base64流,來處理。相對於本地圖片了。此時,就避開了跨域問題。
圖片路徑,轉base64,後端處理,更方便。
eg: php
/** * @param $url * @return bool|string * Name: master_imgUrl_base64 * User: wangjiapeng * Date: 2018/04/12 * Explain:CDN遠端圖片URL下載,並轉化為base64 */ protected function master_imgUrl_base64($url){ if($url){ $header = array( 'User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0', 'Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3', 'Accept-Encoding: gzip, deflate',); $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); curl_setopt($curl, CURLOPT_ENCODING, 'gzip'); curl_setopt($curl, CURLOPT_HTTPHEADER, $header); $data = curl_exec($curl); $code = curl_getinfo($curl, CURLINFO_HTTP_CODE); curl_close($curl); if ($code == 200) {//把URL格式的圖片轉成base64_encode格式的! $imgBase64Code = "data:image/jpeg;base64," . base64_encode($data); return $imgBase64Code; }else{ return false; } }else{ return false; } }
附加,海報中需要生成二維碼。
技術支援:jquery.qrcode.min.js
方法:1.html 中放入盒子
<!--二維碼--> <div style="display: none;" id="qrcode">2. js
$("#qrcode").qrcode({ render: "canvas", text: data.info.u_url (要生成的url:例 https://blog.csdn.net/qq_37837134) }); var codeCanvas=document.getElementById("qrcode").getElementsByTagName("canvas")[0]; var codeContext = codeCanvas.getContext("2d"); var imgsSrc1 = codeCanvas.toDataURL('image/jpg'); do_canvasa(data.info,imgsSrc1); // 此方法 為canvas 生成海報 引數一:微信頭像、微信暱稱等 引數二:二維碼
3.
function do_canvasa(data,imgsSrc1) {
//獲取canvas var canvas = document.getElementById('canvas'); //設定寬高 //想獲取高清圖請*2,一般的直接等於Width就行 var Height = window.innerHeight*2; var Width = window.innerWidth*2; //canvas繪製需要的物件 var ctx = canvas.getContext("2d"); canvas.width = Width; canvas.height = Height; //獲取圖片 var mainImg = document.getElementById('mainImg'); //獲取圖片 var imgs = { bg: data.img_posters, //大背景 via: data.wx_img, //頭像 pho:data.upload_img, //照片 qrCode: imgsSrc1, //二維碼 }; var draw = {}; //載入圖片 draw.into = function(){ var imgNum = 0; for(var key in imgs){ var img = new Image(); img.crossOrigin = ""; img.src = imgs[key]; imgs[key] = img; imgs[key].onload = function(){ imgNum++; if(imgNum == Object.keys(imgs).length) draw.drawImg(); } } } //繪製canvas draw.drawImg = function(){ //背景圖 ctx.drawImage(imgs.bg, 0, 0, Width, Height); //頭像 ctx.save(); ctx.arc(Width*0.14, Height*0.12, Width*0.075, 0, 360); ctx.clip(); ctx.drawImage(imgs.via, Width*0.065, Height*0.07, Width*0.16, calcHeight(imgs.via, Width*0.16)); ctx.restore(); //暱稱5 //顏色 ctx.fillStyle = '#fff'; //字型設定 三個引數,font-weight font-size font-family ctx.font = '26px microsoft yahei'; //說明 // (scaled-0.62) ctx.fillText(''+data.wx_name+'', Width*0.225, Height*0.105); ctx.font = '24px microsoft yahei'; ctx.fillStyle = 'red'; ctx.textAlign="center"; ctx.fillText(''+data.order_num+'', Width*0.34, Height*0.134); //照片 ctx.save(); ctx.strokeStyle = '#fff'; ctx.lineWidth = 20; ctx.lineJoin = "round"; if(imgs.pho.height > imgs.pho.width) { ctx.strokeRect((Width-Height*0.3 / imgs.pho.height * imgs.pho.width)/2, (Height-Height*0.3)/2 + 80, Height*0.3 / imgs.pho.height * imgs.pho.width, Height*0.3 ); ctx.fillRect((Width-Height*0.3 / imgs.pho.height * imgs.pho.width)/2, (Height-Height*0.3)/2 + 80, Height*0.3 / imgs.pho.height * imgs.pho.width, Height*0.3 ); ctx.drawImage(imgs.pho, (Width-Height*0.3 / imgs.pho.height * imgs.pho.width)/2, (Height-Height*0.3)/2 + 80, Height*0.3 / imgs.pho.height * imgs.pho.width, Height*0.3); } else if(imgs.pho.height < imgs.pho.width){ ctx.strokeRect((Width-Width*0.7)/2, (Height - Width*0.7 / imgs.pho.width * imgs.pho.height) / 2 + 80, Width*0.7, Width*0.7 / imgs.pho.width * imgs.pho.height); ctx.fillRect((Width-Width*0.7)/2, (Height - Width*0.7 / imgs.pho.width * imgs.pho.height) / 2 + 80, Width*0.7, Width*0.7 / imgs.pho.width * imgs.pho.height); ctx.drawImage(imgs.pho, (Width-Width*0.7)/2,(Height - Width*0.7 / imgs.pho.width * imgs.pho.height) / 2 + 80, Width*0.7, Width*0.7 / imgs.pho.width * imgs.pho.height); } else { ctx.strokeRect((Width-440)/2, (Height-Width*0.7)/2 + 120, 440, 440); ctx.fillRect((Width-440)/2, (Height-Width*0.7)/2 + 120, 440, 440); ctx.drawImage(imgs.pho, (Width-440)/2, (Height-Width*0.7)/2 + 120, 440, 440); } ctx.restore(); //二維碼 ctx.drawImage(imgs.qrCode, (Width-Width*0.22)/2 , Height*0.76, Width*0.22, calcHeight(imgs.qrCode, Width*0.22)); //獲取base64格式的src var imgSrc = canvas.toDataURL('image/jpg'); mainImg.src = imgSrc; } draw.into(); function calcHeight(obj, w){ return w / obj.width * obj.height; } }
我為人人,人人為我;美美與共,天下大同;
相關推薦
canvas 圖片跨域(一)
在專案中,需要生成海報。有動態資訊(微信頭像、微信暱稱、上傳圖片(oss連結)、二維碼)+ 海報背景圖生成一張海報。技術支援:canvas 生成。問題:canvas 圖片跨域。解決過程(填坑歷程): 1.從
canvas圖片跨域問題
context raw cross sso 並且 wid get gin cti canvas的drawImage使用跨域圖片時候,會報錯,解決方法如下: 1. 使用base64替換跨域圖片 如果圖片不大,且只有幾張,可以使用base64,來代替跨域引用圖片。 2. 設置i
ajax跨域 (轉)
導致 simple version 發生 分享 err web服務 描述 自己的 題綱 關於跨域,有N種類型,本文只專註於ajax請求跨域(,ajax跨域只是屬於瀏覽器”同源策略”中的一部分,其它的還有Cookie跨域iframe跨域,LocalStorage跨域等這裏不做
ASP.NET Core 配置跨域(CORS)
tin sha har exce pub header service 策略 uil 1.安裝程序CORS程序包 Install-Package Microsoft.AspNetCore.Mvc.Cors 一般默認都帶了此程序包的 2.配置CORS服務 在 Startu
跨域(my)
CORS跨域請求 CORS即Cross Origin Resource Sharing 跨域資源共享, 那麼跨域請求還分為兩種,一種叫簡單請求,一種是複雜請求~~ 簡單請求 HTTP方法是下列方法之一 HEAD, GET,POST HTTP頭資訊不超出以下幾種欄位 Accept, Acc
Ajax跨域(CROS)請求中的Preflighted requests
Ajax跨域(CROS)請求中的Preflighted requests:https://www.aliyun.com/jiaocheng/862989.html 10 分鐘理解跨域請求:https://www.jianshu.com/p/d21b50dc2b25?utm_campaign=maleskin
python+openCV實現簡單的圖片搜尋功能(一)
一、圖片搜尋引擎有三種不同的模式 1.Search by Meta-Data:元資料搜尋模式,這種和傳統的文字搜尋類似,給索引資料新增文字註釋,上傳待查詢的圖片的時候,需要附加圖片的文字描述,實際在後臺搜尋對應的文字描述,典型的有 https://www.flickr.com/ 
瀏覽器和伺服器實現跨域(CORS)判定的原理
同源策略 同源指的是域名(或IP),協議,埠都相同,不同源的客戶端指令碼(javascript、ActionScript)在沒明確授權的情況下,不能讀寫對方的資源。 同源的判定: 以http://www.example.com/dir/page.html為例,以下表格指出了不同
asp.net core webapi之跨域(Cors)訪問
這裡說的跨域是指通過js在不同的域之間進行資料傳輸或通訊,比如用ajax向一個不同的域請求資料,或者通過js獲取頁面中不同域的框架中(iframe)的資料。只要協議、域名、埠有任何一個不同,都被當作是不同的域。 預設瀏覽器是不支援直接跨域訪問的。但是由於種種原因我們又不得不進行跨域訪問,比如當前後端
JavaScript執行環境及作用域(一)——執行環境棧和作用域鏈機制
執行環境是JavaScript中最為重要的一個概念,每個執行環境都有一個與之關聯的變數物件,執行環境中所有的變數和函式都儲存在這個物件中。我們編寫的程式碼是無法訪問這個變數物件的,只有解析器在處理資料時會在後臺使用它,但有個例外,因為在Web瀏覽器中,全域性執行環境關聯的變數物件是window物件,windo
前端常見問題——Canvas 圖片跨域
儘管不通過 CORS 就可以在 Canvas 畫布中使用圖片,但是這會汙染畫布。一旦畫布被汙染,你就無法讀取其資料。例如,你不能再使用畫布的 toBlob(), toDataURL() 或 getImageData() 方法,呼叫它們會丟擲安全錯誤。這種機制可以避免
Android-淺談Glide的原始碼-優雅的圖片載入框架(一)
摘要 網上GLide的原始碼分析文章太多了,以至於我自己看的時候都不知道從哪看,最近正好有時間整理一下文件。首先要肯定的一點是,我必須承認,Glide原始碼我沒讀完,相比較volley等框架的原始碼,Glide的原始碼在我看來更是一個極其複雜的設計,雖然它的使用時很簡單,但
詳解JS作用域(一)
一、什麼是作用域 儲存和訪問變數,是任何一種程式語言最基本的功能之一,變數存在哪裡?程式需要時如何找到它?這些問題需要一套良好的規則來規範,這套規則,就成為作用域。 二、編譯原理 js通常歸類為解釋語言,但它其實是編譯語言,和傳統編譯語言不同,它不是提前編譯,編譯結果也不能在分散式系統中進行移植。js引
Java之旅--跨域(CORS)
什麼是跨域 CORS全稱:Cross-Origin Resource Sharing 在前後臺分離的應用開發中,跨域是經常需要處理的場景。指的是訪問不同域名的資源,對於靜態資源的訪問,比如CSS、GIF、Form請求,不存在跨域問題,一般說跨域問題,就是指的JavaSc
json跨域(2)----js跨域及解決方案
之前轉載過一篇關於跨域的文章,分不清什麼叫主域跨域和二級跨域 下面這篇微博的博主寫的很好,也很清楚。 轉載連結:http://www.cnblogs.com/oneword/archive/2012/12/03/2799443.html 1.什麼是跨域 我們經常會在
SpringBoot解決CORS跨域(@CrossOrigin)
一、關於跨域介紹 在前後分離的架構下,跨域問題難免會遇見比如,站點 http://domain-a.com 的某 HTML 頁面通過 的 src 請求 http://domain-b.com/image.jpg。網路上的許多頁面都會載入來自不同域的CSS樣式
Android高階進階——繪圖篇(七)Canvas 與 圖層(一)
開篇 前面很多篇文章都用到了圖層的概念,但是一直沒有詳細介紹,今天這篇文章將詳細的介紹 Canvas 與 圖層的概念 一、如何獲得一個Canvas物件 方法一:自定義view時, 重寫onDraw、dispatchDraw方法 protect
你不知道的JavaScript--作用域(一)
第一部分:作用域是什麼? 編譯原理 理解作用域 作用域巢狀 異常 小結 編譯原理 編譯過程: 分詞/詞法分析 解析/語法分析 程式碼生成 1)分詞/詞法分析: 這個過程會將字元組成的字串分解成有意義的 程式碼塊 ,這些程式碼塊被稱為 詞
ElasticSearch 圖片搜尋外掛 (一)
一, 關於ElasticSearch ElasticSearch 是基於 Lucene 的分散式搜尋引擎。 雖然Lucene 從 版本6 開始內部使用了bkd樹使得多維搜尋問題得到顯著優化,但是 ElasticSearch 實際只在 numeric range 問題上使用了
Python OCR識別圖片驗證碼(一)
歡迎加入學習交流QQ群:657341423 對於某些網站登入的時候,往往需要輸入驗證碼才能實現登入。如果要爬蟲這類網站,往往總會比這個驗證碼導致無法爬取資料。以下介紹一種比較折中的方法,也是比較可行的方法: 實現思想: 1、通過截圖獲取驗證碼圖片,為什麼要截圖