您如何将 P5 loadImage() 与来自 FileReader 的 React 道具一起使用?

How do you use P5 loadImage() with React props from FileReader?

我正在尝试根据来自不同 React 组件中文件 Reader API 的输入更改图像,并将图像名称作为道具传递。

--出于某种原因,这完全不起作用。我想知道我是否在数据 URL 所在的位置正确插入文件名。

试过P5的createFileReader,也没用(忘了为什么),决定不用了,因为按钮太丑了。

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

这是P5环境:

import React from 'react'; 
import Sketch from 'react-p5';
import FileInput from '../FileInput'; 

let cvs; 
let img; 
let pg; 



export default function P5Lasso(){
const [image, setImage] = React.useState(null);
const [load, setLoaded] = React.useState(false);
 

function setup(p5, canvasParentRef) {
    cvs = p5.createCanvas(600, 600).parent(canvasParentRef);
    p5.loadImage(`${image}`, img => {image(img, 0, 0); console.log('load')});
    if (img !== null) {
        setLoaded(true); 
    } else { 
        return( console.log('load error')); }
    }

function draw(p5) {

stuff
        
    }


return (
    <div>
    <FileInput selectImage={(img) => setImage(img)} />
    {load && <div>
    <Sketch setup={setup} draw={draw} mouseReleased={mouseReleased}/> 
    </div>
    }
    </div>
    ); 
    }

这是文件 Reader:

import React, { useState, useRef } from 'react';

export default function FileInput(props) { 

const [src, setSrc]= useState(null); 
const fileInput = useRef(null);
  
const handleImageSelection = (event) => {
    props.selectImage(event.target.files[0].name); 
    console.log(event.target.files[0].name);

    let file = event.target.files[0];
    let reader = new FileReader();
    reader.onload = function (e) {
    setSrc(e.target.result);
    };
    reader.readAsDataURL(file);
};

const openFileInput = () => {
    fileInput.current.click();
  };

return (
  <div
      className="image-input"
      onClick={openFileInput}
      style={{
        width: "100%",
        height: "400px",
        border: "2px solid",
        borderRadius: "5px",
        color: "black",
  
      }}
    
    >
      <img
        style={{ height: "100%" }}
        className="loaded-image"
        src={src}
        alt=""
      />

      <label>
        <input
          ref={fileInput}
          style={{ display: "none" }}
          type="file"
          accept="image/*"
          onChange={handleImageSelection}
        />
      </label>
    </div>
 ); 
}

使用读取文件的结果作为数据 URI 在 FileReader 组件中调用 props.selectImage


import React, { useState, useRef, useEffect } from 'react';

export default function FileInput(props) {
  const [src, setSrc] = useState(null);
  const fileInput = useRef(null);

  const handleImageSelection = event => {
    let file = event.target.files[0];
    let reader = new FileReader();
    reader.onload = function(e) {
      setSrc(e.target.result);
    };
    reader.readAsDataURL(file);
  };

  useEffect(() => {
    if (src) {
      props.selectImage(src);
    }
  }, [src]);

  const openFileInput = () => {
    fileInput.current.click();
  };
//...

然后在Sketch组件中,如果有图片就用它来渲染草图

import React, { useState, useRef } from 'react';
import Sketch from 'react-p5';
import FileInput from './FileInput';

let cvs;
let img;
let pg;


export default function P5Lasso() {
  const [image, setImage] = React.useState(null);
  function setup(p5, canvasParentRef) {
    cvs = p5.createCanvas(600, 600).parent(canvasParentRef);
    p5.loadImage(image, img => {
      p5.image(img, 0, 0);
    });
  }

  function draw(p5) {
  }

  function mouseReleased() {}

  return (
    <div>
      <FileInput selectImage={setImage} />
      {image && (
        <div>
          <Sketch setup={setup} draw={draw} mouseReleased={mouseReleased}/>
        </div>
      )}
    </div>
  );
}