1. 程式人生 > >通過canvas獲取file照片,並旋轉正確角度

通過canvas獲取file照片,並旋轉正確角度

在微信開發裡會遇到file ,

通常都是獲取file 圖片的base64 ,判斷照像的角度並做出調整。

然後後canvas來旋轉圖片。生成最終base64

再用截圖或什麼。

1、獲取file base64

document.getElementById("id_file1").onchange=change;
    function change(){			
		if($("#id_file1").val() !=""){
			var fi=document.getElementById("id_file1").files[0];
			//alert(fi.name);
        	$("#p_output").append('files<br>');        	
        	if(!/image\/\w+/.test(fi.type)){
        		alert('請選擇圖片');
        		return ;
        	}     
        	var size=(fi.size/1024).toFixed(2);
        	//alert(size);
        	$("#p_output").append(size+'<br>');    
        	if(size>2000){
        		//$("#p_output").append(size);        		
        	}        	
        	Main.filereader(fi,function(w,h,img){
        		W=w;
        		H=h;
        		$("#p_output").append('filereader onload<br>')
        		img_crop.attr('src',img.src);  
        		EXIF.getData(img, function() {		
        			$("#p_output").append('exifdata onload<br>')
					var a=EXIF.getAllTags(this).Orientation;
					$("#p_output").append(a+'<br>')					
					Main.tation=a;					
					if(a==1 || a==undefined){
						cropper();
					}else{
						setrotatecanvas(w,h,1,img,function(){							
						    cropper();
					    })
					}					
				});     		
        	});
        }
	}
繫結file change事件,

裡判斷圖片型別和其他的操作。通過FillReader獲取base64

在onload裡建立image圖片物件在成功裡執行回撥,把img 物件  w ,h 傳遞。

在回撥內通過EXIF來獲取Img物件的角度,1 或undefined為不需要旋轉

通過setrotatecanvas來旋轉引數為:img =

Main.filereader=function(fi,call){
	var reader=new FileReader();    
    reader.onload=function(e){
    	$("#p_output").append('reader onload<br>')
        loadimg(this.result);
    };
    reader.readAsDataURL(fi);
    function loadimg(base){
    	var img=new Image();
    	img.src=base;
        if(img.complete){
    		load(img.width,img.height,img);
    	}else{
    		img.onload=function(){    			
    		    load(img.width,img.height,img);
    	   };
    	}    	
    }
    function load(w,h,img){
    	$('#p_output').append('img onload<br>')
    	call(w,h,img);
    }    
};
setrotatecanvas內建立canvas 設定縮放後w h  通過drawImage方法來實現縮放

引數:img  擷取位置x0 擷取位置y0 擷取大小w h  生成位置x y w h

在drawToFinal內實現旋轉。

6表示順時針旋轉90度

rotate(0.5 * Math.PI);//旋轉90

8表示逆時針旋轉90度

rotate(-0.5 * Math.PI);//旋轉90

3表示順時針旋轉180度

rotate(1 * Math.PI);

旋轉完後用toDataURL生成base64  這是最終的獲取到的結果

function setrotatecanvas(w,h,scale,img,call){
		var tempCanvas = document.createElement("canvas");
		var tempContext = tempCanvas.getContext("2d");
		var sw=parseFloat(w/scale)
		var sh=parseFloat(h/scale)
		tempCanvas.width=sw;
		tempCanvas.height=sh;
		tempContext.drawImage(img,0,0,w,h,0,0,sw,sh);        
        var newCanvas=document.createElement('canvas');
        var newContent=newCanvas.getContext('2d');  
        $("#p_output").append('setrotatecanvas onload<br>')
        drawToFinal(tempCanvas,newCanvas,newContent,sw,sh,Main.tation,call);       
}
    /*
	 *使用的canvas  本canvas 本context  源cawidth 源caheight 角度   回撥
	 */
