首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >megapix绘制反转后在画布上的绘制

megapix绘制反转后在画布上的绘制
EN

Stack Overflow用户
提问于 2014-07-28 15:09:51
回答 2查看 571关注 0票数 0

我有一个页面,可以让你浏览一个图像,然后画它,并保存原始版本和注释版本。我正在利用megapix-image.js和exif.js来帮助正确呈现来自多个移动设备的图像。它的作用很大,除了在特定的方向。例如,在iPhone4s上拍摄的垂直照片被exif认为是方向6,并相应地被megapix图像翻转,因此它在画布上呈现得很好。出于某种原因,当我在之后画的时候,这幅画似乎被颠倒了。鼠标和触觉都是一样的。坐标在我看来是对的(这意味着它们匹配一个工作的水平图片和一个不工作的垂直图片),当megapix-image.js翻转它时,画布的高度和宽度也是如此。这让我相信这与背景有关,但老实说,我不太确定。我有一个JS小提琴的一部分,我的工作,以显示行为。只需从移动设备中浏览垂直拍摄的图片,或在移动设备上以垂直格式拍摄图片并使用它。我想所有的人都会表现出同样的行为。

最后的呈现如下所示:

代码语言:javascript
复制
        function RenderImage(file2) {

            if (typeof file2[0].files[0] != 'undefined') {

                EXIF.getData(file2[0].files[0], function () {

                    orientation = EXIF.getTag(this, "Orientation");

                    var file = file2[0].files[0];

                    var mpImg = new MegaPixImage(file);



                    var resCanvas1 = document.getElementById('annoCanvas');


                    mpImg.render(resCanvas1, {
                        maxWidth: 700,
                        maxHeight: 700,
                        orientation: orientation
                    });



                });

            }

        }

但真正的麻烦事在这里:

http://jsfiddle.net/awebster28/Tq3qU/6/

有人有什么线索给我吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-08 16:39:46

最后,我将另一个画布添加到我的html (名为"annoCanvas2")中,从而修复了这个问题。然后,我更新了megapix-image.js以包含这个函数,它将新画布的内容绘制成一个新的:

代码语言:javascript
复制
function drawTwin(sourceCanvas)
 {
  var id = sourceCanvas.id + "2";
  var destCanvas = document.getElementById(id);

  if (destCanvas !== null) {
    var twinCtx = destCanvas.getContext("2d");
     destCanvas.width = sourceCanvas.width;
    destCanvas.height = sourceCanvas.height;

    twinCtx.drawImage(sourceCanvas, 0, 0, sourceCanvas.width, sourceCanvas.height);
 }
}

然后,在第一个画布旋转、翻转和渲染之后,我将生成的画布呈现给我的“孪生画布”。然后我有了一个漂亮的画布,我的更新图像,然后我可以画和保存!

代码语言:javascript
复制
var tagName = target.tagName.toLowerCase();
 if (tagName === 'img') {
        target.src = renderImageToDataURL(this.srcImage, opt, doSquash);
 } else if (tagName === 'canvas') {
    renderImageToCanvas(this.srcImage, target, opt, doSquash);

   //------I added this-----------
   drawTwin(target);

}

我很高兴能把它修好,所以我在最后期限前完成了,但我仍然不知道我为什么要这么做。如果有谁能解释的话,我很想知道原因。

票数 0
EN

Stack Overflow用户

发布于 2014-07-29 11:07:44

如果您查看正在使用的库,就会看到一个transformCoordinate函数,用于在绘图前设置正确的转换。

而且他们不保存/恢复画布(boooo!)因此,这一转变仍将是明智的。

您的解决方案是执行lib应该做的事情:在呈现之前保存上下文,然后恢复它:

代码语言:javascript
复制
  function RenderImage(file2) {

              // ... same code ...

              var mpImg = new MegaPixImage(file);

               var eData = EXIF.pretty(this);

               // Render resized image into canvas element.
               var resCanvas1 = document.getElementById('annoCanvas');

               var ctx = resCanvas1.getContext('2d');
               ctx.save(); 
               //setting the orientation flips it
               mpImg.render(resCanvas1, {
                        maxWidth: 700,
                        maxHeight: 700,
                        orientation: orientation
                    });
               ctx.restore();

              //...

        }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24998317

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档