gpt4 book ai didi

jquery - 后续HTML5 CreateObjectURL blob图片预览和裁剪加载bug

转载 作者:太空狗 更新时间:2023-10-29 13:16:47 27 4
gpt4 key购买 nike

我想弄清楚是我的代码有问题还是当前的 HTML5 文件 API 实现有问题。

下面的代码有效。在已经加载图像一次后重复该过程时会出现该错误。

第二次选择文件时,图像 blob 加载,然后闪烁,图像消失。之后的后续选择通常工作正常(如果文件很大,有时会出现不稳定的行为)。对同一文件选择重复该过程通常有效(作为修复)。

如有任何帮助,我们将不胜感激。

使用的 JavaScript 库

  • JQuery 1.7.1

  • JQuery 工具 1.2.6

  • JCrop 0.9.9

步骤 - 总结

  1. 用户通过传统的<input type="file" /> 选择文件对话框。

  2. onchange 处理程序为输入执行并检查文件是否选中,如果是,则验证 MIME 类型是 image/jpeg 还是image/png 并且所选文件大小小于 250KB。如果此验证失败,它会重置选择。

  3. 此时要上传的文件(图片)是有效的。接下来它通过 if
    (typeof window.URL == 'undefined') return;
    检查浏览器是否支持文件 API CreateObjectURL (如果没有,则跳过下一步)

  4. 它将图像 blob 加载到当前图片预览中(一个用于显示当前图像),也进入动态生成使用 jcrop 添加到 jquery 工具的叠加层中的图像元素裁剪功能。

  5. 然后用户通过 jcrop 裁剪图像并关闭叠加层,查看要上传的图像的裁剪预览(仅当浏览器支持 CreateObjectURL 并且用户裁剪了图像)

代码

HTML

<div style="height: 100px; overflow: hidden; width: 100px; margin-bottom: 5px;">
<img id="PhotoPreview" alt="Photo" src="/Content/no-photo.png" />
</div>
<input type="file" id="Photo" name="Photo" onchange="photoChanged(this.files)" />
<input type="hidden" id="PhotoCrop" name="PhotoCrop" value="" />

JavaScript 窗口.URL = 窗口.URL ||窗口.webkitURL;

function photoChanged(files) {
if (!files.length) return;
var file = files[0];
if (file.type != 'image/jpeg' && file.type != 'image/png') {
alert('The photo must be in PNG or JPEG format');
$("#Photo").val('');
return;
}
var fileSizeLimit = 250;
var fileSize = file.size / 1024;
if (fileSize > fileSizeLimit) {
var fileSizeString = fileSize > 1024 ? (fileSize / 1024).toFixed(2) + "MB" : (fileSize).toFixed(2) + "KB";
alert("The photo file size is too large, maximum size is " + fileSizeLimit
+ "KB. This photos' file size is: " + fileSizeString);
$("#Photo").val('');
return;
}

if (typeof window.URL == 'undefined') return;

var preview = document.getElementById('PhotoPreview');
$(preview).removeClass('profile-photo');
preview.src = window.URL.createObjectURL(file);
preview.onload = function () {
var img = new Image();
$("#PhotoOverlay div").empty().append(img);
window.URL.revokeObjectURL(this.src);
img.src = window.URL.createObjectURL(file);
img.onload = function () {
window.URL.revokeObjectURL(this.src);
$(this).Jcrop({
onSelect: onImageCropSelect,
aspectRatio:
310 / 240,
minSize: [100, 100],
setSelect: [0, 0, 100, 100]
});

$("#PhotoOverlay")
.css({ width: this.width + 'px', : 'auto'})
.overlay()
.load();
};
};
}

function onImageCropSelect(e) {
$("#PhotoCrop").val(e.x + ',' + e.y + ',' + .x2 + ',' + e.y2);

var rx = 100 / e.w;
var ry = 100 / e.h;

var height = $("#PhotoOverlay div img").height();
var width = $("#PhotoOverlay div img").width();

jQuery('#PhotoPreview').css({
width: Math.round(rx * width) + 'px',
height: Math.round(ry * height) + 'px',
marginLeft: '-' + Math.round(rx * e.x) + 'px',
marginTop: '-' + Math.round(ry * e.y) + 'px'
});
}

$(function () {
$("#PhotoOverlay").overlay({
mask: {
color: '#ebecff',
loadSpeed: 200,
opacity: 0.9
}
});
});

请随意使用代码(我对此处收到的任何帮助的贡献)。

更新

我在 stackoverflow 上遇到了另一个关于使用 JCrop 的类似问题(图像加载然后消失)的问题。我目前打赌 JCrop 是罪魁祸首。

我还读到当 img.onload 执行时图像并不总是“准备好”,因此奇怪的行为和使用 setTimeout 对 .actualWidth/.actualHeight 的额外检查可能会解决这个问题。我会调查的。

更新

我有一个有效的概念证明,使用 FileReader 和 readAsDataUrl 而不是使用 CreateObjectURL 并使用 CANVAS 绘制预览而不是基于边距的溢出:隐藏解决方案。需要一些改进,然后我会在此处发布代码。

最佳答案

当您在声明 img.onload 之前设置 img.src 时,经常会出现不稳定的行为

function imageLoadHandler() { ... }

var img = new Image();
img.onload = function() { imageLoadHandler() }
img.src = window.URL.createObjectURL(file);
if(img.complete) { imageLoadHandler() } //fix for browsers that don't trigger .load() event with image in cache

希望对你有帮助

关于jquery - 后续HTML5 CreateObjectURL blob图片预览和裁剪加载bug,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9758162/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com