function drawToFinal(_sourceCanvas, _drawCanvas, _drawContext, _sw, _sh, _Orientation,call) {
		switch(_Orientation){
			case 6:
			    //圖片需要x軸右方  y軸的左方旋轉90deg;  原本的寬現在成高了原本的高成寬了
			    _drawCanvas.width=_sh;
			    _drawCanvas.height=_sw;
			    var tSetting = {
					dx: 0,
					dy: 0,
					dw: 0,
					dh: 0,
					transX: 0,
					transY: 0
				};
				tSetting.dw = _sh;//顯示在canvas上的寬
				var scale2 = _sw / _sh;
			    tSetting.dh = parseFloat(tSetting.dw / scale2);//算出顯示在canvas上的高
				tSetting.dy = (_sw - tSetting.dh) / 2;//顯示在canvas上的y
				tSetting.transY = _sw / 2;
				tSetting.transX = _sh / 2;
				_drawContext.translate(tSetting.transX, tSetting.transY);//先平衡 寬高一半
				_drawContext.rotate(0.5 * Math.PI);//旋轉90
				//_drawContext.rotate(50*Math.PI/180);
				_drawContext.scale(scale2, scale2);//縮放
				//原canvas 影象擷取0 0 擷取 w h 顯示的x  顯示的y  顯示出來的w  h
				_drawContext.drawImage(_sourceCanvas, 0, 0, _sw, _sh,
					tSetting.dx - tSetting.transX, tSetting.dy - tSetting.transY,
					tSetting.dw, tSetting.dh);
				break;
			case 8:
			    //圖片需要x軸左方  y軸的右方旋轉90deg  
			    _drawCanvas.width = _sh;
				_drawCanvas.height = _sw;
				var tSetting = {
					dx: 0,
					dy: 0,
					dw: 0,
					dh: 0,
					transX: 0,
					transY: 0
				};
				tSetting.dw = _sh;
				var scale2 = _sw / _sh;
				tSetting.dh = parseFloat(tSetting.dw / scale2);
				tSetting.dy = (_sw - tSetting.dh) / 2;
				tSetting.transY = _sw / 2;
				tSetting.transX = _sh / 2;
				_drawContext.translate(tSetting.transX, tSetting.transY);
				_drawContext.rotate(-0.5 * Math.PI);
				_drawContext.scale(scale2, scale2);
				_drawContext.drawImage(_sourceCanvas, 0, 0, _sw, _sh, tSetting.dx - tSetting.transX, tSetting.dy - tSetting.transY, tSetting.dw, tSetting.dh);
				
			    break;
			case 3:
			    //180向左旋轉 (右旋轉也可以。)  
				_drawCanvas.width = _sw;
				_drawCanvas.height = _sh;
				var tSetting = {
					dx: 0,
					dy: 0,
					dw: 0,
					dh: 0,
					transX: 0,
					transY: 0
				};
				tSetting.dw = _sw;
				tSetting.dh = _sh;
				tSetting.transY = _sh / 2;
				tSetting.transX = _sw / 2;
				_drawContext.translate(tSetting.transX, tSetting.transY);
				_drawContext.rotate(1 * Math.PI);
				//_drawContext.scale(scale2,scale2);  
				_drawContext.drawImage(_sourceCanvas, 0, 0, _sw, _sh, tSetting.dx - tSetting.transX, tSetting.dy - tSetting.transY, tSetting.dw, tSetting.dh);
				break;
		}
        var base64 = _drawCanvas.toDataURL('image/jpg');
        $("#id_img1").attr('src', base64)
        $("#p_output").append('drawToFinal onload<br>')
        call();
}

旋轉真理:

先移動開始點到canvas的中心,然後旋轉。

之後需要找到開始點的位置,相對於cavnas。

左右旋轉90 移動x 為-canvas.h/2  移動y 為-canvs.w/2

旋轉180 移動x y 分別為cavnas w h 的負一半

右轉90開始點需要和canvas右上角位置一樣

左轉90開始點需要和canvas左下角位置一樣

轉190開始點需要和canvas 右下角位置一樣

相關推薦

通過canvas獲取file照片旋轉正確角度

在微信開發裡會遇到file , 通常都是獲取file 圖片的base64 ,判斷照像的角度並做出調整。 然後後canvas來旋轉圖片。生成最終base64 再用截圖或什麼。 1、獲取file base64 document.getElementById("id_file

通過JS獲取前臺資料向後臺一般處理程式傳遞

function AddTeachCourse() { //取得教師ID var strTeacherID = $("#hidFieldSaveTeacherID").val(); //alert("教師ID="+txtTeacherID); //取得課程ID var s

Spark Streaming從Kafka中獲取數據進行實時單詞統計統計URL出現的次數

scrip 發送消息 rip mark 3.2 umt 過程 bject ttr 1、創建Maven項目 創建的過程參考:http://blog.csdn.net/tototuzuoquan/article/details/74571374 2、啟動Kafka A:安裝ka

layui基本使用(動態獲取數據把需要的數據傳到新打開的窗口)

拉伸 窗口 動態獲取 賬單 遮罩 跳轉 透明度 -c resize <div class="xiaoxi">\n‘ + ‘ <div class="layui-row">\n‘ + ‘ <input type="

eNSP中的路由器通過遠程連接分析數據包

通過抓包分析路由器遠程連接1)先在華為模擬器上新建一個拓撲:2)分別在AR4和AR3上的GE 0/0/2上配置IP地址,並標識出對應的IP地址。配置IP的命令如下:system-view //進入系統視圖interface GigabitEthernet 0/0/2 //進入端口GE 0/0/2undo

