javascript - 如何将旋转的 Canvas 元素保存到文件中

标签 javascript html5-canvas transform

我正在尝试旋转大图像并将其另存为文件。我尝试了几种方法,但由于图像尺寸过大而失败。 (OpenCV、Paint Shop Pro 等)。

所以,我正在尝试用 javascript 来做到这一点。我可以将图像绘制到旋转的 Canvas 上(这有效),但是当我尝试将 Canvas 保存到文件时,旋转会丢失。发生这种情况是有道理的,但想了解如何在保存之前捕获/提取 Canvas 的旋转状态?

客户端代码:

<!DOCTYPE html>
<html>
    <head>
        <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
        <script>
            function initPage() {
                var imageObj = new Image();
                imageObj.onload = function() {
                    // Draw onto rotated canvas
                    var canvas = document.getElementById('mapCanvas');
                    context = canvas.getContext('2d');
                    context.drawImage(imageObj, 0, 0);

                    // Save image as png
                    var dt = canvas.toDataURL('image/png');
                    $.ajax({
                      type: "POST",
                      url: "savePNG.php?file=FN617_ROT",
                      data: { 
                         imgBase64: dt
                      }
                    }).done(function(o) {
                      console.log('saved'); 
                    });

                };  
                imageObj.src = 'FN617.png';
            }
        </script>

        <style>
            body {
                margin: 0;
                padding: 0;
            }
            #mapCanvas {
                transform-origin:center center;
                transform: rotate(-32.5deg);
            }
        </style>       
    </head>

    <body onload="initPage();">
        <canvas id="mapCanvas" width="9600" height="7200"></canvas>
    </body> 
</html>

服务器代码:

<?php
    $base64 = str_replace('data:image/png;base64,', '', $_REQUEST['imgBase64']);
    $data = base64_decode($base64);
    file_put_contents(dirname(__FILE__)."/". $_GET['file'].".png", $data);
?>

最佳答案

当您捕获 Canvas 时,您捕获的是位图,而不是元素。 CSS 仅影响元素 - 与普通图像一样,旋转它实际上不会以任何方式改变原始图像。

为了正确执行此操作,请首先删除 CSS 旋转。

然后使用上下文的转换方法应用旋转。请注意,CSS 默认情况下围绕中心旋转。 Canvas 不是按左上角旋转的,所以我们需要先平移。

步骤如下:

// translate to center where the rotation will take place:
context.translate(context.canvas.width * 0.5, context.canvas.height * 0.5);

// rotate (uses radians)
context.rotate = -32.5 * 180 / Math.PI;

// translate back as image is drawn from (0,0)
context.translate(-context.canvas.width * 0.5, -context.canvas.height * 0.5);

// draw image
context.drawImage(imageObj, 0, 0);

或者,如果图像与 Canvas 的大小不对应,则使用图像的大小进行向后转换。

context.translate(context.canvas.width * 0.5, context.canvas.height * 0.5);
context.rotate = -32.5 * 180 / Math.PI;
context.drawImage(imageObj, -imageObj.width * 0.5, -imageObj.height * 0.5);

现在您可以使用旋转图像捕获 Canvas 。

请注意,这种大小的 Canvas 可能无法在所有浏览器中工作,如果可以,则可能不允许您捕获它的 data-uri,因为某些浏览器对此有大小限制。只是需要记住一些事情..

关于javascript - 如何将旋转的 Canvas 元素保存到文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29214654/

相关文章:

JavaScript 已禁用

javascript - Javascript 中的静态变量只设置一次

javascript - 将 promise 转换为等待调用时为 "await is a reserved word"

html5-canvas - 设置 Alpha channel 时移动设备上的 html5 Canvas 像素操作问题

python Pandas : groupby on two columns and create new variables

javascript - 我应该如何放置一个函数来 react native 开关?

javascript - 使用 Three.js 在对象上绘画

jquery - 哪些网络技术可用于创建动态动画?特别是这些效果是如何产生的?

java - 如何将我的切换按钮值转换为 int

python - 'AFFINE' 未定义 PIL python