javascript - How can I rotate a Canvas containing an Image by 90, 180, 270 Degrees? - Stack Overflow

I have an HTML5 canvas which contains an image. Now I want to rotate this canvas by x degrees.What I di

I have an HTML5 canvas which contains an image. Now I want to rotate this canvas by x degrees.

What I did was:

function getRadianAngle(degreeValue) {
    return degreeValue * Math.PI / 180;
} 

var rotateCanvas = function(canvas, image, degrees) {
  var context = canvas.getContext('2d');
  context.rotate(getRadianAngle(degrees));
  context.drawImage(image, 0, 0);
  return canvas;            
}

var image = new Image();
image.onload = function() {
   var canvas = document.createElement("canvas");
   var context = canvas.getContext('2d');
   var cw = canvas.width = image.width;
   var ch = canvas.height = image.height;
   context.drawImage(image, 0, 0, image.width, image.height);

   rotateCanvas(canvas, image, 180);
}
image.src = // some image url;

This code does not work correctly.

How can I define a rotate function to rotate a canvas?

Edit: I do not want to use css because I need the canvas for further processing.

I have an HTML5 canvas which contains an image. Now I want to rotate this canvas by x degrees.

What I did was:

function getRadianAngle(degreeValue) {
    return degreeValue * Math.PI / 180;
} 

var rotateCanvas = function(canvas, image, degrees) {
  var context = canvas.getContext('2d');
  context.rotate(getRadianAngle(degrees));
  context.drawImage(image, 0, 0);
  return canvas;            
}

var image = new Image();
image.onload = function() {
   var canvas = document.createElement("canvas");
   var context = canvas.getContext('2d');
   var cw = canvas.width = image.width;
   var ch = canvas.height = image.height;
   context.drawImage(image, 0, 0, image.width, image.height);

   rotateCanvas(canvas, image, 180);
}
image.src = // some image url;

This code does not work correctly.

How can I define a rotate function to rotate a canvas?

Edit: I do not want to use css because I need the canvas for further processing.

Share Improve this question edited Jun 3, 2014 at 0:53 Michael asked Jun 2, 2014 at 23:19 MichaelMichael 33.3k50 gold badges223 silver badges374 bronze badges
Add a ment  | 

1 Answer 1

Reset to default 9

Rotating the canvas can be done with CSS, but that might mess up your page design if the canvas is rectangular rather than square.

