问题描述
我在移动中创建一个简单的网络应用程序,允许访问者使用html5 input [type = file]元素捕获照片。然后我会将其显示在网络上进行预览,然后访问者可以选择将照片上传到我的服务器用于其他目的(即:上传到FB)
I am making a simple web app in mobile which allow visitor to capture photo by using html5 input[type=file] element. Then I will display it on the web for preview, and then visitor can choose to upload the photo to my server for other purpose(ie: upload to FB)
当我使用我的iPhone拍照并保持垂直照片的方向问题。照片是在标签中正确的方向。
然而,当我尝试使用drawImage()方法绘制到画布上时,它被绘制90度旋转。
I find a problem on the orientation of photo when I take photo using my iPhone and hold vertically.The photo is in a correct orientation in tag.However, when I try to draw it into canvas by using drawImage() method, it is drawn 90 degree rotated.
我试图拍照4方向,只有一个可以在画布上绘制正确的图像,其他的旋转或甚至上下颠倒。
I have tried to take photo in 4 orientations, only one of them can draw a correct image in canvas, others are rotated or even flipped upside down.
好吧,我很困惑得到正确的方向来解决这个问题...
感谢您的帮助...
Well, I am confused to get the correct orientation to fix this problem...Thanks for helping...
这里是我的代码,大多数是从MDN复制的
here is my code, mostly copy from MDN
<div class="container">
<h1>Camera API</h1>
<section class="main-content">
<p>A demo of the Camera API, currently implemented in Firefox and Google Chrome on Android. Choose to take a picture with your device's camera and a preview will be shown through createObjectURL or a FileReader object (choosing local files supported too).</p>
<p>
<form method="post" enctype="multipart/form-data" action="index.php">
<input type="file" id="take-picture" name="image" accept="image/*">
<input type="hidden" name="action" value="submit">
<input type="submit" >
</form>
</p>
<h2>Preview:</h2>
<div style="width:100%;max-width:320px;">
<img src="about:blank" alt="" id="show-picture" width="100%">
</div>
<p id="error"></p>
<canvas id="c" width="640" height="480"></canvas>
</section>
</div>
<script>
(function () {
var takePicture = document.querySelector("#take-picture"),
showPicture = document.querySelector("#show-picture");
if (takePicture && showPicture) {
// Set events
takePicture.onchange = function (event) {
showPicture.onload = function(){
var canvas = document.querySelector("#c");
var ctx = canvas.getContext("2d");
ctx.drawImage(showPicture,0,0,showPicture.width,showPicture.height);
}
// Get a reference to the taken picture or chosen file
var files = event.target.files,
file;
if (files && files.length > 0) {
file = files[0];
try {
// Get window.URL object
var URL = window.URL || window.webkitURL;
// Create ObjectURL
var imgURL = URL.createObjectURL(file);
// Set img src to ObjectURL
showPicture.src = imgURL;
// Revoke ObjectURL
URL.revokeObjectURL(imgURL);
}
catch (e) {
try {
// Fallback if createObjectURL is not supported
var fileReader = new FileReader();
fileReader.onload = function (event) {
showPicture.src = event.target.result;
};
fileReader.readAsDataURL(file);
}
catch (e) {
// Display error message
var error = document.querySelector("#error");
if (error) {
error.innerHTML = "Neither createObjectURL or FileReader are supported";
}
}
}
}
};
}
})();
</script>
推荐答案
您需要读取exif数据并检查if exif.Orientation是以下之一:
You'll need to read the exif data and check if exif.Orientation is one of the following:
fileReader.onloadend = function() {
var exif = EXIF.readFromBinaryFile(new BinaryFile(this.result));
switch(exif.Orientation){
case 8:
ctx.rotate(90*Math.PI/180);
break;
case 3:
ctx.rotate(180*Math.PI/180);
break;
case 6:
ctx.rotate(-90*Math.PI/180);
break;
}
};
这篇关于如何通过在移动Web浏览器中使用输入[type ='file']在捕获照片后在画布中绘制具有正确方向的照片?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!