簡體   English   中英

反應:Canvas drawImage 沒有更新 canvas

[英]React: Canvas drawImage is not updating the canvas

我正在使用 react konva 在 canvas 上繪制圖像。我在舞台元素中有兩個不同的圖層(konva 中的畫布)。 一張圖片是預先確定的,一張在運行時通過輸入更新。 兩張圖片都顯示正常,但是當我嘗試保存它們時,來自輸入的圖片只是一個黑色 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 文件,它就不再存在了。

保存 function:

  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>
  );

該應用程序的目標是保存其中包含兩張圖片的舞台,但正如我所說,背景始終為黑色,而燈亮着。

提前致謝!

不要直接使用層的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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM