当前位置: 首页 > 知识库问答 >
问题:

ToastUI图像编辑器loadImageFromURL不工作

茅高卓
2023-03-14

请注意,这是一个自我回答的问题。

这个问题是关于ToastUI图像编辑器v3.3.0的,但它也可能适用于较新版本。

当您使用此官方示例加载图像时:

// Create image editor
var imageEditor = new tui.component.ImageEditor('#my-image-editor canvas', {
    cssMaxWidth: 1000, // Component default value: 1000
    cssMaxHeight: 800  // Component default value: 800
});

// Load image
imageEditor.loadImageFromURL('img/sampleImage.jpg', 'My sample image')

编辑器不会加载图像。该函数既不抛出,也不返回任何指示失败的内容,您不会收到任何错误消息。它返回一个按照留档中指定的解析的promise。

它仅通过在初始配置中指定图像来加载图像,之后无法更改:

// Create image editor
var imageEditor = new tui.component.ImageEditor('#my-image-editor canvas', {
     includeUI: {
         loadImage: {
             path: 'img/sampleImage.jpg',
             name: 'My sample image'
         },
     },
    cssMaxWidth: 1000, // Component default value: 1000
    cssMaxHeight: 800  // Component default value: 800
});

似乎loadImageFromURL函数已损坏,根据其他用户loadImageFromFile也有同样的问题。

关于这一点的问题已经在GitHub上提出,但基本上被忽略了。现在已经一个月了,不幸的是它还没有被修复。

所以问题是,当这个问题存在时,图像编辑器如何被欺骗而工作。

这里有一把小提琴表明它不起作用:https://fiddle.sencha.com/#view/editor

共有3个答案

巴学潞
2023-03-14

在打开之前将此属性添加到要编辑的图像标签中:

crossorigin="anonymous"

如下所述:https://github.com/nhn/tui.image-editor/issues/68#issuecomment-930106372

惠诚
2023-03-14

对于那些正在使用Rails的人来说,当谈到@Forivin提出的第四个问题时,我就是这样做的,以使其工作。

问题是当Toast调用存储在S3上的图像时,我会在Chrome上得到一个CORS错误,但firefox没有问题。有很多关于这方面的文章,基本上我发现最好的方法是在代码中使用代理。我仍然可以让我的CORS原点指向我的主机,因为呼叫是通过代理从我的主机发出的,S3和Chrome很高兴。我的S3 CORS配置如下(允许子域):

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
    <AllowedOrigin>http://*.mycompany.com</AllowedOrigin>
    <AllowedMethod>POST</AllowedMethod>
    <AllowedMethod>GET</AllowedMethod>
    <AllowedMethod>PUT</AllowedMethod>
    <AllowedMethod>DELETE</AllowedMethod>
    <AllowedMethod>HEAD</AllowedMethod>
    <AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>

在rails项目中,请执行以下操作:

添加机架代理gem在您的Gemfile

gem 'rack-proxy'

创建一个代理文件。s3路径经过URI编码并附加到路由末尾。该路由仅用于代理,因此它可以是任何内容,因为它将被重新路由到s3。

app/proxy/s3_代理。rb

class S3Proxy < Rack::Proxy

  def perform_request(env)
    if env['REQUEST_PATH'] =~ %r{^/my/dummy/path}
      s3_path = CGI.unescape(env['REQUEST_PATH'][15..-1])

      uri = URI.parse(s3_path)
      env['HTTP_HOST'] = uri.host
      env['SERVER_PORT'] = uri.port
      env['REQUEST_PATH'] = s3_path
      env['REQUEST_URI'] = s3_path
      env['PATH_INFO'] = s3_path
      env['rack.url_scheme'] = 'https'

      super(env)
    else
      @app.call(env)
    end
  end

end

添加到应用程序。rb文件:

require "./app/proxy/s3_proxy"

class Application < Rails::Application
  ...

  config.middleware.use S3Proxy
end

routes.rb

get "/my/dummy/path/:s3_url", to: "my_controller#dummy_path"

my_控制器中的控制器方法。rb。这里呈现的内容无关紧要,因为它将被代理重定向。因为代理无论如何都会改变,所以我们可能没有办法逃脱。

  def dummy_path
    render plain: ""
  end

最后,在我的Vue代码中,我通过首先填充一个空白的白色图像来调用Toast编辑器。然后,当安装组件时,我加载s3图像,覆盖现有图像并调整画布大小。我发现在读取s3图像之前安装它时需要一点延迟。s3图像是我在道具中传递的一个预先签名的url。

<template lang="pug">
.v-image-editor-tool
  tui-image-editor(:include-ui='useDefaultUI' :options="editorOptions" ref="tuiImageEditor")
</template>

<script lang="coffee">
import { ImageEditor } from '@toast-ui/vue-image-editor'
import 'tui-image-editor/dist/tui-image-editor.min.css'

export default app =
  props: ['imageUrl']
  data: ->
    useDefaultUI: true
    editorOptions:
      cssMaxWidth: 700
      cssMaxHeight: 700
      usageStatistics: false
      includeUI:
        loadImage:
          path: 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7'
          name: 'Blank'
        menuBarPosition: 'bottom'

  mounted: ->
    fn = => this.$refs.tuiImageEditor.invoke('loadImageFromURL', @imageUrl, 'Image').then (result) =>
      this.$refs.tuiImageEditor.invoke('ui.resizeEditor', { imageSize: { newWidth: result.newWidth, newHeight: result.newHeight }})
    setTimeout(fn, 600)

  components:
    'tui-image-editor': ImageEditor
