1. 程式人生 > >canvas 圖片跨域(一)

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

AjaxCROS請求中的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

json2----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、通過截圖獲取驗證碼圖片,為什麼要截圖