【发布时间】:2021-01-25 07:40:13
【问题描述】:
我在一家已经实施了文件上传器的公司工作,但由于某种原因,我们正在保存照片,其质量大大降低。基本上,我想知道最简单的方法是实现一个用户可以上传个人资料照片或徽标的组件,我们可以保存它而不会丢失质量。我还希望能够在不损失质量的情况下将其调整为各种尺寸。我也不一定需要裁剪器,我希望用户能够上传照片并显示完整图像,只需调整大小而不会损失质量。 Techstack 正在使用 JS 和 React。
class FileUpload extends React.Component {
constructor(props) {
super(props);
this.fileRef = createRef();
this.imgCanvas = createRef();
this.previousMoveX = 0;
this.previousMoveY = 0;
this.state = {
showUploadModal: false || props.showUploadModal,
img: '',
imgControl: false,
imgControlZoom: 0,
imgControlMove: false,
imgControlX: 0,
imgControlY: 0,
};
this.onImgRead = this.onImgRead.bind(this);
this.onChangeImage = this.onChangeImage.bind(this);
this.onChangeZoom = this.onChangeZoom.bind(this);
this.onStartMove = this.onStartMove.bind(this);
this.onMouseMove = this.onMouseMove.bind(this);
}
componentDidUpdate() {
const { img, imgControlZoom, imgControlX, imgControlY } = this.state;
if (img === '') return;
let canvas = this.imgCanvas.current;
if (canvas === null) return;
let ctx = canvas.getContext('2d');
let imgNode = new Image();
imgNode.onload = () => {
const s = parseInt(
Math.min(imgNode.width, imgNode.height) / ((imgControlZoom + 100) / 100)
);
const k = canvas.width / s;
ctx.fillStyle = '#fff';
ctx.fillRect(0, 0, canvas.width, canvas.height);
ctx.drawImage(
imgNode,
0,
0,
imgNode.width,
imgNode.height,
imgControlX + (s - imgNode.width) * 0.5 * k,
imgControlY + (s - imgNode.height) * 0.5 * k,
imgNode.width * k,
imgNode.height * k
);
};
imgNode.src = img;
}
onChangeImage(e) {
const input = e.target;
const { files } = e.target;
if (files === 0) return;
const file = files[0];
if (file.size > FILE_SIZE) {
toast.error(FILE_SIZE_VALIDATION);
return;
}
const fileReader = new FileReader();
fileReader.onload = ev => {
input.value = '';
this.onImgRead(ev.target.result);
};
fileReader.readAsDataURL(file, 'UTF-8');
}
【问题讨论】:
-
这个服务器有压缩吗?用户是否知道图像质量低劣?用户可以上传的最大文件大小是多少?您是否尝试在数据库中加载完整分辨率的低分辨率副本?图像是否模糊?在糟糕的用户体验之前,您可以摆脱的最低分辨率是多少?
-
为什么你认为质量损失是由react引起的? React 不能自己做到这一点,你的问题在服务器端。
-
@isAif 除非通过在数据库中呈现完整分辨率的低分辨率副本来延迟加载。但好点。
-
我并没有特别认为它是 React,只是组件最初的编写方式。这不是我的代码,我负责修复它。
-
回答你user67,我认为所有的图像渲染都是在客户端完成的,并且图像是通过GraphQL查询保存的。最大文件大小为 5mb。在服务器上,我们只是使用 base64upload 方法将照片上传到 AWS S3 存储桶
标签: javascript reactjs image frontend