下面是源码,现在有一个小问题,就是我有一个还源,我想要的的把下面的图片不管怎么操作,点“还原”就重新加载图片显示,现在的问题是我操作过“还原”以后,我再去下面放大缩小操作图片,我发现图片还是以他没还原前的状态显示的,感觉canvas!.on('mouse:wheel', (options) => {})这个操作保存了之前的图片的状态或者说我逻辑上那里没有清除原来的?有看出我逻辑哪里不对的吗???
<script setup lang="ts">import { ContentWrap } from '@/components/ContentWrap'import { ElRow, ElCol, ElButton } from 'element-plus'import { onMounted, ref } from 'vue'import { fabric } from 'fabric'const canvasAll = ref<HTMLDivElement | null>(null)let canvas: fabric.Canvas | null = nullonMounted(() => { if (canvasAll.value) { init() }})const init = () => { canvas = new fabric.Canvas('canvas') if (canvasAll.value) { canvas.setWidth(canvasAll.value.$el.offsetWidth) canvas.setHeight(800) } fabric.Image.fromURL('https://www.chunshu.net/2.png', (img) => { canvas!.add(img) canvas!.renderAll() addScrollListener() })}const addScrollListener = () => { canvas!.on('mouse:wheel', (options) => { console.log(options) options.e.preventDefault() options.e.stopPropagation() let pointer: fabric.Point | undefined = options.pointer if (options.e.deltaY > 0) { canvas!.zoomToPoint(pointer!, canvas!.getZoom() / 1.1) } else { canvas!.zoomToPoint(pointer!, canvas!.getZoom() * 1.1) } })}const restorex = () => { init()}</script><template> <ContentWrap title="Canvas"> <ElRow> <ElCol :span="4" /> <ElCol :span="4" /> <ElCol ref="canvasAll" :span="16"> <ContentWrap class="m-auto"> <ElButton @click="restorex">还原</ElButton> <hr /> <canvas id="canvas"></canvas> </ContentWrap> </ElCol> </ElRow> </ContentWrap></template>
图片缩放可以用这个插件:https://vuejsexamples.com/vue2-component-for-resizable-rotabl...
你的问题在于,当你点击“还原”按钮时,你重新初始化了canvas
,但并没有清除之前添加到canvas
上的图片对象。这意味着,即使你重新初始化了canvas
,之前的图片对象仍然存在于内存中,并且当你尝试放大或缩小图片时,它仍然会按照之前的状态进行操作。
为了解决这个问题,你需要在restorex
函数中清除canvas
上的所有对象。你可以使用canvas.clear()
方法来完成这个操作。这将从canvas
中删除所有对象,包括你的图片。然后,你可以再次调用init
函数来重新加载图片。
以下是修改后的restorex
函数:
const restorex = () => { if (canvas) { canvas.clear().renderAll(); // 清除canvas上的所有对象 } init(); // 重新初始化canvas并加载图片}
此外,你需要注意的是,在你的代码中,你在init
函数中设置了canvas
的宽度和高度。但是,当canvasAll
的宽度发生变化时,你可能需要更新canvas
的宽度。否则,如果canvasAll
的宽度发生了变化,但是canvas
的宽度没有更新,那么canvas
可能会显示不正确。你可能需要在addScrollListener
函数中添加一些代码来监听canvasAll
的宽度变化,并相应地更新canvas
的宽度。
最后,你的代码中没有显示地处理canvas
的销毁。如果你的组件被销毁或卸载,你可能需要销毁canvas
以释放资源。你可以在onUnmounted
生命周期钩子中做这个操作。
希望这个答案对你有所帮助!如果你还有其他问题,欢迎继续提问。
下面是我用fabricjs做的画直种直线,图形的功能,现在我想求画的直线的长度,圆面积等,这个可以和单位联系起来吗?像毫米,厘米,米之类的联系起来吗?因为fabricjs中是根据坐标,像素之类来弄的,我不知道这和单位有相应的算法没?
问题内容: 您推荐哪种JavaScript压缩程序? 问题答案: UglifyJS2,由jQuery项目使用。
问题内容: 我已经尝试Go了一段时间,这个问题一直困扰着我。假设我在一个切片中建立了一个相当大的数据集(例如,一千万个int64)。 但是后来我决定我不想要其中的大多数,因此我只想得到其中的十个。我已经在Go的Wiki上尝试了切片和删除技术,但它们似乎都没有减少切片的容量。 因此,这就是我的问题:与在C中对同一指针的先前调用相比,Go是否具有缩小-sing大小参数的实际方法?这是一个问题,应该如何
目前搜寻都是要收费跟有病毒的,360会被绑架...
怎么让下面的看起来向个箭头,让三角形的一个角永远向着鼠标的方向 变成这样的
问题内容: 我有一个Struts2(2.1.8.1)Web应用程序。我的web.xml看起来像 它被配置为将所有请求映射到struts过滤器。我想在我的Web应用程序中添加一个servlet。我想将所有带有特定url模式的请求发送到该servlet。我希望其他所有内容都进入我的struts servlet。 我知道我只能将“ * .action”映射到struts servlet,但是我讨厌.ac