1. 程式人生 > >使用h5的canvas實現兩張圖片的合併

使用h5的canvas實現兩張圖片的合併

思路:
1.首先等待圖片載入完成
2.然後使用canvas完成圖片的合併
3.顯示合成圖片
步驟:
1.根據第一個思路,需要image的load和error事件,大致流程:
var l_image = new Image();
l_image.src = src;
l_image.onload = function () {};
l_image.onerror = function () {};
2,根據第二個思路,需要canvas的drawImage()和toDataURL()兩個方法,大致流程:
先試用for迴圈依次將圖片寫入畫布,然後使用toDataURL生成新的圖片(返回值可以作為圖片的路徑)
3.根據需要是否顯示合成圖片:
程式碼:

$(function () {
   var $imgs = $('.img-boxs .merging'),
       $btnMerge = $('#btn-merge'),
       $mergedImage = $('.img-boxs .merged')[0],
       srcs = [],
       arr_img_w = [],
       arr_img_h = [],
       imgs_num = $imgs.length,
       loaded_img = 0;
   /*
   * 定義一個名為loading的函式,用於載入圖片以及獲取一些初始值
   * @param
void * @return void * */
var loading = function () { for (var i = 0; i < imgs_num; i++) { try{ if (!$($imgs[i])) { throw 'loading函式引數$imgs['+i+']不能為空'; } srcs[i] = $($imgs[i]).attr("src"); var
_image = new Image(); _image.src = srcs[i]; //儲存圖片的原始寬高 arr_img_w.push(_image.width); arr_img_h.push(_image.height); //不論圖片載入完成還是失敗都執行該函式 $(_image).on('load error', function () { loadImage(); }); } catch (err) { printError(err); } } function loadImage () { if (imgs_num === loaded_img) { return false; } loaded_img = Math.min(imgs_num, ++loaded_img); } }; loading(); $btnMerge.on('click', function () { mergeImages(); }); /* * 定義一個名為mergeImages的函式,用於合併兩張圖片 * @param void * @return void * */ function mergeImages () { try { if (loaded_img!==imgs_num && 2!==imgs_num) { throw '圖片未載入完成或圖片的數目不為2'; return false; } var canvas = document.createElement('canvas'), temp_w = 0, temp_h = 0, offset_w = Math.abs((arr_img_w[0] - arr_img_w[1]) / 2),//最後一張圖片居中需要的x軸移動值 offset_h = Math.abs((arr_img_h[0] - arr_img_h[1]) / 2),//最後一張圖片居中需要的y軸移動值 l_src = '', ctx = {}; //畫布的寬度和高度和最大圖片的一樣 canvas.width = getMaxofArray(arr_img_w); canvas.height = getMaxofArray(arr_img_h); ctx = canvas.getContext('2d'); for (var i = 0; i < imgs_num; i++) { temp_w = arr_img_w[i]; temp_h = arr_img_h[i]; if (i == (imgs_num-1)) { ctx.drawImage($imgs[i], 0, 0, temp_w, temp_h, offset_w, offset_h, temp_w, temp_h); } else { ctx.drawImage($imgs[i], 0, 0, temp_w, temp_h, 0, 0, temp_w, temp_h); } } l_src = canvas.toDataURL('image/png'); $($mergedImage).attr('src', l_src); } catch (err) { printError(err); } } /* * 定義一個名為getMaxofArray的函式,用於獲取陣列中的最大值 * @param array elems 需要獲取最大值的陣列 * @return boolean maxValue 返回最大值 * */ function getMaxofArray (elems) { try { if (!Array.isArray(elems)) { throw 'getMaxofArray函式的引數必須是陣列'; } } catch (err) { printError(err); } return Math.max.apply(null, elems); } /* * 定義一個名為getMaxofArray的函式,用於獲取陣列中的最大值 * @param string msg 產生的異常或錯誤 * @return void * */ function printError (msg) { console.log('error message:', msg); } });

這裡寫圖片描述
這裡寫圖片描述
注意:
1.要獲取圖片的原始值而不是css樣式,所以你可以在var image = new Image(),後取得圖片的原始值,
2.畫布的寬高應和最大圖片的寬高一致
3.圖片不僅要寫load事件,還要寫error事件

錯誤
如何控制顯示這樣的錯誤

$imgs[i].attr is not a function
    at loading (mergeImages.js:21)
    at HTMLDocument.<anonymous> (mergeImages.js:43)
    at mightThrow (jquery-3.2.1.js:3583)
    at process (jquery-3.2.1.js:3651)

你會好奇找了一圈,你會有沒什麼錯誤啊,jquery明明有這個方法啊等等的想法
首先你要明確,你肯定有錯,不然不會有錯誤,
其次使用console.log()列印元素會顯示dom元素,恭喜你,你離真相只有一步,
給元素加上$()吧,好了,問題解決了。
在jquery使用中很容易犯這個錯誤,一定要牢記。

相關推薦

使用h5的canvas實現圖片合併

思路: 1.首先等待圖片載入完成 2.然後使用canvas完成圖片的合併 3.顯示合成圖片 步驟: 1.根據第一個思路,需要image的load和error事件,大致流程: var l_image = new Image(); l_image.sr

php將圖片合併成一,加上文字

<?php /* * 圖片加微信二維碼,並加文字 */ header('Content-Type: image/png');//輸出協議頭 $dst_path = '4.png';//背景圖 $src_path = 'http://qr.liantu.com/api.php?m=0&

如何使用OPENCV實現圖片的混合(PS中的圖層不透明度)

Goal 什麼是線性混合,用於何處? 怎麼使用addWeighted()? Theory 前面已經學到了一點基本的畫素級操作,一個比較有趣的二元操作是線性混合操作:   g(x)=(1−α)f0(x)+αf1(x) α在0-1之間變化,這種操作

用matlab實現圖片合併

I = imread('qiegray.jpg'); i=imrotate(I,45); j=imrotate(I,315); h1 = axes('position', [0.0 0.0 1.0 1.0], 'parent', gcf); imshow(I, 'paren

Html5 Canvas 實現圖片合成

<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta name="keywords" con

android中將圖片合併為一圖片 .

private Bitmap mergeBitmap(Bitmap firstBitmap, Bitmap secondBitmap) {         Bitmap bitmap = Bitmap.createBitmap(firstBitmap.getWidth(),

C語言 實現圖片的拼接

在Linux中用gcc編譯 這個程式碼的邏輯其實蠻簡單的,就是用read()函式將對應的要拼接的部分,讀入到一塊兒快取中(定義一個數組就行),最後用write()函式將切出來的對應的部分輸出到要拼接的圖片檔案就大功告成。 值得注意的有兩點:1、圖片在必須用.

PHP合併圖片實現

程式碼如下: $bigImgPath = "./images/bg.jpg"; $qCodePath = "./images/thumb/$id.jpg"; $bigImg = imagecreatefromstring(file_get_contents($bigImg

【matlab】:matlab實現計算圖片的相似度

                              以二維空間為例,上圖的a和b是兩個向量,我們要計算它們的夾角θ。餘弦定理告訴我們,可以用下面的公式求得:                                              假定a向量是[x1, y1],b向量是[x

基於python的圖片RGBA alpha 透明度混合實現

最近在做關於基於yolo的目標檢測,由於yolo目標檢測中有時候會檢測到不需要或者說和需要檢測的目標不相匹配的其它額外小目標,因此在訓練yolo模型的時候,有必要對訓練資料進行資料增強操作,由程式對訓練資料隨機增加一些額外的小目標物體。如果只是把小目標圖片直接疊加到原圖中,

viewpager+timer實現圖片輪播 圖片輪播時出現空白頁

  @SuppressLint("HandlerLeak") private final Handler viewHandler = new Handler() {         @Override         public void handleMessage(Me

Android用圖片實現簡單動畫效果

直接在java程式碼裡寫圖片佈局,而不用XML檔案。 先宣告定義: ImageView imageviewsudubg; ImageView imageviewsudu; LinearLayout l

計算圖片相似度的方法總結

title rac 相似度 無法 tween hive any 明顯 embed python工具包-pyssim 簡介 python工具包,用來計算圖像之間的結構相似性 (Structural Similarity Image Metric: SSIM)。結構相似性介紹

圖片的輪播

logs this spa img tar meta ear script utf-8 1 <!DOCTYPE html> 2 <html> 3 <head lang="en"> 4 <meta charset="

JAVA 比較圖片的相似度的代碼

awt ace ktr ngs gin min amp exce value 原文:http://www.open-open.com/code/view/1448334323079 import java.awt.image.BufferedImage; import

C# 合並圖片

targe raw visual bit RM private 圖片 col img private BitmapSource CombineImage(BitmapSource img1,BitmapSource img2) { var composeImg =

微信小程序實現圖片同時上傳的方法

地址 complete 就是 name func pre files success fun 對於微信小程序上傳圖片其實很麻煩的,每次只能上傳一張,所有很多朋友就會問想要多張圖片上傳怎麽辦?這裏使用遞歸,當上傳完一張圖片後重新執行這個函數,直到所有的圖片都上傳完成後,就不再

ps圖片合在一起

1.開啟需要和的兩張圖片 2.把人物圖用移動工具放在背景圖上,調整好位置。   3.在任務圖上增加蒙版   4.選擇漸變工具,將前景色改為白色,背景色設為黑色,從下拉到上面   5.選擇畫圖工具,不透明度設為20%-30%,將流量改為30%,反覆塗抹人物

uni-app圖片壓縮轉base64位 利用遞歸來實現圖片壓縮

form raw zip nbsp trunc ucc 1.9 兩個文件 gettime //選擇圖片 chooseImage(){ let that =this uni.chooseImage({ sizeType: [‘original‘,‘c

uni-app圖片壓縮轉base64位 利用遞迴來實現圖片壓縮

//選擇圖片 chooseImage(){ let that =this uni.chooseImage({ sizeType: ['original','compressed'], //可以指定是原圖還是壓縮圖,預設二者都有 count: 9,//預設9 suc