- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 Cornerstone.js 库制作一个 Dicom 查看器应用程序以使用react。我的 React 应用程序中有两个组件。一个是 ImagePreview,另一个是 CornerStoneElement。 CornerStoneElement 是我初始化基石库的地方,它加载当前图像的状态。当一个新图像被推送到 CornerStoneElement 的状态时,它会以一种奇怪的方式加载新图像,因为所有的纵横比都消失了并且视口(viewport)被放大了。通过 ImagePreview 多次切换图像后,视口(viewport)越来越大。我需要的是在 CornerStoneElement 组件中加载新图像时重置视口(viewport)。这是两个组件的代码。
ImagePreview.js
import React,{useState,useEffect,useRef} from 'react'
const ImagePreview = ({ image,parentStateSetter,imageListIndex }) => {
let setParentState = (e) => {
parentStateSetter(e.target.getAttribute('image-list-index'));
}
return (
<div className="py-5 px-10">
<img src={image.previewURL} className="w-full" onClick={setParentState} image-list-index= {imageListIndex}/>
</div>
);
}
export default ImagePreview
CornerStoneElement.js
import React,{useState, setState, useRef, useEffect} from "react";
import * as cornerstone from "cornerstone-core";
import * as cornerstoneMath from "cornerstone-math";
import * as cornerstoneTools from "cornerstone-tools";
import Hammer from "hammerjs";
import * as cornerstoneWebImageLoader from "cornerstone-web-image-loader";
cornerstoneTools.external.cornerstone = cornerstone;
cornerstoneTools.external.cornerstoneMath = cornerstoneMath;
cornerstoneWebImageLoader.external.cornerstone = cornerstone;
cornerstoneTools.external.Hammer = Hammer;
cornerstoneTools.init();
const CornerStoneElement = (props) => {
console.log('props is called', props);
const stack = (Object.keys(props.stack).length > 0 )? props.stack : '';
const [viewport, setViewport] = useState(cornerstone.getDefaultViewport(null, undefined));
const imageId = (Object.keys(props.stack).length > 0 )? props.stack.imageIds[0] : '';;
const viewPortRef = useRef(null);
const onWindowResize = () => {
console.log("onWindowResize :", viewPortRef.current);
cornerstone.resize(viewPortRef.current);
}
const onImageRendered = () => {
const viewport = cornerstone.getViewport(viewPortRef.current);
console.log('onImageRendered :',viewport);
setViewport(viewport);
}
const onNewImage = () => {
const enabledElement = cornerstone.getEnabledElement(viewPortRef.current);
}
const addZoomTool = (e) => {
e.preventDefault();
const ZoomMouseWheelTool = cornerstoneTools.ZoomMouseWheelTool;
cornerstoneTools.addTool(ZoomMouseWheelTool)
cornerstoneTools.setToolActive('ZoomMouseWheel', { mouseButtonMask: 1 })
}
const addLengthTool = (e) => {
e.preventDefault();
const LengthTool = cornerstoneTools.LengthTool;
cornerstoneTools.addTool(LengthTool)
cornerstoneTools.setToolActive('Length', { mouseButtonMask: 1 });
}
const addElipticalTool = (e) => {
e.preventDefault();
const EllipticalRoiTool = cornerstoneTools.EllipticalRoiTool;
cornerstoneTools.addTool(EllipticalRoiTool)
cornerstoneTools.setToolActive('EllipticalRoi', { mouseButtonMask: 1 })
}
useEffect(() => {
console.log('use effect is called ');
const element = viewPortRef.current;
// Enable the DOM Element for use with Cornerstone
cornerstone.enable(element);
// Load the first image in the stack
if(imageId){
cornerstone.loadImage(imageId).then(image => {
// Display the first image
cornerstone.displayImage(element, image);
// Add the stack tool state to the enabled element
/* cornerstoneTools.addStackStateManager(element, ["stack"]);
cornerstoneTools.addToolState(element, "stack", stack); */
element.addEventListener( "cornerstoneimagerendered", onImageRendered );
element.addEventListener("cornerstonenewimage", onNewImage);
window.addEventListener("resize",onWindowResize);
});
console.log('inside comp will mount :', element);
}
}, [imageId])
return (
<div className= "py-5 px-10 ">
<div className="inline-flex">
<button className = "text-sm bg-blue-500 hover:bg-blue-700 text-white p-2 rounded m-2" onClick = {addZoomTool}> Zoom Tool</button>
<button className = "text-sm bg-blue-500 hover:bg-blue-700 text-white p-2 rounded m-2" onClick = {addLengthTool}> Length Tool </button>
<button className = "text-sm bg-blue-500 hover:bg-blue-700 text-white p-2 rounded m-2" onClick = {addElipticalTool}> Eliptical Tool </button>
</div>
<div
className="viewportElement my-3"
ref={viewPortRef}
>
<canvas className="cornerstone-canvas" />
<div>Zoom: {viewport.scale}</div>
<div>
WW/WC: {viewport.voi.windowWidth} /{" "}
{viewport.voi.windowCenter}
</div>
</div>
</div>
);
}
export default CornerStoneElement;
最佳答案
所以问题不在基石中。我所要做的就是将高度分配给渲染它的基石元素的父元素,它解决了这个问题。
关于javascript - 加载新图像时如何重置基石视口(viewport),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63092475/
我试图找到在庞大的代码库中创建 NaN 的位置。是否有一些编译器标志或我可以用来在 NaN 上 panic 的东西,这样我就可以找到它在哪一行? 最佳答案 没有编译器标志。你能做的最好的事情就是把你的
A类 class ClassA { @Autowired class ClassB; } 类配置: @Configuration class TestConfi
我是一名统计学研究生,经常使用 R。我熟悉其他编程环境中的 OOP。我什至在各种定义用于存储数据的新类的统计包中看到了它的使用。 在我研究生生涯的这个阶段,我通常会为一些类作业编写一些算法——一些接收
我想要两个不同的网络摄像头视频输出,一个是普通的网络摄像头镜头,另一个是它的“镜像”版本。 cv2可以吗? import time, cv2 video=cv2.VideoCapture(0) a=0
我创建了一个可以通过两种方式过滤的图库。一个通过单击按钮,另一个通过搜索过滤器。过滤器工作完美,除了当 div 隐藏在过滤器上时,其余显示的 div 不会彼此相邻 float 。 这是过滤前的样子:
我们作为一个 4 人团队工作,我们的项目部署在 openshift我们使用 git 存储库 进行提交、推送和 pull 。当有人提交更多更改时,其他人必须 pull 它以在我们的系统中进行更新。但是从
我正在尝试扩展自动完成功能,以便在选择某个项目时显示辅助标签。例如,给定显示项目的自动完成功能,项目名称将显示在包含代码的输入框旁边的 span 标记中。 查看自动完成源代码,我发现过滤值的下拉列表是
我有一个包含歌曲、艺术家和专辑实体的核心数据。 歌曲有可选的一对一关系艺术家到艺术家实体和专辑到专辑实体这两个实体都与 Song 实体具有反向关系。 相册有可选的一对一关系艺术家到艺术家实体和可选的一
XmlSerializer正在调用 IList.Add()在我的课上,我不明白为什么。 我有一个自定义类(层次结构中的几个类之一),其中包含我使用 XmlSerializer 与 XML 相互转换的数
我们在 Web 应用程序中定义了此事件,它创建了一个名为 timelineEventClicked 的自定义触发器 canvas.addEventListener('click', function
有大量资源可用于使用 Swift(可达性)检查有效的 Internet 连接,以及在进行 API 调用时检查 httpResponse 的 statusCode 的方法,但是检查和处理这些的“正确”方
谁能告诉我是否可以在 Controller 规范中 stub params[] 值,以便 Controller 接受 stub 值作为 View 中的实际 params[] 值。 例如,我的观点有一个
我的问题是没有在 UserControl 中连接 DependencyProperties。这不是问题。当我将 UserControl 中的按钮绑定(bind)到 UserControl 的 Depe
如何#define 路径 L"C:\Windows\System32\taskmgr.exe"来处理宽字符 #define TASK_MGR "C:\\Windows\\System32\\taskm
我正在尝试使用 Jasmine 和 Sion 编写单元测试,但是在使用 RequireJs 加载模块时我很难找到以下等效项: sinon.stub(window, "MyItemView"); 使用
我有一个包含三个 div 的示例页面,如下所示: 当浏览器大小达到 md 点并且第二个 div 高于第一个 div 时,第三个 div 开始在第一个的右侧
我在 C++ 端有 CString cs,在 C# 端有 IntPtr ip,它通过编码(marshal)处理机制包含 cs 的值。 然后,我只需将需要的字符串作为 Marshal.PtrToStri
我是一名优秀的程序员,十分优秀!