</script>

戈正初
2023-03-14

TL;医生:这是一把小提琴:https://fiddle.sencha.com/#view/editor

长版本:

有四个问题:

  • 您需要加载初始图像,否则无法使用编辑控件
  • 在调用loadImageFromURL之前,需要等待图像编辑器对象就绪,否则可能会出现错误或无声故障
  • 加载图像时,您需要告诉图像编辑器新的大小,否则图像将被隐藏或大小不正确
  • 如果加载外部图像,则外部服务器必须设置“访问控制允许来源”标题,并明确允许您的域访问它,否则图像编辑器无法访问它

第一个问题可以通过如下方式加载空白图像来解决:

var imageEditor = new tui.ImageEditor('#tui-image-editor-container', {
    includeUI: {
        loadImage: {
            path: 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7',
            name: 'Blank'
        },
        theme: whiteTheme,
        menuBarPosition: 'bottom'
    },
    cssMaxWidth: 700,
    cssMaxHeight: 700
});

第二个问题可以通过使用未记录的功能等待图像编辑器脱离其锁定状态来解决。您可以在运行时这样修补您的loadImageFromURL:

imageEditor.loadImageFromURL = (function() {
    var cached_function = imageEditor.loadImageFromURL;
    function waitUntilImageEditorIsUnlocked(imageEditor) {
        return new Promise((resolve,reject)=>{
            const interval = setInterval(()=>{
                if (!imageEditor._invoker._isLocked) {
                    clearInterval(interval);
                    resolve();
                }
            }, 100);
        })
    }
    return function() {
        return waitUntilImageEditorIsUnlocked(imageEditor).then(()=>cached_function.apply(this, arguments));
    };
})();

第三个问题可以通过获取loadImageFromURL返回的promise所解决的对象,并将新的和旧的宽度/高度属性传递给ui来解决。resizeEditor的功能如下:

imageEditor.loadImageFromURL("https://upload.wikimedia.org/wikipedia/en/thumb/8/80/Wikipedia-logo-v2.svg/526px-Wikipedia-logo-v2.svg.png", "SampleImage").then(result=>{
    imageEditor.ui.resizeEditor({
        imageSize: {oldWidth: result.oldWidth, oldHeight: result.oldHeight, newWidth: result.newWidth, newHeight: result.newHeight},
    });
}).catch(err=>{
    console.error("Something went wrong:", err);
})

第四个问题可能有点令人困惑。让我解释一下。在网站上,你可以使用<代码>

 类似资料:
  • 我想在我的基于透视开关的RCP应用程序中隐藏一些编辑器。我扩展了“PerspectiveAdapter”类,并尝试在重写的方法“PerspectiveActivated”中使用IWorkBenchPage.HideEditor(editorReference)隐藏编辑器。这件事我没能成功。后来当我检查eclipse源代码中的hideEditor实现时,只有一行代码“e4util.unsupport

  • 问题内容: 我正在制定一个仅具有一些基本功能的在线图像编辑器的计划。它(显然)应包含一个画布工作区并支持以下功能: 1.从计算机上载图像或提交链接 2.调整图像大小(通过拖动角) 3.旋转和翻转 4.拖动/移动/平移 5.分层(如果在画布上有一个以上的图像,请选择垂直顺序) 6. 并且非常重要: 它应该能够使用简单的边缘检测进行某种背景删除。 我使用的图像将主要是时尚商品,因此,如果背景不是白色,

  • 介绍 针对awt中图片处理进行封装,这些封装包括:缩放、裁剪、转为黑白、加水印等操作。 方法介绍 图像切割 // 将face.jpg切割为原型保存为face_radis.png Img.from(FileUtil.file("e:/pic/face.jpg")) .cut(0, 0, 200)// .write(FileUtil.file("e:/pic/face_radis.pn

  • 出于某种原因,我的图像图标正在出现错误,尽管我试图修复它... 我读过这个问题,答案建议在mitmap文件夹中创建图像图标。因此,我将代码行从更改为 您可以看到图像上有一个错误。为什么会这样? 我曾试图: 清洁项目 重建项目 确保@mitmap/ic_启动器确实存在: 即使在我所有的尝试之后,错误仍然存在。我已经被困在这个问题上好几个小时了,我的脑袋都转不过来了。这是我的代码还是android s

  • 问题内容: 我正在使用来自sketch.js(http://intridea.github.io/sketch.js/)中的示例来绘制草图并将其保存为图像文件。 问题是我能够渲染后如何继续编辑草图图像? 任何建议或解决方案表示赞赏。 谢谢 问题答案:

  • 问题内容: 我想提供一个WYSIWYG工具,最好是基于JavaScript的工作流图表(即有向图)。我需要商业软件友好许可,其中包括向OEM付费。如果有必要的服务器端组件,则需要Java或ColdFusion,因为我正在与现有产品集成。 我的工作流图可以有多个起始顶点,但是只有一个终止顶点和边是有向的。除了所见即所得的编辑之外,我还在寻找一种可以帮助以下方面的工具: 能够导出工程图,因此可以是: