通過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(); }) } }); }); } }
裡判斷圖片型別和其他的操作。通過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); } };
引數: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/