Android 照片上传截图?
Android photo upload cutting off image?
我正在开发一款应用程序,允许用户通过 HTML
输入元素从他们的智能 phone 上传照片。基本流程是点击输入元素,选择相机,拍照,然后在预览中显示 window。当他们提交表单时,图像是 scaled down to 1200x900
并且调整大小后的图像 base64 dataURL
被保存到 SQL
数据库中,因此我可以直接将其用作 [=18= 的 src ] 在详细信息页面上。
Razor/Html:
Attach Image:
<input type="file" accept="image/*;capture=camera" onchange="picChange(event)" style="width:100%;margin-bottom:5px;"/>
<span id="fileSizeinfo"></span>
<img id="capturedPhoto" src="~/Content/Images/cameraglyph_1x.png" style="border-radius:5px;background-color:darkgray;border:solid;display:block;margin:auto;width:100%;" />
@Html.TextBoxFor(model => model.Photo, new { @hidden="hidden", id="photoData"})
JavaScript:
function picChange(evt) {
var fileInput = evt.target.files;
if (fileInput.length > 0) {
var photoImg = document.getElementById("capturedPhoto");
var photoData = document.getElementById("photoData");
var filesizeSpan = document.getElementById("fileSizeinfo");
var photo = evt.target.files[0];
var reader = new FileReader();
filesizeSpan.textContent = Math.round(photo.size * 0.000001) + 'Mb(s) - ' + Math.round(photo.size * 0.001) + 'kbs';
reader.onload = function (theFile) {
var img = new Image();
img.onload = function () {
var aspectRatio = img.width / img.height;
var desiredWidth = 1200;
var desiredHeight = desiredWidth / aspectRatio;
var photoCanvas = document.createElement('canvas');
photoCanvas.width = desiredWidth;
photoCanvas.height = desiredHeight;
var ctx = photoCanvas.getContext('2d');
ctx.drawImage(img, 0, 0, desiredWidth, desiredHeight);
var imageData = photoCanvas.toDataURL();
photoImg.src = imageData;
photoData.value = imageData;
}
img.src = theFile.target.result;
}
var photoSrc = reader.readAsDataURL(photo);
}
}
当我单击 phone 上的元素时,我得到正确的 camera/gallery 对话框到 select 图片来自:
如果我 select 相机,然后保存它在预览中正确显示的图像 window。预览是一个 img 元素,其 src 设置为刚刚拍摄的缩小图片的 dataURL。
提交后,如果我查看详细信息页面,我所有的相机图像如下所示:
它们总是被突然截断,尽管它被正确地调整为 1200x900
。我想也许dataURL太长了,所以我用我的桌面上传了一张11Mb的图片,它调整大小并正确显示,所以它肯定与使用phone有关。降低相机的分辨率解决了这个问题,但我需要在缩小它们(精密工业工作)之前尽可能高分辨率的源图像。
相机照片上传后通常在 3Mb
左右。奇怪的是它们在预览 window 中正确显示,它使用保存到数据库中的相同 dataURL 字符串!
测试于:
Android KitKat 4.4.2
Android Web Browser & Chrome Mobile
原来答案是 Chrome 网络浏览器的问题。在 android 上,HTML 文本框必须有某种字符限制,而 PC 上的 IE11 没有限制。我只是将提交 URI 的字段切换到 TextArea 字段,问题就消失了,不需要其他更改。
我正在开发一款应用程序,允许用户通过 HTML
输入元素从他们的智能 phone 上传照片。基本流程是点击输入元素,选择相机,拍照,然后在预览中显示 window。当他们提交表单时,图像是 scaled down to 1200x900
并且调整大小后的图像 base64 dataURL
被保存到 SQL
数据库中,因此我可以直接将其用作 [=18= 的 src ] 在详细信息页面上。
Razor/Html:
Attach Image:
<input type="file" accept="image/*;capture=camera" onchange="picChange(event)" style="width:100%;margin-bottom:5px;"/>
<span id="fileSizeinfo"></span>
<img id="capturedPhoto" src="~/Content/Images/cameraglyph_1x.png" style="border-radius:5px;background-color:darkgray;border:solid;display:block;margin:auto;width:100%;" />
@Html.TextBoxFor(model => model.Photo, new { @hidden="hidden", id="photoData"})
JavaScript:
function picChange(evt) {
var fileInput = evt.target.files;
if (fileInput.length > 0) {
var photoImg = document.getElementById("capturedPhoto");
var photoData = document.getElementById("photoData");
var filesizeSpan = document.getElementById("fileSizeinfo");
var photo = evt.target.files[0];
var reader = new FileReader();
filesizeSpan.textContent = Math.round(photo.size * 0.000001) + 'Mb(s) - ' + Math.round(photo.size * 0.001) + 'kbs';
reader.onload = function (theFile) {
var img = new Image();
img.onload = function () {
var aspectRatio = img.width / img.height;
var desiredWidth = 1200;
var desiredHeight = desiredWidth / aspectRatio;
var photoCanvas = document.createElement('canvas');
photoCanvas.width = desiredWidth;
photoCanvas.height = desiredHeight;
var ctx = photoCanvas.getContext('2d');
ctx.drawImage(img, 0, 0, desiredWidth, desiredHeight);
var imageData = photoCanvas.toDataURL();
photoImg.src = imageData;
photoData.value = imageData;
}
img.src = theFile.target.result;
}
var photoSrc = reader.readAsDataURL(photo);
}
}
当我单击 phone 上的元素时,我得到正确的 camera/gallery 对话框到 select 图片来自:
如果我 select 相机,然后保存它在预览中正确显示的图像 window。预览是一个 img 元素,其 src 设置为刚刚拍摄的缩小图片的 dataURL。
提交后,如果我查看详细信息页面,我所有的相机图像如下所示:
它们总是被突然截断,尽管它被正确地调整为 1200x900
。我想也许dataURL太长了,所以我用我的桌面上传了一张11Mb的图片,它调整大小并正确显示,所以它肯定与使用phone有关。降低相机的分辨率解决了这个问题,但我需要在缩小它们(精密工业工作)之前尽可能高分辨率的源图像。
相机照片上传后通常在 3Mb
左右。奇怪的是它们在预览 window 中正确显示,它使用保存到数据库中的相同 dataURL 字符串!
测试于:
Android KitKat 4.4.2
Android Web Browser & Chrome Mobile
原来答案是 Chrome 网络浏览器的问题。在 android 上,HTML 文本框必须有某种字符限制,而 PC 上的 IE11 没有限制。我只是将提交 URI 的字段切换到 TextArea 字段,问题就消失了,不需要其他更改。