使用Javascript将选定的照片绘制到画布上

时间:2014-01-07 16:07:27

标签: javascript jquery html5 canvas

我正在使用下面的网页将用iPhone选择的照片绘制到画布上,以便以后可以通过ajax上传到网页。代码也会进行下采样,但我省略了它以使其更简单。

此代码在Firefox和Safari中的Mac OSx上运行良好,但与iPhone一起使用时,从iPhone库中选择照片或拍照时会出错。画布中的照片具有错误的宽高比并且是颠倒的。但是,如果您将照片从iPhone导入到Mac,然后将其与iTunes一起放回手机,那么选择后的照片就会完美呈现!为什么会这样,我认为它可能与图像被导入Mac后旋转的东西有关。

基本上我正在尝试编写一个脚本,以便用户可以使用iPhone拍照,使用canvas和javascript对照片进行缩减采样,然后通过ajax上传。但问题是拍摄新照片时画布中的照片并不正确。

第一张图片=正确 第二张图片=不正确

Canvas at top is correct Canvas here is incorrect, wrong aspect ratio, upside down, canvas has red background                                          画布走错了         

    <style type="text/css">

        #theImage {
            display:block;  
        }

        #cv {
            background-color:#F00;
        }

    </style>
</head>

<body>

    <form id="pageform" method="post" enctype="multipart/form-data" action="">
        <input type="file" name="fileinput" id="fileinput"  accept="image/*"/> 
    </form>

    <canvas id='cv' width="918" height="689"></canvas>

    <img id="theImage" />

    <script type="text/javascript">

    function readURL(input) {
            if (input.files && input.files[0]) {
                var reader = new FileReader();

                reader.onload = function (e) {
                    $('#theImage').attr('src', e.target.result);
                }

                reader.readAsDataURL(input.files[0]);
            }
        }

    function another() {

        var cv = document.getElementById('cv');
        var context = cv.getContext('2d');

        context.ImageSmoothingEnabled = true;
        context.webkitImageSmoothingEnabled = true;
        context.mozImageSmoothingEnabled = true;

        var img = document.getElementById('theImage');

        context.drawImage(img,0, 0, 918,689 );

    }

    $(document).ready(function () {

        $('#fileinput').change(function() {

            readURL(this);
            setTimeout(another,2000);

        });

    }); 

    </script>

</body>
</html>

1 个答案:

答案 0 :(得分:1)

你的代码看起来不错......

此代码会发生什么?

我无法在ios 7上进行测试

这没有静态值...而且没有ImageSmoothingEnabled&amp;将图像附加在正文上而不是画布上。

var MAXWidthHeight=64;
function h(e){
 var fr=new FileReader();
 fr.onload=function(e){
  var img=new Image();
  img.onload=function(){
   var r=MAXWidthHeight/Math.max(this.width,this.height),
   w=Math.round(this.width*r),
   h=Math.round(this.height*r),
   c=document.createElement("canvas");
   c.width=w;c.height=h;
   c.getContext("2d").drawImage(this,0,0,w,h);
   this.src=c.toDataURL();
   document.body.appendChild(this);
  }
  img.src=e.target.result;
 }
 fr.readAsDataURL(e.target.files[0]);
}
window.onload=function(){
 document.getElementById('fileinput').addEventListener('change',h,false);
}

更多信息

https://stackoverflow.com/a/17502568/2450730

<强>样本

http://jsfiddle.net/2zz76/

ios7的全屏

http://jsfiddle.net/2zz76/embedded/result/