Rotate image and fit show use canvas
Description
In the field of image processing, We always to show image after modified the image raw data.It is very easy with using c, c++ and other compiled programming language. But, if you use the interpreted programming language like javascript. i think it will maybe more complicated.But, We always can find work way.
The below code is not all, Just some code snippet.
Code snippet
Here rotation ways use the temporary variable to storage temporary image every rotated. before rotatetion, should use src image.
var RotateImg = {
srcImg:"", // storage src img path, when you begin to rotate every time, you should use src image that can reduce the error of each roataiton
tmpImg:"", // storage temp image oath after rotated src image.
};
/** Use the canvas to rotate image raw data to show */
RotateImg.rotate = function(nAngle)
{
var Img = new Image();
Img.addEventListener("load",function(){
var imgW = Img.width;
var imgH = Img.height;
var cvs = document.createElement("canvas");
var context = cvs.getContext( "2d" );
var degree = nAngle * Math.PI / 180;
switch ( nAngle )
{
case 0://Clockwise 0
cvs.width = imgW;
cvs.height = imgH;
context.drawImage( Img, 0, 0, imgW, imgH );
break;
case 90://Clockwise 90
cvs.width = imgH;
cvs.height = imgW;
context.rotate( degree );
context.drawImage( Img, 0, -imgH, imgW, imgH );
break;
case 180://Clockwise 180
cvs.width = imgW;
cvs.height = imgH;
context.rotate( degree );
context.drawImage( Img, -imgW, -imgH, imgW, imgH );
break;
case 270://Clockwise 270
cvs.width = imgH;
cvs.height = imgW;
context.rotate( degree );
context.drawImage( Img, -imgW, 0, imgW, imgH );
break;
}
/** jpeg level [0,1] */
var dataBase64 = cvs.toDataURL( "image/jpeg", 0.8 );
/** remove base64 description information before image data.---->data:image/png;base64,iVBORw0KG... */
dataBase64 = dataBase64.split( "," )[1];
dataBase64 = window.atob( dataBase64 );
var ia = new Uint8Array( dataBase64.length );
for ( var i = 0; i < dataBase64.length; i++ ) {
ia[i] = dataBase64.charCodeAt( i );
};
var blob = new Blob( [ia], {type:"image/jpeg"} );
/** storage temp image path in member */
RotateImg.tmpImg = window.URL.createObjectURL( blob );
RotateImg.showImg(RotateImg.tmpImg);
},false);
Img.src = RotateImg.srcImg;
};
Here another rotation ways not use the temporary variable, Just use the src. This way is more complex.
RotateImg.rotateExampleImage = function( nAngle )
{
imgLoaded = true;
var img = new Image();
img.onload = function()
{
var imgW = img.width;
var imgH = img.height;
var degree = nAngle * Math.PI / 180;
var cvs = document.getElementById( "canvas" );
var context = cvs.getContext( "2d" );
switch ( nAngle )
{
case 0://Clockwise 0
var xyImgScale = imgW / imgH;
var xyCanvasScale = cvs.width / cvs.height;
var finalHeight = 0;
var finalWidth = 0;
if( xyImgScale >= xyCanvasScale ) {
finalWidth = cvs.width * 1;
finalHeight = finalWidth / xyImgScale;
} else {
finalHeight = cvs.height * 1;
finalWidth = finalHeight * xyImgScale;
}
var xPos = ( cvs.width - finalWidth ) / 2;
var yPos = ( cvs.height - finalHeight ) / 2;
var maxV = cvs.width > cvs.height ? cvs.width : cvs.height;
context.clearRect( -maxV, -maxV, 2*maxV, 2*maxV );
context.rotate( degree );
context.drawImage( img, 0, 0, imgW, imgH, xPos, yPos,finalWidth, finalHeight );
context.rotate( -degree );
break;
case 90://Clockwise 90
var xyImgScale = imgW / imgH;
var xyCanvasScale = cvs.height / cvs.width;
var finalHeight = 0;
var finalWidth = 0;
if( xyImgScale >= xyCanvasScale ) {
finalWidth = cvs.height * 1;
finalHeight = finalWidth / xyImgScale;
} else {
finalHeight = cvs.width * 1;
finalWidth = finalHeight * xyImgScale;
}
var xPos = ( cvs.height - finalWidth ) / 2;
var yPos = ( cvs.width - finalHeight ) / 2;
var maxV = cvs.width > cvs.height ? cvs.width : cvs.height;
context.clearRect( -maxV, -maxV, 2*maxV, 2*maxV );
context.rotate( degree );
context.drawImage( img, 0, 0, imgW, imgH, xPos, yPos-cvs.width , finalWidth,finalHeight );
yPos = yPos-cvs.width;
context.rotate( -degree );
break;
case 180://Clockwise 180
var xyImgScale = imgW / imgH;
var xyCanvasScale = cvs.width / cvs.height;
var finalHeight = 0;
var finalWidth = 0;
if( xyImgScale >= xyCanvasScale ) {
finalWidth = cvs.width * 1;
finalHeight = finalWidth / xyImgScale;
} else {
finalHeight = cvs.height * 1;
finalWidth = finalHeight * xyImgScale;
}
var xPos = ( cvs.width - finalWidth ) / 2;
var yPos = ( cvs.height - finalHeight ) / 2;
var maxV = cvs.width > cvs.height ? cvs.width : cvs.height;
context.clearRect( -maxV, -maxV, 2*maxV, 2*maxV );
context.rotate( degree );
context.drawImage( img, 0, 0, imgW, imgH, xPos-cvs.width, yPos-cvs.height,finalWidth, finalHeight );
context.rotate( -degree );
break;
case 270://Clockwise 270
var xyImgScale = imgW / imgH;
var xyCanvasScale = cvs.height / cvs.width;
var finalHeight = 0;
var finalWidth = 0;
if( xyImgScale >= xyCanvasScale ) {
finalWidth = cvs.height * 1;
finalHeight = finalWidth / xyImgScale;
} else {
finalHeight = cvs.width * 1;
finalWidth = finalHeight * xyImgScale;
}
var xPos = ( cvs.height - finalWidth ) / 2;
var yPos = ( cvs.width - finalHeight ) / 2;
var maxV = cvs.width > cvs.height ? cvs.width : cvs.height;
context.clearRect( -maxV, -maxV, 2*maxV, 2*maxV );
context.rotate( degree );
context.drawImage( img, 0, 0, imgW, imgH, xPos-cvs.height, yPos, finalWidth,finalHeight );
context.rotate( -degree );
break;
}
};
img.src = RotateImg.srcImg;
}
Fit show image in view rect center
RotateImg.showImg = function( imgSrc )
{
var img = new Image();
var loaded = false;
function loadHandler() {
if (loaded) {
return;
}
loaded = true;
/** core code for fit view rect to show image */
var imgW = img.width;
var imgH = img.height;
var xyImgScale = imgW / imgH;
var mycvs = document.getElementById( "canvas" );
var xyCanvasScale = mycvs.width / mycvs.height;
var finalHeight = 0;
var finalWidth = 0;
if( xyImgScale >= xyCanvasScale ){
finalWidth = mycvs.width * 1;
finalHeight = finalWidth / xyImgScale;
}else{
finalHeight = mycvs.height * 1;
finalWidth = finalHeight * xyImgScale;
}
var xPos = ( mycvs.width - finalWidth ) / 2;
var yPos = ( mycvs.height - finalHeight ) / 2;
var context = mycvs.getContext( "2d" );
context.clearRect( 0, 0, mycvs.width, mycvs.height );
context.drawImage( img, 0, 0, img.width, img.height, xPos, yPos,finalWidth, finalHeight );
}
img.addEventListener('load', loadHandler);
img.addEventListener('error', function(event){
//alert("error:");
});
img.src = imgSrc;
if (img.complete) {
loadHandler();
}
};
Reference
Rotate image and fit show use canvas的更多相关文章
- html5 canvas 绘制太极图
<div class="container"> <canvas id="myCanvas" width="400" hei ...
- 讲解Canvas中的一些重要方法
Canvas所提供的各种方法根据功能来看大致可以分为几类: 第一是以drawXXX为主的绘制方法: 第二是以clipXXX为主的裁剪方法: 第三是以scale.skew.translate和rotat ...
- html 5 canvas 绘制太极demo
一个练习canvas的小案例.其中若有小问题,欢迎大神拍砖……^_* 代码效果预览地址:http://code.w3ctech.com/detail/2500. <div class=" ...
- 转载爱哥自定义View系列--Canvas详解
上面所罗列出来的各种drawXXX方法就是Canvas中定义好的能画什么的方法(drawPaint除外),除了各种基本型比如矩形圆形椭圆直曲线外Canvas也能直接让我们绘制各种图片以及颜色等等,但是 ...
- canvas图表详解系列(2):折线图
本章建议学习时间4小时 学习方式:详细阅读,并手动实现相关代码(如果没有canvas基础,需要先学习前面的canvas基础笔记) 学习目标:此教程将教会大家如何使用canvas绘制各种图表,详细分解步 ...
- 基于canvas的电子始终
//code <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <ti ...
- canvas旋转文本
canvas旋转文本 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...
- 大家都能看懂的 canvas基础教程
原文链接: http://www.shitu91.com/cms/canvasSub/index.html 01.canvas简单的认识 canvas 是html5提供给我们的一个绘图标签 默认大小 ...
- Canvas的flag具体的含义
示例代码: package com.loaderman.customviewdemo; import android.content.Context; import android.graphics. ...
随机推荐
- c++ istringstream的用法
一.测试代码 istringstream 是将字符串变成字符串迭代器一样,将字符串流在依次拿出,比较好的是,它不会将空格作为流.这样就实现了字符串的空格切割. #include<iostream ...
- Js 实战3(实现全选)
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default4.aspx.cs ...
- PDO exec 执行时出错后如果修改数据会被还原?
PDO exec 执行时出错后如果修改数据会被还原? 现象 FastAdmin 更新了 1127 版本,但是使用在线安装方式出现无法修改管理员密码的问题. 一直是默认的 admin 123456 密码 ...
- 由spring的工厂构造bean想到的
被Spring管理的bean可以是直接创建实例,还可以通过工厂模式来进行创建.例如brave的tracing bean定义: <bean id="tracing" class ...
- rabbitMQ应用,laravel生产广播消息,springboot消费消息
最近做一个新需求,用户发布了动态,前台需要查询,为了用户读取信息响应速度更快(MySQL很难实现或者说实现起来很慢),所以在用户动态发布成功后,利用消息机制异步构建 redis缓存 和 elastic ...
- 02 - Unit04:笔记本加载功能
@ExceptionHandler 在控制器中统一处理异常. 为了重用异常处理方法,可以将处理方法抽象到父类中,子类共享异常处理方法. 语法: @ExceptionHandler(Exception. ...
- Java-Runoob-高级教程-实例-字符串:05. Java 实例 - 字符串反转
ylbtech-Java-Runoob-高级教程-实例-字符串:05. Java 实例 - 字符串反转 1.返回顶部 1. Java 实例 - 字符串反转 Java 实例 以下实例演示了如何使用 J ...
- Train-Alypay-Cloud:蚂蚁大数据平台培训开课通知(第三次)- 培训笔记3(机器学习平台)
ylbtech-Train-Alypay-Cloud:蚂蚁大数据平台培训开课通知(第三次)- 培训笔记3(机器学习平台) 机器学习平台 一站式可视化机器学习 https://pai.cloud.ali ...
- app crawler1
app crawler简介 执行 java -jar appcrawler-2.1.3.jar 查看相关参数 -a, --app Android或者iOS的文件地址, 可以是网络地址, 赋值给appi ...
- 设置putty标题栏显示固定信息
设置好后,登录服务器后,发现标题栏又显示root@sit:/opt/ihome,没有显示成我设置的title内容.原因是: 在Terminal->Features中一定要勾选Disable re ...