It's probably better to rotate your image on the canvas.

  • Clear the existing canvas.
  • Translate to the rotation point--x=image.x+image.width/2,y=image.y+image.height/2.
  • Rotate.
  • drawImage(image,-image.width/2,-image.height/2

Example code and a Demo: http://jsfiddle/m1erickson/8uRaL/

BTW, the radians for your desired angles are:

  • 0 degrees == 0 radians
  • 90 degrees == Math.PI/2 radians
  • 180 degrees == Math.PI radians
  • 270 degrees == Math.PI*3/2 radians

Example code:

<!doctype html>
<html>
<head>
<link rel="stylesheet" type="text/css" media="all" href="css/reset.css" /> <!-- reset css -->
<script type="text/javascript" src="http://code.jquery./jquery.min.js"></script>
<style>
    body{ background-color: ivory; }
    canvas{border:1px solid red;}
</style>
<script>
$(function(){

    var canvas=document.getElementById("canvas");
    var ctx=canvas.getContext("2d");

    var radians=0;

    var img=new Image();
    img.onload=start;
    img.src="https://dl.dropboxusercontent./u/139992952/stackoverflow/cat.png";
    function start(){
        animate();
    }


    function animate(){
        requestAnimationFrame(animate);
        ctx.clearRect(0,0,canvas.width,canvas.height);
        ctx.save();
        ctx.translate(canvas.width/2,canvas.height/2);
        ctx.rotate(radians);
        ctx.drawImage(img,-img.width/2,-img.height/2);
        ctx.restore();
        radians+=Math.PI/180;
    }


}); // end $(function(){});
</script>
</head>
<body>
    <canvas id="canvas" width=300 height=300></canvas>
</body>
</html>

发布者:admin,转转请注明出处:http://www.yc00.com/questions/1741612537a4356538.html

相关推荐

  • 谷歌没有闭源,但正把安卓变得“能看不能摸”

    编辑 | Tina谷歌计划对开发新版 Android 操作系统的方式进行重大变革。在许多人眼中,Android 的开源属性正是选择这款系统的关键理由之一——三星等 OEM 厂商通过对 One UI 等皮肤版本的代码进行自主调整;而密切关

    2小时前
    00
  • “以用户为中心”持续赋能一线

    作者 | 中国工商银行软件开发中心 背景 在数字化转型的大背景下,中国工商银行软件开发中心围绕“数字工行”发展目标,积极推动研发管理领域的数字化转型,按触点整合、服务聚合、运营融合的整体思路,围绕用户导向,稳步推进工具体系能力整合,

    2小时前
    00
  • 鸿蒙开发:动态添加节点

    前言本文基于Api13做过Android的同学都知道,我们可以拿到任意一个容器组件,比如LinearLayout或者RelativeLayout,或者其他容器视图,我们都可以进行自由的添加子组件,方便我们去处理一些子元素动态变化的场景,然而

    2小时前
    00
  • OpenAI最新官宣:Agent SDK支持MCP协议

    机器之心编辑部OpenAI 也开始支持 MCP 了。这条消息由奥特曼亲自官宣:「人们非常喜欢 MCP,我们也很高兴在我们的产品中增加对它的支持。今天我们已经在 Agent SDK 中支持 MCP,对 ChatGPT 桌面应用以及 Respo

    1小时前
    10
  • 我们绝不存储用户聊天记录!(第47讲)

    《架构师之路:架构设计中的100个知识点》47.信息安全传输想和ta聊一些私密的话,一方面:1. 必须保证传输安全,传输内容如何不被黑客窥探?2. 必须保证存储安全,存储内容如何不泄露?先聊第一个问题,信息安全传输方法与思路。一、初级阶段:

    1小时前
    10
  • 从架构创新到多模态探索,MiniMax如何为国产AI持续赋能?

    2025年刚过,中国AI技术在国际舞台上持续闪耀,国产开源模型的集体爆发成为行业焦点。实际上在DeepSeek的开源模型爆火之前,中国的另一家公司MiniMax的MiniMax-01模型就已经发布和开源。目前MiniMax,与DeepSee

    1小时前
    00
  • 开源Python项目:票据设计打印工具

    1 简介大家好我是费老师,市面上的开源票据设计&打印类项目层出不穷,对应所使用到的技术栈也不尽相同。而今天要给大家分享的开源票据设计&打印工具「Dash-Web-Print」,其非常新颖的完全基于Python技术栈实现了前端

    1小时前
    00
  • 做定时任务,一定要用这个神库!!

    Hey, 我是 沉浸式趣谈本文首发于【沉浸式趣谈】,我的个人博客也同步更新。转载请在文章开头注明出处和版权信息。如果本文对您有所帮助,请 点赞、评论、转发,支持一下,谢谢!说实话,作为前端开发者,我们经常需要处理一些定时任务,比如轮询接

    1小时前
    10
  • 谁是 AI 搜索先锋? Elastic 先锋者招募令正式启动!

    在人工智能(正文简称“AI”)技术深刻重构全球产业生态的当下,AI 搜索技术正以革新性力量驱动千行万业智能化跃迁。值此技术变革关键节点,业界领先的搜索分析引擎 Elasticsearch 也迎来了自己 15 年的里程碑,Elastic 公司

    1小时前
    00
  • 国产开源的文档转换器:MinerU

    简介MinerU是由OpenDataLab团队打造的大模型时代的文档提取转换神器支持PDF、Word、PPT等多种文档的智能解析,可用于机器学习、大模型语料生产、RAG等场景特点多语种支持多类型支持导出格式为json markdown客户

    1小时前
    00
  • Mac中磁盘没有被推出,因为一个或多个程序可能正在使用它解决方法

    今天将相机的文件导到 mac 电脑上进行备份,导出完了之后推出磁盘的时候提示被占用了,以前在 windows 下也遇到过同样的问题,一般都是因为某个关联的程序没有彻底关闭对磁盘文件的访问链接,初步推测今天可能是因为直接预览了几个不是视频的文

    1小时前
    00
  • Linux平台x86

    ​Linux SmartPlayerSDK背景Linux(含x86_64架构和aarch64架构)的RTSP|RTMP直播播放SDK,是大牛直播SDK发布的一款用于Linux平台的视频播放器开发库,支持多种视频流协议,旨在提供低延时的流媒体

    1小时前
    10
  • 揭开顺序表的神秘面纱,探索数据结构的精髓

    0.前言> 在数据结构的世界里,顺序表作为最基本的一种线性数据结构,广泛应用于各种场景。它通过连续的存储空间来存储元素,操作简单、效率高,是理解和掌握更复杂数据结构的基础。 本篇文章将带你深入了解顺序表的定义、特点以及常见操作,帮助你

    1小时前
    10
  • 【redis】集群 数据分片算法:哈希求余、一致性哈希、哈希槽分区算法

    什么是集群广义的集群,只要你是多个机器,构成了分布式系统,都可以称为是一个“集群”前面的“主从结构”和“哨兵模式”可以称为是“广义的集群”此处我们介绍的是狭义的集群,redis 提供的“集群模式”,主要是解决存储空间不足的问题(拓展存储空间

    1小时前
    10
  • C语言 —— 此去经年梦浪荡魂音

    1. sizeof 和 strlen的区别1.1 sizeof sizeof 计算变量所占内存内存空间大小的,单位是字节,如果操作数是类型的话,计算的是使用类型创建的变量所占内存空间的大小sizeof 只关注占⽤内存空间的大小,不在乎内存中

    1小时前
    00
  • 合合信息“TextIn大模型加速器 2.0”版本来了:文档解析和图表解析能力全面升级

    合合信息“TextIn大模型加速器 2.0”版本来了:文档解析和图表解析能力全面升级背景在日常工作中,我们常常遇到无法直接复制的文档内容或图片内容,这些内容通常需要进行识别和解析。一个典型的例子是,当我们需要将折线图转化为表格数据时,手动操

    26分钟前
    00
  • 鸿蒙开发:信息标记组件

    前言本文基于Api13信息标记,很是常见,比如手机桌面上的各种应用的右上角信息提示,微信的聊天中的消息未读提示等等,可以说非常常见。手机桌面消息提示:微信中的消息未读:如此常见的一个功能,在实际的开发中,我们应该如何来实现呢?当然了,实现方

    23分钟前
    00
  • Function Calling 执行流程和历史消息结构

    在 function calling(工具调用)的场景中,传递给大语言模型(LLM)的历史消息需要包含完整的对话上下文,包括用户输入、模型生成的工具调用请求(tool_calls),以及工具执行后的返回结果。以下是详细的格式说明和示例:核心

    14分钟前
    00
  • GENESIS框架的材料模型

    GENESIS框架与材料模型Genesis 的核心是全新设计的物理引擎,整合了多个物理求解器到统一框架中。在此基础上,我们添加了生成代理系统,用于自动化数据生成,特别适合机器人等领域的应用。 《什么是 Genesis》GENESIS中集成

    2分钟前
    00
  • OpenManus实战:如何用DeepSeek V3打造你的专属智能体?

    目前我把DeepSeek用在了构建超级智能体上。最近由于Manus的爆火,导致很多人开始关注Agent是否真的能够落地。同时,openai也自己发布了agent api,让人人都能够自己构建一个属于自己的Agent而在爆火的同时,不到3小时

    52秒前
    00

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信