反应:Canvas drawImage 没有更新 canvas
React: Canvas drawImage is not updating the canvas
我正在使用 react konva 在 canvas 上绘制图像。
我在舞台元素中有两个不同的图层(konva 中的 canvas)。
一张图片是预先确定的,一张在运行时通过输入更新。
两张图片都显示正常,但是当我尝试保存它们时,来自输入的图片只是一个黑色 png 而不是我选择的图片。
Javascript:
点击输入时上传图片。
const handleImageUpload = e => {
setSelected(false);
let canvas = backgroundCanvas.current;
let ctx = canvas.getContext('2d');
newImage.onload = function() {
newImage.crossOrigin = 'Anonymus';
ctx.drawImage(newImage, 0, 0);
};
const [file] = e.target.files;
if (file) {
const reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = e => {
ctx.clearRect(0, 0, canvas.canvas.width, canvas.canvas.height);
newImage.src = e.target.result;
};
}
};
它像我想要的那样在屏幕上显示图像并且看起来可以正常工作,但是,如果我想将 canvas 另存为 png 文件,它就不再存在了。
保存功能:
const saveImage = () => {
let backgroundCanvasSave = backgroundCanvas.current;
const backgroundCanvasData = backgroundCanvasSave.toDataURL({
mimeType: 'image/png',
});
downloadURI(backgroundCanvasData, 'stage.png');
};
JSX:
<div>
<Stage
ref={canvasStage}
width={window.innerWidth}
height={window.innerHeight}
>
<Layer
ref={backgroundCanvas}
onClick={() => {
setSelected(false);
}}
onTap={() => {
setSelected(false);
}}
/>
<Layer ref={lampCanvas}>
<Lamp
shapeProps={shape}
isSelected={selected}
onSelect={() => {
setSelected(true);
}}
onChange={setShape}
/>
</Layer>
</Stage>
<label
for="files"
class="btn"
style={{
border: '1px solid',
display: 'inline block',
padding: '6px 12px',
cursor: 'pointer',
}}
>
Bild hochladen
<input
id="files"
visibility="hidden"
type="file"
accept="image/*"
style={{ display: 'none' }}
onChange={handleImageUpload}
ref={imageUploader}
/>
</label>
<label
class="btn"
style={{
border: '1px solid',
display: 'inline block',
padding: '6px 12px',
cursor: 'pointer',
}}
onClick={saveImage}
>
Bild speichern
</label>
</div>
);
应用程序的目标是保存其中包含两张图片的舞台,但正如我所说,背景始终为黑色,而 lamp 正在显示。
提前致谢!
不要直接使用图层的context
。导出 canvas.
时,Konva 可能会丢失您的更改
要解决此问题,只需将您的输入绘制为 <Image />
组件:
const newImage = new Image();
newImage.onload = () => {
this.setState({ image: newImage })
};
newImage.crossOrigin = 'Anonymus';
newImage.src = e.target.result;
// in render:
<Layer
ref={backgroundCanvas}
onClick={() => {
setSelected(false);
}}
onTap={() => {
setSelected(false);
}}
>
<Image image={this.state.image} />
</Layer>
我正在使用 react konva 在 canvas 上绘制图像。 我在舞台元素中有两个不同的图层(konva 中的 canvas)。 一张图片是预先确定的,一张在运行时通过输入更新。 两张图片都显示正常,但是当我尝试保存它们时,来自输入的图片只是一个黑色 png 而不是我选择的图片。
Javascript:
点击输入时上传图片。
const handleImageUpload = e => {
setSelected(false);
let canvas = backgroundCanvas.current;
let ctx = canvas.getContext('2d');
newImage.onload = function() {
newImage.crossOrigin = 'Anonymus';
ctx.drawImage(newImage, 0, 0);
};
const [file] = e.target.files;
if (file) {
const reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = e => {
ctx.clearRect(0, 0, canvas.canvas.width, canvas.canvas.height);
newImage.src = e.target.result;
};
}
};
它像我想要的那样在屏幕上显示图像并且看起来可以正常工作,但是,如果我想将 canvas 另存为 png 文件,它就不再存在了。
保存功能:
const saveImage = () => {
let backgroundCanvasSave = backgroundCanvas.current;
const backgroundCanvasData = backgroundCanvasSave.toDataURL({
mimeType: 'image/png',
});
downloadURI(backgroundCanvasData, 'stage.png');
};
JSX:
<div>
<Stage
ref={canvasStage}
width={window.innerWidth}
height={window.innerHeight}
>
<Layer
ref={backgroundCanvas}
onClick={() => {
setSelected(false);
}}
onTap={() => {
setSelected(false);
}}
/>
<Layer ref={lampCanvas}>
<Lamp
shapeProps={shape}
isSelected={selected}
onSelect={() => {
setSelected(true);
}}
onChange={setShape}
/>
</Layer>
</Stage>
<label
for="files"
class="btn"
style={{
border: '1px solid',
display: 'inline block',
padding: '6px 12px',
cursor: 'pointer',
}}
>
Bild hochladen
<input
id="files"
visibility="hidden"
type="file"
accept="image/*"
style={{ display: 'none' }}
onChange={handleImageUpload}
ref={imageUploader}
/>
</label>
<label
class="btn"
style={{
border: '1px solid',
display: 'inline block',
padding: '6px 12px',
cursor: 'pointer',
}}
onClick={saveImage}
>
Bild speichern
</label>
</div>
);
应用程序的目标是保存其中包含两张图片的舞台,但正如我所说,背景始终为黑色,而 lamp 正在显示。
提前致谢!
不要直接使用图层的context
。导出 canvas.
要解决此问题,只需将您的输入绘制为 <Image />
组件:
const newImage = new Image();
newImage.onload = () => {
this.setState({ image: newImage })
};
newImage.crossOrigin = 'Anonymus';
newImage.src = e.target.result;
// in render:
<Layer
ref={backgroundCanvas}
onClick={() => {
setSelected(false);
}}
onTap={() => {
setSelected(false);
}}
>
<Image image={this.state.image} />
</Layer>