微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将Caman JS预设过滤器应用于Konva React

如何解决将Caman JS预设过滤器应用于Konva React

通过为图层组件创建引用,我可以访问canvas元素,然后可以将其传递给caman函数,以将预设的滤镜应用于画布中的图像。但是,这可以按预期工作,将舞台保存为图像时,不应用滤镜。如何在应用Caman滤镜的情况下将Konva舞台导出为图像。

Component Editor.js

import React,{useRef} from 'react';
import {Stage,Layer,Image} from 'react-konva';
import EditorControls from './EditorControls';
const caman = window.Caman;

const Editor = ({image}) => {
  const stageRef = useRef();
  const mainLayer = useRef();
 
  const filterSelect = filter => {
    const canvas = mainLayer.current.canvas._canvas;
    caman(canvas,image,function() {
      this.revert();
      if (!filter) {return;}
      this[filter]().render();
    });
  }

  return (
    <div className='Editor'>
      <Stage 
        width={500}
        height={500}
        ref={stageRef}
      >
        <Layer ref={mainLayer}>
          <Image
            x={0}
            y={0}
            width={500}
            height={500}
            image={image}
          />
        </Layer>
      </Stage>
      <EditorControls
        onFilterSelect={filterSelect}
      />
      <button
        onClick={() => {
          const link = document.createElement('a');
          link.download = 'test.png';
          link.href = stageRef.current.getStage().toDataURL({pixelRatio: 3});    
          link.click();
          link.remove();
        }}
      >
        SAVE
      </button>
    </div>
  );
}

export default Editor;

Component EditorControls.js

import React from 'react';

const filters = ['vintage','lomo','clarity','sinCity','sunrise','crossprocess','orangePeel','love','grungy','jarques','pinhole','oldBoot','glowingSun','hazyDays','herMajesty','nostalgia','hemingway','concentrate'];

const EditorControls = ({onFilterSelect}) => {
  return (
    <div className='EditorControls'>
      <div className='EditorControls__filters'>
        <button onClick={() => onFilterSelect('')}>
          <p>noFilter</p>
        </button>
        {filters.map((filter,index) => (
          <button key={filters[index]} onClick={() => onFilterSelect(filter)}>
            <p>{filters[index]}</p>
          </button>
        ))}
      </div>
    </div>
  );
}

export default EditorControls;

解决方法

根据https://konvajs.org/docs/sandbox/Native_Context_Access.html,不建议手动更改画布内容(在您的情况下通过Caman操作)。

如果要申请Caman,您可以:

  1. 缓存节点并编写自己的自定义过滤器https://konvajs.org/docs/filters/Custom_Filter.html。要使其与Caman一起使用,您可以将Konva滤镜中使用的imageData转换为画布,然后应用Caman滤镜,然后再转换回imageData
  2. 或者,如果只想应用一次过滤器(导出时),则可以先使用node.toCanvas() method将节点转换为<canvas>元素。然后在Caman中使用生成的画布。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。