java通過Linux獲取命令信息顯示出來

用戶 com username rac blog RoCE host end jsch 代碼如下: package test; import java.io.*; import java.nio.charset.Charset; import java.util.Prop

linux-c獲取utc時間轉為BCD碼格式

原始碼: #include <stdio.h> #include <stdlib.h> #include <time.h> #include <math.h> void UtcBcdTime(char* utc_buf) {

搭建自己的部落格(二十二):通過ajax提交評論資訊增加公式編輯功能

編輯功能使用到了ckeditor的MathJax元件。ajax提交評論可以不用重新整理瀏覽器。 1、變化的部分 2、上程式碼: ul.blog-types,ul.blog-dates { list-style-type: none; } div.blog:no

android-手機登入介面嘗試獲取手機號碼可選擇雙卡雙待subscriptionId

LogonActivity.java public class LogonActivity extends Activity { private EditText nickET; private EditText passwordET; private E

仿趣頭條獲取系統通訊錄自定義通訊錄介面

我們有個專案 需求要做一個方趣頭條的獲取通訊錄的要求,在此期間,對搜尋欄和邊欄首字母檢索,有些陌生,踩了一些坑。 先來看效果 首先是獲取系統通訊錄,在iOS9之後,iOS對通訊錄的庫有了很大的改善。用起來很方便,但是點要注意在引用 #import <ContactsUI/Conta

使用JDBC獲取資料庫資料生成json格式檔案(省市區三級聯動)

前言: 轉眼已經2018年了, 17年有點忙,出差將近三個月,部落格也停更了好久。 一直都是不停的修復bug,和做一些業務需要的提示和互動。主要是因為和硬體有關係所以比較麻煩,開發週期也很長,而且還不穩定,硬體先行,然後在是除錯,互動。不過也有好處,學到的東西自然不是簡簡單單的 程式碼了。

利用pyrealsense獲取深度圖進行畫素對齊

系統:Ubuntu16.04 python版本:python2.7 核心版本:4.13.0 realsense SDK:librealsense1.12.1 python wrapper:pyrealsense2.2 這裡的pyrealsense2.2指的是pyrealsense

Android studio中檢視Device File Explorer使用sqlit3對資料庫進行操作

首先確保手機與電腦進行連線,手機屬於開發者模式。開啟Android studio找到view,點選view找到“Tool Windows ”,將滑鼠指向“Tool Windows”後找到"Device File Explorer".點選後就可以進行檢視。若想對其中的sqlit

Android——通過GPS獲取使用者地理位置監聽位置變化

這個功能挺簡單的,最近用到了就總結下: 1、開啟地理位置監聽: /* * 開啟地理位置監聽 */ public void registerGpsListener(Context context) { Log

iOS 獲取當前時間按照要求格式顯示

寫一個常用的獲取當前日期,時間的程式碼。並且能以規定的格式顯示出來 1 2 3 4 5 NSDate *currentDate = [NSDate date];//獲取當前時間,日期 N

bat 獲取系統時間去掉時間小時前面的空格

有時候我們需要獲取當前系統的時間,如果小時小於10的話,獲取小時會出現空格的情況: c:\>time 當前時間: 8:52:38.05 c:\>echo %time:~0,2% 8 ------這個8前面是有空格的 c:\>

Android 通過httpclient請求web伺服器解決使用者登入session保持

package com.rainet.tiis.network; import java.util.Iterator; import java.util.List; import java.util.Map; import org.apache.http.HttpRes

c++/c獲取系統時間格式化輸出

話說最難消受美人恩,女士的要求是很難拒接的。。。 應一女士要求,幫其實現個小程式。要求c/c++獲取系統時間,並以中文格式化輸出。 第一反應,so簡單。 話說函式: 1、size_t strftime( char *strDest, size_t maxsize, const

js實現獲取當前時間一直重新整理

<!DOCTYPE html> <html> <head> <script src="/jquery/jquery-1.11.1.min.js"><

網頁獲取訪問IP解析地址

 jsp網頁 <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html PUBLIC "-//W3C/