色五月色开心色婷婷色丁香,五月婷婷丁香花综合网,婷婷丁香五月激情综合在线,五月婷婷六月丁香动漫,婷婷丁香五月激情综合在线,丁香花中文字幕在线观看,播五月色五月开心五月网,开心激情综合网,狠狠色丁香婷婷综合最新地址,丁香视频在线观看,狠狠做六月爱婷婷综合av,久久激情五月丁香伊人

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線(xiàn)實(shí)戰(zhàn)洞察。

基于HTML5的DICOM閱片器Demo:從PACS到瀏覽器渲染的全鏈路實(shí)現(xiàn)

基于HTML5的DICOM閱片器Demo:從PACS到瀏覽器渲染的全鏈路實(shí)現(xiàn) 簡(jiǎn)介這是一份基于HTML5與Cornerstone.js構(gòu)建的DICOM/PACS在線(xiàn)閱片Demo面向醫(yī)學(xué)影像開(kāi)發(fā)者、醫(yī)療信息化從業(yè)者及需要遠(yuǎn)程閱片的醫(yī)生可直接在瀏覽器中查看來(lái)自PACS系統(tǒng)的DICOM影像無(wú)需安裝本地工作站。資源內(nèi)含278個(gè)文件以188個(gè)JavaScript腳本、40個(gè)HTML頁(yè)面和18個(gè)Markdown文檔為主輔以CSS樣式、JSON配置及GIF演示圖整體僅7.46MB目錄結(jié)構(gòu)清晰便于快速定位核心模塊。其中CornerstoneTools示例包含了縮放、平移、堆棧滾動(dòng)等常見(jiàn)閱片交互經(jīng)作者親測(cè)可用適合作為Web端醫(yī)學(xué)影像展示的入門(mén)參考或二次開(kāi)發(fā)起點(diǎn)。目前已有2345人瀏覽學(xué)習(xí)對(duì)于想理解DICOM解析與HTML5渲染結(jié)合的開(kāi)發(fā)者來(lái)說(shuō)是一份輕量且實(shí)用的實(shí)戰(zhàn)樣本。 做醫(yī)療信息化或者醫(yī)學(xué)影像相關(guān)的開(kāi)發(fā)遲早都會(huì)碰到一個(gè)需求在不裝任何插件、不依賴(lài)特定客戶(hù)端的情況下在瀏覽器里直接打開(kāi)DICOM影像做出類(lèi)似專(zhuān)業(yè)閱片器的效果。這個(gè)方向在PACS系統(tǒng)里屬于前端渲染這一層這幾年隨著HTML5和WebGL的普及已經(jīng)完全可行了。我這次整理的pacsHtml5dicomviewer閱片demo就是一套可以直接跑起來(lái)看效果的最小實(shí)現(xiàn)把DICOM文件的解析、瀏覽器端渲染、以及和PACS系統(tǒng)的對(duì)接鏈路都打通了。這個(gè)demo的定位不是那種要上生產(chǎn)環(huán)境的完整閱片器而是給開(kāi)發(fā)者用來(lái)理解整個(gè)流程、驗(yàn)證技術(shù)方案、甚至作為二次開(kāi)發(fā)起點(diǎn)的參考代碼。適合三類(lèi)人看一是剛接觸醫(yī)學(xué)影像的前端工程師想搞清楚DICOM到底是個(gè)什么東西二是醫(yī)療信息化項(xiàng)目里的全棧開(kāi)發(fā)需要快速評(píng)估HTML5閱片方案能不能用在自家的PACS/HIS/EMR系統(tǒng)里三是做畢業(yè)設(shè)計(jì)或者課程作業(yè)的學(xué)生需要一個(gè)能演示、能講解的完整案例。下面我從頭到尾把整個(gè)方案的思路、技術(shù)選型、代碼實(shí)現(xiàn)和踩坑過(guò)程都梳理一遍。1. 需求拆解與整體設(shè)計(jì)思路1.1 為什么要用瀏覽器做閱片傳統(tǒng)C/S架構(gòu)的PACS閱片器像RadiAnt、MicroDicom這類(lèi)功能確實(shí)強(qiáng)大但它們都有一個(gè)共同的問(wèn)題必須在每臺(tái)閱片終端上安裝客戶(hù)端軟件。對(duì)醫(yī)院來(lái)說(shuō)信息科維護(hù)起來(lái)很痛苦版本升級(jí)、操作系統(tǒng)兼容性、并發(fā)授權(quán)管理都是麻煩事。而臨床科室的醫(yī)生工作站如果只為了看幾張片子就要裝一套閱片軟件使用意愿也很低。B/S架構(gòu)的閱片方案恰好能規(guī)避這些痛點(diǎn)。瀏覽器本身就是最好的跨平臺(tái)前端Windows、macOS、Linux甚至平板都能訪(fǎng)問(wèn)真正做到了“零安裝”。影像數(shù)據(jù)可以統(tǒng)一存放在PACS服務(wù)器上Web服務(wù)器負(fù)責(zé)把圖像數(shù)據(jù)推送到前端前端負(fù)責(zé)渲染和交互。這樣一來(lái)醫(yī)院只需要維護(hù)服務(wù)器端客戶(hù)端零成本尤其是給EMR、HIS系統(tǒng)做嵌入式集成時(shí)一個(gè)iframe就能把閱片功能掛進(jìn)去。HTML5這個(gè)技術(shù)底座在這里起了關(guān)鍵作用。Canvas可以逐像素繪制圖像WebGL能用GPU加速渲染加上JS本身靈活的動(dòng)態(tài)能力讓“瀏覽器里跑一個(gè)專(zhuān)業(yè)閱片器”從設(shè)想變成了現(xiàn)實(shí)?,F(xiàn)在主流方案都建立在cornerstone.js這個(gè)開(kāi)源庫(kù)之上它就是這套技術(shù)路線(xiàn)的核心引擎。1.2 Demo需要覆蓋的核心鏈路一個(gè)完整可用的閱片demo至少要覆蓋這條鏈路DICOM文件獲取 → 數(shù)據(jù)解析 → 像素重建 → 圖像渲染 → 交互操作。如果只是為了演示可以用本地靜態(tài)DICOM文件作為數(shù)據(jù)源如果要貼近真實(shí)項(xiàng)目就需要通過(guò)WADO協(xié)議從PACS服務(wù)器拉取影像數(shù)據(jù)。為了讓這個(gè)demo具備真實(shí)的參考價(jià)值我把下面五個(gè)環(huán)節(jié)都實(shí)現(xiàn)了DICOM文件加載與解析支持本地文件和遠(yuǎn)程URL兩種方式解析出像素?cái)?shù)據(jù)和關(guān)鍵元信息。影像渲染與基礎(chǔ)交互窗寬窗位調(diào)節(jié)、縮放、平移、翻頁(yè)、播放這些閱片的基本功都不能少。多序列管理模擬一次檢查包含多個(gè)序列的情況支持序列切換。與PACS對(duì)接的接口預(yù)留代碼里寫(xiě)好了WADO-RS請(qǐng)求的封裝替換URL就能對(duì)接真實(shí)PACS。集成方案示例提供了嵌入到HIS/EMR系統(tǒng)的iframe方式和一個(gè)簡(jiǎn)單的Angular集成示例。這個(gè)鏈路覆蓋了從“拿到影像數(shù)據(jù)”到“在瀏覽器里完成閱片”的全過(guò)程和真實(shí)場(chǎng)景的流程是一致的。2. 核心概念DICOM、PACS與HTML5的三角關(guān)系2.1 DICOM究竟是個(gè)什么格式很多前端工程師第一次接觸DICOM時(shí)會(huì)很困惑這玩意兒后綴是.dcm但用圖片查看器打不開(kāi)。因?yàn)镈ICOM根本不是單純的圖片文件它是一種“醫(yī)學(xué)影像封裝協(xié)議”把像素?cái)?shù)據(jù)和患者信息、檢查信息、序列信息、設(shè)備參數(shù)一起打包在一個(gè)文件里。你可以把它理解成一個(gè)特殊的壓縮包里面既有一張或一組影像圖又附帶了這張圖的“身份標(biāo)簽”。這些“身份標(biāo)簽”在DICOM里叫Tag每個(gè)Tag都有唯一的16進(jìn)制編號(hào)。比如(0010,0010)是患者姓名(0008,0060)是檢查模態(tài)CT、MR、CR等(0028,0030)是像素間距(0028,1050)是窗寬(0028,1051)是窗位。DICOM的像素?cái)?shù)據(jù)存在(7FE0,0010)這個(gè)Tag里但它的排列方式、位深度、壓縮格式可能千差萬(wàn)別——CT通常是16位灰度、MR可能是16位、DR/X射線(xiàn)可能是8位或12位。那么問(wèn)題來(lái)了16位灰度意味著每個(gè)像素點(diǎn)的亮度值不是0-255而是0-65535這對(duì)渲染提出了更高的要求。cornerstone.js內(nèi)部會(huì)把DICOM的像素值映射到WebGL紋理或Canvas像素上并根據(jù)窗寬窗位動(dòng)態(tài)調(diào)整映射關(guān)系從而在屏幕上呈現(xiàn)出醫(yī)學(xué)診斷需要的灰度特征。2.2 PACS在閱片流程中的角色PACSPicture Archiving and Communication System是醫(yī)學(xué)影像的“中央倉(cāng)庫(kù)分發(fā)中心”。醫(yī)院的CT、MRI、DR等設(shè)備拍出來(lái)的圖像先通過(guò)DICOM協(xié)議發(fā)送到PACS服務(wù)器歸檔然后PACS再向全院提供查詢(xún)、調(diào)閱、存儲(chǔ)服務(wù)。閱片器本身不存數(shù)據(jù)它只是PACS的“客戶(hù)端”負(fù)責(zé)把影像顯示出來(lái)?!癙ACS系統(tǒng)HIS EMR系統(tǒng)對(duì)接”這個(gè)熱詞背后的業(yè)務(wù)是HIS醫(yī)院信息系統(tǒng)里掛號(hào)開(kāi)單對(duì)應(yīng)的檢查做完后臨床醫(yī)生要在EMR電子病歷系統(tǒng)里直接看到影像報(bào)告。以前的做法是從PACS導(dǎo)出圖片貼到病歷里現(xiàn)在主流做法是前端嵌入一個(gè)HTML5閱片器通過(guò)患者ID或檢查號(hào)直接調(diào)閱PACS里的原始影像。這就是為什么這個(gè)demo要預(yù)留WADO協(xié)議的接口——它是HTML5閱片器和PACS服務(wù)器之間的標(biāo)準(zhǔn)通信語(yǔ)言。2.3 WADO協(xié)議到底做了什么WADOWeb Access to DICOM Persistent Objects是DICOM標(biāo)準(zhǔn)里定義的基于HTTP的訪(fǎng)問(wèn)方式相當(dāng)于給PACS開(kāi)了一個(gè)“網(wǎng)頁(yè)API”。常見(jiàn)的有WADO-URI和WADO-RS兩種。WADO-URI通過(guò)URL查詢(xún)參數(shù)指定要拉取的object比如http://pacs-server:8080/wado?requestTypeWADOstudyUID1.2.3.4.5seriesUID1.2.3.4.5.6objectUID1.2.3.4.5.6.7transferSyntax1.2.840.10008.1.2.1contentTypeapplication/dicomWADO-RS則是RESTful風(fēng)格的接口用URL路徑來(lái)組織資源/studies/{studyUID}/series/{seriesUID}/instances/{objectUID}。返回的可以是application/dicom原始DICOM文件或image/jpeg壓縮后的圖像幀。cornerstone等庫(kù)可以直接基于WADO-RS的返回結(jié)果渲染圖像。demo里我封裝了WADO-RS客戶(hù)端方便你直接替換為自己的PACS地址。3. Demo技術(shù)選型cornerstone.js全家桶3.1 為什么選cornerstone.js而不是從零寫(xiě)閱片器的核心是渲染引擎。如果從零開(kāi)始在Canvas上繪制DICOM圖像你得自己處理16位灰度映射、窗寬窗位變換、偽彩映射、WebGL紋理上傳、插值縮放等一堆底層問(wèn)題。這個(gè)工作量非常大而且容易出錯(cuò)。cornerstone.js這個(gè)開(kāi)源項(xiàng)目把這些問(wèn)題都解決了它提供了一套純前端的DICOM渲染管線(xiàn)且star數(shù)很高、社區(qū)活躍、被很多商業(yè)產(chǎn)品驗(yàn)證過(guò)。具體來(lái)說(shuō)這個(gè)技術(shù)棧有四個(gè)關(guān)鍵組件cornerstone-core核心渲染引擎負(fù)責(zé)像素?cái)?shù)據(jù)的組織、窗寬窗位變換、渲染到Canvas或WebGL。cornerstone-tools交互工具庫(kù)內(nèi)置了縮放、平移、窗寬窗位調(diào)節(jié)、角度測(cè)量、長(zhǎng)度測(cè)量等操作。cornerstone-wado-image-loader圖像加載器負(fù)責(zé)發(fā)起WADO請(qǐng)求并把DICOM數(shù)據(jù)解析為cornerstone可以識(shí)別的圖像對(duì)象。dicom-parser底層DICOM二進(jìn)制解析器從字節(jié)流中提取Tag和像素?cái)?shù)據(jù)。整套方案的好處是“關(guān)注點(diǎn)分離”加載器負(fù)責(zé)數(shù)據(jù)獲取核心負(fù)責(zé)渲染工具庫(kù)負(fù)責(zé)交互。任何一個(gè)環(huán)節(jié)想替換成自己的實(shí)現(xiàn)都不會(huì)牽一發(fā)動(dòng)全身。3.2 前端框架怎么選如果你只做一個(gè)小demo用原生JS完全夠了cornerstone本身不依賴(lài)任何框架。但如果要做成模塊化、可維護(hù)性強(qiáng)的項(xiàng)目我建議用Vue或React包一層。我在demo里用了原生JS為主同時(shí)寫(xiě)了一個(gè)集成示例展示如何在A(yíng)ngular里嵌入cornerstone。選擇原生JS做底層的考慮是讓關(guān)注DICOM渲染的讀者不被框架噪聲干擾而提供框架集成示例則是為了讓你知道真實(shí)項(xiàng)目里怎么接。還有一個(gè)重要考量cornerstone的渲染對(duì)象和DOM強(qiáng)綁定在React或Vue的組件生命周期里需要手動(dòng)管理初始化和銷(xiāo)毀。所以不管用哪個(gè)框架cornerstone的enable()和disable()都要和組件的mounted/unmounted鉤子對(duì)齊否則會(huì)出現(xiàn)內(nèi)存泄漏或白屏。4. 實(shí)操?gòu)牧愦罱℉TML5 DICOM閱片Demo4.1 環(huán)境準(zhǔn)備與工程初始化這個(gè)項(xiàng)目依賴(lài)Node.js環(huán)境來(lái)跑開(kāi)發(fā)服務(wù)器前端本身不需要build工具就能跑起來(lái)但為了方便演示我用Vite搭了個(gè)簡(jiǎn)單的工程。初始化命令如下npm create vitelatest pacs-html5-dicom-viewer -- --template vanilla cd pacs-html5-dicom-viewer npm install cornerstone-core cornerstone-tools cornerstone-wado-image-loader dicom-parser依賴(lài)安裝完成后先別急著寫(xiě)代碼需要初始化cornerstone的加載器。這個(gè)步驟很關(guān)鍵相當(dāng)于告訴cornerstone“你要用哪個(gè)解析器、走哪種協(xié)議去獲取DICOM數(shù)據(jù)”。// main.js import { init as coreInit } from cornerstone-core; import { init as toolsInit } from cornerstone-tools; import cornerstoneWADOImageLoader from cornerstone-wado-image-loader; import dicomParser from dicom-parser; // 注冊(cè)WADO圖像加載器 cornerstoneWADOImageLoader.external.cornerstone cornerstone; cornerstoneWADOImageLoader.external.dicomParser dicomParser; cornerstoneWADOImageLoader.configure({ useWebWorkers: true, decodeConfig: { convertFloatPixelDataToInt: false } }); cornerstoneWADOImageLoader.webWorkerManager.initialize({ maxWebWorkers: navigator.hardwareConcurrency || 4, startWebWorkersOnDemand: true, taskConfiguration: { decodeTask: { initializeCodecsOnStartup: true, strict: false } } }); toolsInit();這里有兩個(gè)值得注意的細(xì)節(jié)。一是cornerstoneWADOImageLoader.external必須手動(dòng)指定外部依賴(lài)否則加載器會(huì)找不到cornerstone和dicomParser的實(shí)例二是useWebWorkers: true的配置會(huì)讓解碼放到Web Worker線(xiàn)程里執(zhí)行避免阻塞UI線(xiàn)程。我第一次做的時(shí)候沒(méi)配這個(gè)加載一個(gè)大體積CT序列時(shí)頁(yè)面直接卡死好幾秒配置完之后流暢度提升非常明顯。4.2 頁(yè)面布局與DICOM元素注冊(cè)頁(yè)面結(jié)構(gòu)上需要規(guī)劃一個(gè)圖像顯示區(qū)域、一個(gè)序列列表區(qū)域、一個(gè)操作工具欄以及一個(gè)信息展示區(qū)域。關(guān)鍵的一步是在頁(yè)面加載后調(diào)用cornerstone.enable()把所有有>div classviewer-container div classtoolbar button idbtnWwwc窗寬窗位/button button idbtnZoom縮放/button button idbtnPan平移/button button idbtnPlay播放/button /div div classviewer-main div classleft-panel div iddicomImage>const element document.getElementById(dicomImage); cornerstone.enable(element); const WwwcTool cornerstoneTools.WwwcTool; const ZoomTool cornerstoneTools.ZoomTool; const PanTool cornerstoneTools.PanTool; cornerstoneTools.addTool(WwwcTool); cornerstoneTools.addTool(ZoomTool); cornerstoneTools.addTool(PanTool); cornerstoneTools.setToolActive(Wwwc, { mouseButtonMask: 1 }); cornerstoneTools.setToolActive(Zoom, { mouseButtonMask: 2 }); cornerstoneTools.setToolActive(Pan, { mouseButtonMask: 4 });關(guān)于交互按鈕我的做法是把左鍵設(shè)為窗寬窗位調(diào)節(jié)、右鍵或中鍵設(shè)為縮放、中鍵或Shift左鍵設(shè)為平移這是大部分專(zhuān)業(yè)閱片軟件的通用交互邏輯醫(yī)生上手沒(méi)有負(fù)擔(dān)。值得再提醒一句cornerstone.enable(element)必須確保DOM元素已經(jīng)渲染在頁(yè)面上且擁有非零的寬高。如果在元素還沒(méi)顯示時(shí)就調(diào)用cornerstone內(nèi)部拿到的Canvas尺寸會(huì)是0x0后面加載圖像時(shí)會(huì)什么都看不到。在iframe里嵌入時(shí)尤其是父頁(yè)面用了隱藏div控制顯示的情況下這個(gè)問(wèn)題很容易踩到。4.3 加載DICOM圖像的核心代碼加載圖像是demo里的重中之重。cornerstone-wado-image-loader會(huì)根據(jù)imageId的前綴去判斷用哪個(gè)loaderwadouri:開(kāi)頭的走HTTP GET拉取文件dicomfile:開(kāi)頭的直接讀本地file對(duì)象。不管是哪種加載完成后返回的都是一個(gè)cornerstone Image對(duì)象包含像素?cái)?shù)據(jù)和元數(shù)據(jù)。async function loadDicomImage(imageId, element) { try { const image await cornerstone.loadImage(imageId); cornerstone.displayImage(element, image); // 更新界面信息 const patientName image.data.string(x00100010); const studyDate image.data.string(x00080020); const modality image.data.string(x00080060); document.getElementById(infoBar).innerHTML ${patientName} | ${studyDate} | ${modality} | ${image.width}x${image.height}; // 緩存起來(lái)供序列切換使用 imageCache[imageId] image; } catch (error) { console.error(加載DICOM圖像失敗, error); } }如果要加載PACS服務(wù)器上的影像只需要把imageId改成WADO-URI格式const imageId wadouri:http://your-pacs-server:8080/wado?requestTypeWADOstudyUID${studyUID}seriesUID${seriesUID}objectUID${objectUID}contentTypeapplication/dicom;這里有個(gè)細(xì)節(jié)如果你直接用wadouri:http://...而PACS服務(wù)器和前端頁(yè)面不在同一個(gè)域名下瀏覽器會(huì)發(fā)起一個(gè)跨域請(qǐng)求。此時(shí)需要在PACS服務(wù)器或代理層配置CORS跨域資源共享頭否則加載會(huì)失敗。本地調(diào)試最簡(jiǎn)單的辦法是用Vite的proxy把/wado路徑代理到PACS服務(wù)器既能繞開(kāi)CORS問(wèn)題又能隱藏真實(shí)的內(nèi)網(wǎng)地址。4.4 窗寬窗位調(diào)整的實(shí)現(xiàn)原理窗寬窗位Window Level簡(jiǎn)稱(chēng)W/L是醫(yī)學(xué)影像閱片里最核心的操作。CT值的范圍是-1024到3071之間16位灰度但普通顯示器只能顯示256級(jí)灰度。窗寬決定你關(guān)注多大的灰度范圍窗位決定這個(gè)范圍的中心落點(diǎn)。舉一個(gè)生活化的例子就像用相機(jī)拍夜空窗寬相當(dāng)于曝光寬容度窗位相當(dāng)于曝光中心。你調(diào)整窗寬窗位就相當(dāng)于讓你的眼睛聚焦在CT圖像的特定灰度區(qū)間上——看骨骼要用大窗寬、高窗位看肺部小結(jié)節(jié)就要調(diào)到特定的窄窗范圍把微小的密度差異放大到肉眼可分辨的程度。cornerstone中通過(guò)viewport的voi屬性來(lái)控制function setWindowLevel(element, windowCenter, windowWidth) { const viewport cornerstone.getViewport(element); viewport.voi.windowCenter windowCenter; viewport.voi.windowWidth windowWidth; cornerstone.setViewport(element, viewport); } // 更新顯示值 element.addEventListener(cornerstoneviewportchanged, (event) { const viewport event.detail.viewport; document.getElementById(wlInfo).innerHTML WW: ${Math.round(viewport.voi.windowWidth)} / WL: ${Math.round(viewport.voi.windowCenter)}; });窗寬窗位的默認(rèn)值可以從DICOM的Tag里讀(0028,1050)是窗寬(0028,1051)是窗位。如果原始文件里沒(méi)有這兩個(gè)Tagcornerstone會(huì)自動(dòng)根據(jù)像素分布計(jì)算一個(gè)“自動(dòng)窗寬窗位”。實(shí)際測(cè)試下來(lái)部分型號(hào)的設(shè)備導(dǎo)出的DICOM里窗寬窗位參數(shù)是很保守的參考價(jià)值不大手動(dòng)調(diào)節(jié)是更可靠的方式。閱片體驗(yàn)上有一個(gè)小細(xì)節(jié)值得做圖像加載完成后根據(jù)設(shè)備類(lèi)型預(yù)設(shè)一組常用窗寬窗位比如顱腦WW80/WL40、肺窗WW1500/WL-650、骨窗WW1800/WL400。醫(yī)生點(diǎn)一下就能切換不用手拖滑條這是實(shí)際使用中非常受歡迎的功能。4.5 序列加載與多幀播放一次CT檢查通常不只一張圖而是幾十到上千張連續(xù)的斷層圖像這些圖像在DICOM里歸屬于同一個(gè)Series序列。序列切換和滾輪翻頁(yè)是最基礎(chǔ)的瀏覽需求。demo中我用cornerstoneTools.addStackStateManager和addToolState來(lái)管理序列function loadSeries(seriesData, startIndex 0) { const stack { currentImageIdIndex: startIndex, imageIds: seriesData.map(item item.imageId) }; cornerstoneTools.addStackStateManager(element, [stack]); cornerstoneTools.addToolState(element, stack, stack); cornerstone.loadAndCacheImage(stack.imageIds[stack.currentImageIdIndex]).then(image { cornerstone.displayImage(element, image); }); } // 滾輪翻頁(yè) element.addEventListener(wheel, (event) { event.preventDefault(); const stack cornerstoneTools.getToolState(element, stack).data[0]; if (event.deltaY 0) { stack.currentImageIdIndex Math.min(stack.currentImageIdIndex 1, stack.imageIds.length - 1); } else { stack.currentImageIdIndex Math.max(stack.currentImageIdIndex - 1, 0); } cornerstone.loadAndCacheImage(stack.imageIds[stack.currentImageIdIndex]).then(image { cornerstone.displayImage(element, image); }); });加載多幀序列時(shí)有一個(gè)“預(yù)加載”策略值得關(guān)注。如果用戶(hù)用滾輪一幀一幀翻頁(yè)每次實(shí)時(shí)請(qǐng)求肯定會(huì)有卡頓所以需要把當(dāng)前幀前后若干幀提前加載到緩存里。cornerstone內(nèi)置的loadAndCacheImage方法在首次加載后會(huì)緩存圖像對(duì)象配合一個(gè)“鄰近N幀預(yù)加載”策略就能做到絲滑翻頁(yè)function preloadStack(stack, currentIndex, range 5) { const start Math.max(0, currentIndex - range); const end Math.min(stack.imageIds.length - 1, currentIndex range); for (let i start; i end; i) { if (i ! currentIndex) { cornerstone.loadAndCacheImage(stack.imageIds[i]).catch(() {}); } } }實(shí)測(cè)下來(lái)CT序列每張圖大概200-400KB壓縮后預(yù)加載前后各5幀的內(nèi)存開(kāi)銷(xiāo)其實(shí)不大但翻頁(yè)的流暢度提升非常顯著幾乎沒(méi)有白屏等待。4.6 測(cè)量工具與標(biāo)注功能除了看圖像閱片還有一個(gè)高頻需求是測(cè)量。比如量一個(gè)結(jié)節(jié)的長(zhǎng)徑或者在圖上畫(huà)個(gè)箭頭做個(gè)標(biāo)記。cornerstone-tools里有現(xiàn)成的LengthTool、AngleTool、EllipticalROITool等。啟用方式基本一致cornerstoneTools.addTool(cornerstoneTools.LengthTool); cornerstoneTools.setToolActive(Length, { mouseButtonMask: 1 });測(cè)量結(jié)果會(huì)以疊加層overlay的形式顯示在圖像上層不需要修改原始像素?cái)?shù)據(jù)。這一點(diǎn)很重要意味著醫(yī)生標(biāo)注的內(nèi)容可以單獨(dú)保存不會(huì)破壞原始影像的完整性。更完善的方案是測(cè)量結(jié)果以JSON格式存儲(chǔ)到后端數(shù)據(jù)庫(kù)再次打開(kāi)影像時(shí)同步標(biāo)注。有一點(diǎn)我要特別提醒醫(yī)學(xué)測(cè)量的準(zhǔn)確性和像素間距Pixel Spacing強(qiáng)相關(guān)DICOM里(0028,0030)這個(gè)Tag保存了每個(gè)像素對(duì)應(yīng)的物理尺寸單位是毫米。如果你的測(cè)試圖像序列里沒(méi)有這個(gè)TagLengthTool的測(cè)量結(jié)果會(huì)顯示“像素?cái)?shù)”而不是“毫米數(shù)”。寫(xiě)demo時(shí)如果發(fā)現(xiàn)測(cè)量單位不對(duì)先檢查源數(shù)據(jù)里有沒(méi)有像素間距字段。5. Demo的多種集成方式與前后端配合5.1 嵌入HIS/EMR的幾種姿勢(shì)在實(shí)際項(xiàng)目中HTML5閱片器最常以iframe的方式嵌入HIS或EMR系統(tǒng)。醫(yī)院內(nèi)部系統(tǒng)一般是B/S架構(gòu)在醫(yī)生工作站的頁(yè)面里加一個(gè)iframesrc指向閱片服務(wù)地址并攜帶患者ID或檢查號(hào)iframe srchttp://viewer-server/viewer?patientId123456studyUID1.2.3.4.5 stylewidth: 100%; height: 800px; border: none;/iframeiframe方案的好處是隔離性好——閱片器邏輯完全獨(dú)立HIS/EMR升級(jí)也不用動(dòng)閱片代碼。壞處是通信不太方便子頁(yè)面和父頁(yè)面只能通過(guò)postMessage來(lái)交互比如把測(cè)量結(jié)果、當(dāng)前序列信息傳回HIS。如果不想用iframe也可以用Web Component或前端框架把閱片器封裝成一個(gè)組件然后在HIS/EMR的前端項(xiàng)目里直接引用。我在demo里寫(xiě)了一個(gè)Angular組件示例// dicom-viewer.component.ts Component({ selector: app-dicom-viewer, template: div #viewerHost stylewidth: 100%; height: 600px;/div }) export class DicomViewerComponent implements OnInit, OnDestroy { ViewChild(viewerHost, { static: true }) viewerHost: ElementRef; Input() imageId: string; ngOnInit() { const element this.viewerHost.nativeElement; cornerstone.enable(element); cornerstone.loadImage(this.imageId).then((image) { cornerstone.displayImage(element, image); }); } ngOnDestroy() { cornerstone.disable(this.viewerHost.nativeElement); } }5.2 前后端聯(lián)動(dòng)從PACS拉取影像列表如果你要做一個(gè)功能完整的DICOM閱片模塊光能顯示單張圖像是不夠的還需要能查詢(xún)一個(gè)檢查Study下有哪些序列、每個(gè)序列有多少?gòu)垐D。這個(gè)查詢(xún)功能通常由后端服務(wù)來(lái)完成后端通過(guò)DICOM的C-FIND/C-MOVE命令或DICOMweb QIDO-RS接口向PACS發(fā)起查詢(xún)?nèi)缓蟀呀Y(jié)構(gòu)化JSON返回給前端。demo里封裝了一個(gè)簡(jiǎn)單的查詢(xún)接口// 假設(shè)后端提供的REST接口返回該檢查下的序列列表 async function fetchSeriesList(studyUID) { const response await fetch(/api/studies/${studyUID}/series); const seriesList await response.json(); return seriesList.map(series ({ seriesUID: series.seriesUID, modality: series.modality, seriesNumber: series.seriesNumber, instanceCount: series.instanceCount, instances: series.instances.map(inst ({ objectUID: inst.objectUID, imageId: wadouri:${buildWadoUri(studyUID, series.seriesUID, inst.objectUID)} })) })); }這里的/api/studies/{studyUID}/series就是由你后端實(shí)現(xiàn)的一個(gè)中間層。后端往PACS發(fā)QIDO-RS請(qǐng)求時(shí)不同廠(chǎng)商PACS返回的JSON字段不完全一致所以中間層的作用就是做字段適配和標(biāo)準(zhǔn)化。我在實(shí)際項(xiàng)目里遇到過(guò)一個(gè)比較頭疼的情況PACS服務(wù)器的DICOMweb能力參差不齊有些只支持WADO-URI不支持QIDO-RS查詢(xún)。遇到這種情況得后端用dcm4che這類(lèi)庫(kù)先通過(guò)傳統(tǒng)DICOM C-FIND查詢(xún)拿到結(jié)果后再轉(zhuǎn)換JSON。如果你只是做demo可以用一個(gè)假的離線(xiàn)JSON文件模擬查詢(xún)結(jié)果把重點(diǎn)放在前端渲染上。5.3 關(guān)鍵加載性能優(yōu)化瀏覽器端加載DICOM影像有一個(gè)繞不開(kāi)的問(wèn)題體積。一張CT圖像通常是512x512像素、16位深度原始數(shù)據(jù)約512KB一個(gè)300張的CT序列就有150MB以上。這對(duì)帶寬、內(nèi)存和解碼性能都是不小的壓力。實(shí)際項(xiàng)目中有幾個(gè)策略可以組合使用。首先是壓縮傳輸WADO-URI支持請(qǐng)求時(shí)指定transferSyntax比如讓PACS返回JPEG-LS或JPEG2000壓縮后的數(shù)據(jù)這樣每張圖能壓到100KB以下體積直接降為原來(lái)的1/5左右。但代價(jià)是增加了解碼環(huán)節(jié)需要確保cornerstone的loader裝了對(duì)應(yīng)的解碼器。其次是縮略圖優(yōu)先load圖片時(shí)先請(qǐng)求一個(gè)低分辨率的縮略圖比如將圖像長(zhǎng)邊縮到256像素馬上彈出顯示等用戶(hù)停下來(lái)了再加載原圖。人體肉眼對(duì)這種“先模糊后清晰”的體驗(yàn)容忍度非常高但加載速度的體感會(huì)好非常多。最后是切片渲染僅加載可視區(qū)域?qū)τ诔髨D像比如數(shù)字病理切片動(dòng)輒上億像素cornerstone內(nèi)部支持多分辨率金字塔只渲染當(dāng)前視口可見(jiàn)的那幾個(gè)瓦片tile。不過(guò)這個(gè)能力一般要結(jié)合后端做圖像切片服務(wù)不是純前端能解決的。6. 常見(jiàn)問(wèn)題與排查技巧實(shí)錄為了少走彎路我把調(diào)試過(guò)程中遇到的典型問(wèn)題整理成了表格這些問(wèn)題在真實(shí)的DICOM前端開(kāi)發(fā)里出現(xiàn)頻率極高問(wèn)題現(xiàn)象可能原因解決方案與排查思路加載圖像后白屏DOM元素尺寸為0或cornerstone未enable檢查容器寬高是否已確定確認(rèn)在顯示后再調(diào)用enable()控制臺(tái)打印cornerstone.getEnabledElements()確認(rèn)是否注冊(cè)成功只顯示一片黑/一片白窗寬窗位值不匹配像素?cái)?shù)據(jù)位深是12或16位但被當(dāng)成8位處理手動(dòng)調(diào)整“窗寬窗位”檢查加載器的convertFloatPixelDataToInt和useWebWorkers配置讀取DICOM的BitsAllocated字段確認(rèn)位深跨域加載失敗PACS服務(wù)器未設(shè)置CORS頭本地開(kāi)發(fā)用Vite/Webpack代理生產(chǎn)環(huán)境在Nginx層反代PACS并添加Access-Control-Allow-Origin顯示顏色不對(duì)例如CT圖像變藍(lán)像素?cái)?shù)據(jù)被當(dāng)作RGB處理實(shí)際是灰度單通道檢查PhotometricInterpretation字段(0028,0004)MONOCHROME1需要做反轉(zhuǎn)處理MONOCHROME2直接映射灰度中文患者姓名亂碼DICOM中文字符編碼問(wèn)題讀取(0010,0010)時(shí)使用dicom-parser的字符串方法配specificCharacterSet參數(shù)后端轉(zhuǎn)JSON時(shí)統(tǒng)一UTF-8加載大序列時(shí)卡頓解碼在主線(xiàn)程執(zhí)行導(dǎo)致UI阻塞確認(rèn)useWebWorkers: true確認(rèn)webWorkerManager初始化成功用performance.now()對(duì)比測(cè)試各環(huán)節(jié)耗時(shí)滾輪翻頁(yè)遲滯圖片未預(yù)加載增加鄰近幀預(yù)加載邏輯確認(rèn)loadAndCacheImage有緩存不要每次都重新請(qǐng)求JPEG2000壓縮圖像無(wú)法解碼缺少對(duì)應(yīng)解碼器安裝cornerstonejs/codec-jpeg2000在loader配置中手動(dòng)注冊(cè)O(shè)penJPEG解碼器7. 后續(xù)擴(kuò)展方向與經(jīng)驗(yàn)收尾寫(xiě)這個(gè)demo的過(guò)程讓我對(duì)“前端與醫(yī)療行業(yè)結(jié)合”有了比較深的認(rèn)識(shí)。純前端的技術(shù)本身不難cornerstone.js把渲染管線(xiàn)做得足夠透明真正的難點(diǎn)在于理解醫(yī)學(xué)影像的數(shù)據(jù)特性和醫(yī)院信息系統(tǒng)之間的集成約束。這里有幾個(gè)經(jīng)驗(yàn)可以分享。第一DICOM文件雖然規(guī)范統(tǒng)一但各設(shè)備廠(chǎng)商對(duì)標(biāo)準(zhǔn)的實(shí)現(xiàn)細(xì)節(jié)不完全一致。同一個(gè)字段GE可能把患者姓名放在這個(gè)Tag西門(mén)子可能放在那個(gè)Tag還有非標(biāo)準(zhǔn)私有Tag。如果要做產(chǎn)品建議在demo的基礎(chǔ)上再維護(hù)一層“廠(chǎng)商適配器”針對(duì)不同設(shè)備的特殊情況進(jìn)行容錯(cuò)處理。第二跟PACS對(duì)接時(shí)永遠(yuǎn)要先看對(duì)方的DICOM能力聲明。是支持DICOMweb還是只支持傳統(tǒng)DICOM協(xié)議這直接決定你后端的實(shí)現(xiàn)方式。我吃過(guò)虧花了兩天時(shí)間按照DICOMweb規(guī)范去對(duì)接結(jié)果對(duì)方PACS根本不支持WADO-RS后來(lái)改用傳統(tǒng)協(xié)議才打通。第三閱片器的安全非常重要。病人的影像數(shù)據(jù)是隱私數(shù)據(jù)demo里沒(méi)有做權(quán)限控制但真實(shí)項(xiàng)目里必須考慮閱片Web服務(wù)的登錄認(rèn)證、會(huì)話(huà)超時(shí)、查看權(quán)限醫(yī)生只能看自己科室或自己經(jīng)管的病人影像、操作留痕審計(jì)。這些都繞不過(guò)去如果將來(lái)有項(xiàng)目要把demo產(chǎn)品化需要在安全合規(guī)上做大量工作這個(gè)也建議第一時(shí)間提上日程。第四窗寬窗位這個(gè)交互是醫(yī)學(xué)影像前端里最值得花心思優(yōu)化的點(diǎn)。醫(yī)生調(diào)窗是非常高頻的操作交互是否順手直接決定這個(gè)閱片器能不能被接受。除了預(yù)設(shè)的窗寬窗位快捷鍵觸屏設(shè)備上還推薦做“雙指上下滑動(dòng)調(diào)節(jié)窗寬、左右滑動(dòng)調(diào)節(jié)窗位”的手勢(shì)支持這已經(jīng)是主流的交互模式了。這個(gè)demo我還會(huì)繼續(xù)擴(kuò)展比如加上MPR多平面重建、VR三維體渲染、結(jié)構(gòu)化報(bào)告標(biāo)注等進(jìn)階功能。對(duì)于剛開(kāi)始接觸DICOM前端開(kāi)發(fā)的讀者建議先把基礎(chǔ)渲染鏈路跑通再逐步疊加功能。路一步步走坑一個(gè)個(gè)填等熬過(guò)那幾次讓人抓狂的跨域問(wèn)題和解碼問(wèn)題之后你再看瀏覽器里清晰流暢的CT斷層圖像那種“跑通了”的成就感是相當(dāng)強(qiáng)烈的。本文還有配套的精品資源點(diǎn)擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
国产欧美伊人| 日韩精品高清资源在线| 91bbbbbb| 久久久久久亚洲精品不卡人乳| 亚洲欧美在线丝袜| 天天综合网91入口| av绯色| 久久国产精品视频| 超碰 av 女人天堂| 91快色色色色色| 国产SV一线| 国产乱色国产精品免费视| 91爱做| 五月丁香| 国产18精品亚洲精品| 欧美人与动性人交a| 嗯嗯嗯不要不要免费视频| 乳欲人妻办公室奶水| 在线亚洲欧美| 人妻天天爽天天爽三区| 9118禁| 欧州91高潮| 婷婷色香伊人| 91插B网站| 国产精品制服丝袜中文字幕日韩一区二区三区 | 三级激情网站| 欧美日日操| 成人a级高清视频在线观看| 欧美成年人性爱视频免费观看| 精品久9| 一区二区影视| 久久久99免费| 国产人妖视频一区在线观看| 久久婷婷综合国际产色怕| 日韩一级成人毛片免费观看| 欧美日韩性爱视屏免费看了| 97人人操人人干| 69精品在线| 日韩在线一区高清在线| 91性网| 夜夜骑夜夜操| 丝袜美腿制服人妻二区中文字幕| 桃花色涩综合影院| 亚洲、日韩、综合、另类| 91红杏| 美国三级日本三级久久99| 后入人妻无码| 亚洲一卡二卡在线免费| · —级AA伦aa坐爱午夜极速ⅴA一区天天噪天天噪天天噪 | 伊人玖玖网| 久操影视| 蜜臀99久久国产| 97资源欧美| 欧美亚洲综合999| 中文字幕丰满人妻日本| 99热婷婷| 国偷自 一区| A级在线视频| 日本色色色视频| 9热9热综合网| 天天干人人看综合| 日本三级韩三级99久久| 人人操人人精品影片| 国产肏逼网站| 亚洲码和欧洲精品激情系列| 青青青在线高清视频在线一二三四区| 久操com| 香蕉欧美| 综合影院永久入口国产| 超碰狠狠操| 亚洲色图 图片| 91东北熟女| 99在线精品观看99| 啊灬啊灬啊灬啊灬高潮奶出了免费视| 99久久精品国产系列| 又黑又大又粗| 亚洲日韩精品一区二区| 午夜精品一区二区三区三上悠亚| 久久风骚城市人| 国产伦乱91| 天天天做天天天爱天天天爽| 久久久久久亚洲Av无码| 欧美日韩一干二干| 乱色老一区二区三区的观看方式 | 96AV精品| 牛牛AV人人夜夜澡人人爽| 99超级碰免费视频| 亚洲天堂久久久久久粉红视频| 久都青青视频| 91久久久视| 免费一级a毛片久久久久久鸭绿欲| 久久精品亚洲东京热色播| 亚洲色婷婷久久91| 人妻免费观看| 校园春色综合| 国产91精品福利在线| 欧美一区二区三熟女剧情| 日韩三级一区| 亚洲中文丝袜美腿诱惑字幕| 青青青国产手线观看视频2| 日本美女性生活久久久久久久| 狠狠爱综合网| 亚洲高清在线se| 欧美亚洲综合色| 无遮挡男女激烈动态图| 日韩电影中文字幕| 日韩精品人妻中文字幕久久久| 乱伦1色页| 午夜一区| 人妻精品一区一区三区蜜桃91| 丁香五月偷拍| 亚洲欧美精品福利在线| 99这里只有精品国产| 亚洲极品| 久久国内| 国产精品一区二区麻豆| 日本午夜福利视频| 26uuu欧美| 懂色天天爱天天日天天射天天澡| 国产400孕妇孕交群| 丝袜亚洲91| 日韩少妇丰满亚洲| 男人的天堂2018东京热啪啪啪| 九九探花视频在线观看| 黄片免费久久久久久久| av天堂天堂av日韩| 尤物黄色在线观看网站| 牛牛AV人人夜夜澡人人爽| 日韩激情小说一区二区| 最新三级网址| 亚洲阿v天堂在线| 九九人人操| 人人操人人叉人人插人人| 涩涩这里只有精品视频| 黑人精品一区二区在线播放| 国产亚洲深夜激情| {男男暴菊gay无套网站| CCYY草草影院地址入口| 2020中文在线一区二区三区| 亚洲无吗在线视频| 日本性爱少妇| 日本 成 人 小说 电影 一区二区| 亚洲国产欧美中日韩成人综合视频| 国产精品美女在线一区| 强奸a片网| 国产激情综合五月久久| 日日夜夜草草草| 九月丁香综合网| 日韩成人无码| 久草免费在线一区二区| 久久大香蕉手机高清| 久久久久久AV无码免费网站| 大香蕉AV在线| 亚州综合图片| 亚洲丝袜诱惑| 精品国产乱码久久久久久口爆网站| 亚洲国产精品有声| 99性爱视频| 欧美亚男人的天堂| 999九九九九国产动| 天天欲望网| 中文字幕一区二区免费在线| 激情综合五| 老鸭窝日丰县女人| 亚洲成人免费电影| 激情五月天婷婷| 国模不卡一本二本三电影| 蜜臀在线网站| 自拍偷拍 日韩无码| 亚洲精品久| 亚洲蜜臀视频精品久久| 91性高朝久久久久久久久| 久久精品操| 青娱乐国产精品| 欧美18禁91| 国产9l 大屁股| 欧美福利视频啊啊啊啊 | 97亚洲在线| 国产精品 久久久精品一牛| 亚洲乱熟女一区二区三区大香蕉| 99在线精品视频| 91动漫操逼视频| 欧洲色| 911粉嫩人妻| 蜜臀AV秘一区翔田千里| 久久五月份| 成人精品电影| av凤凰久久久| 女上位精品在线| 国产捆绑一区| 精品射1999| 加勒比aⅴ| 91色婷婷综合久久中文字幕二区| 九九热精彩视频| 国产亚洲精品A在线观看下载| 色色99| 日日夜夜骚| 国产精品蜜臀久久久久无码AV| 人妻美腿丝袜日韩| 亚洲国产婷婷在线播放| 国产精品欧美激在线| 无码操逼视频一下| 大香蕉之青青草原| 国产无套粉嫩白浆在| 亚洲永久永久永久永久一级一级一级精品 | 亚洲欧洲日韩中文字幕一区| 婷婷五月天av| 日韩三级伊人| 日欧毛片久久| 亚洲熟妇自偷自拍另欧美| 超碰超碰超碰超碰的大鸡吧操黑丝袜 | 97色色婷婷| 97精品综合久久| 91丝袜美女| 国产精品 视频| 91成人国产综合久久精品蜜月| 中文字幕一区二区日韩网| 欧美97在线观看| 青娱乐久久艹| 色视频蜜乳| julia ann久久| 噜噜在线| 色五月丁香五月| 天天激情综合站| 美女黄页网站| 91国产丝袜美女| 成人综合色网| 久热伊人| 在线国产一区二区av| 国产精品福利资源在线尤物| 夜夜国产一区| 国产一区二区三区高清视频| 夜夜夜爽www精品视频| 午夜福利在线合集| 外国免费性情大片| 亚洲少妇综合| 俺去啦俺来也久久综合| 97精品免费视频网站| 一区二区播放| 91色射| 青娱乐手机日韩在线视频| 人妻少妇久久久| 精品国产精品一区二区| 亚洲最大网站av| 国产操偷| 亚洲综合中文字幕有码| 亚洲国产一级精品毛一级精品看免费视频| 亚洲国产丝袜熟女av| 天天久久久久久| 1234区中文字幕在线观看_青青草国产在线_日韩一区二区 | 亚洲交性| 手机在线A片| 美女自卫慰黄网站免费| 97久久精品亚洲中六字幕| 九九九九九九九九九五码| 久久亚码| 青娱乐国产剧情av一区| 亚洲精品美女久久久久久久久| 丁香五月激情综合| 久久久久久久久久久久欧美日| 人妻色情天天操| 一区二区三区美女超清| 六九九九| 中文三一区| 亚洲欧美在线观看免费| 67194无码不卡| 九九久精品| 一区AV| 色99在线| 亚洲综合伊人无码久久| 大香蕉五月天婷婷| 蜜臀无码一区二区| 8x福利精品第一福利视频导航| 亚洲操人| 俞拍久久国应视频| 美女黄色一级A视频| 天操天操夜操夜月月年年操操| 强奸乱伦免费网站| 亚洲综合色男人网| 天天欧美欧美亚洲网| 色婷婷狠狠| 日本狂喷奶水在线播放212| 禁十八久久| 18禁在线视频| 日本女厕偷拍| a片偷拍视频| 午夜毛片亚洲精品片国产久久久| 欧美精品99久久久**| 亚洲双插| 亚洲一区二区三区不卡国产欧美| 蜜臀AV一区二区三区激情综合| 日韩操啪| 亚洲福利中文字幕在线| 97色在线观看| 精品无码久久久久| 91在线欧美| 天天插天天插| 欧美亚洲系列| 亚洲小说视频| 操逼无码操逼| 亚洲中文字幕乱码无码一区二区| 97爱爱| 国产极品久久久| 盗摄女人妻在线| 91久久婷婷| 黄片无码在线制服| 少妇综合网| 99re6国产精品99re| 91超级碰| 蜜乳Av成人片网站| 国产色产精品在线观看| 婷婷九月国产| 大香蕉伊人在线成人AV在线观看| 久久高清欧美国产| 草草影院日本第一页| 少妇熟女视频一区二区三区| 国产suv精品一区二区四区999| 福利社区午夜一区二区| 久男人久久| 91日日| 丁香六月综合激情| 操逼日韩无码| 欧美日韩操逼嗦吊| 在线视频免费播放一区| 亚洲 小说 欧美 激情 另类| 天天天干977| 艳尻美人妻| 人人色人人射人人妻| 国内毛片无码一级毛片| 91成人久久| 亚洲综合另类小说色区亚洲成av人片在www| #NAME?| 九久久精品| 欧美色图在线视频少妇| 日韩亚洲97| 91丝袜熟女| 精品十三区| 国产久久久9999| 97内射偷拍| 99热久| 无码又爽又硬又激情免费视频| 亚洲成人福利电影免费| 国产强奸乱伦xd| 国产理论视频在线播放| 美女国产一区二区久久| 国产超碰人人操| 亚洲欧美一区二区三区在钱蜜桃 | 欧美视频第二页| 丝袜亚洲91| 国产成人啪一区二区| 久久嫩草| 很黄很色的视频在线观看| 免费在线黄片视频| 欧美超碰9798| 91欧美巨乳| 麻豆精品一区二区三区四区免费观看| 中文字幕超碰CAO| 一本一道久久综合久久| 被操高清无码视频| 盗摄女人妻在线| 欧美人妻精品| 国产精品在线一区二区| 久久久久久久| a亚洲欧美色欲| 国产 无码 一区二区| 亚洲日韩成人性爱视频| 婷婷精品视频| 欧美色日本| 久久久精| 偷拍偷窥与盗摄视频专区| 国产中文大片资源中文字幕| 精品国产一级久久| 嗯嗯啊啊用力视频免费| 97国产综合欧美| 九九无码| 五月丁香狠狠爱| 99xav| 精品一区二区麻豆| 91视频成人福利网站在线一区 | 屁股久久久久久久久| 91熟女视频| 日韩 欧美 另类 人妻| hd成人一区二区在线| 91女网站| 又大又大又大又粗爽高潮观看| 97超碰欧美精品| 欧美日韩婷婷中文| 日韩欧洲操屄视频| 亚洲 欧美 手机在线观看| 午夜精品一区二区三区三上悠亚| 后入式999| 午夜视频久久久久一区| 亚州乱码中文字幕综合久久久| 97日韩欧美亚洲| 日韩国产欧美伦理在线| 密臀AV在线| 国产亚洲色停停久久99精品91| 五月丁香| 老熟女阿 国产91| 看一级黄色视频| 97在线观看视频| 国产久久天堂资源| 日产操逼| 99精品伊人| 日韩少妇无码| 久久手机好看网站| 永久电影三级在线观看| 精品一区二区三区国产| 精品国产无码中文| 欧美与日韩97| 国内三级自拍小视频在线观看| 啊啊啊啊啊啊啊网址在线观看| 国产熟女完整版中字| 国产免费一区| 久久久久久久人妻| 91看黄片| 欧美丝袜91| 混色激情av| 欧美αv.com| 玖日综合网| 人妻久久久久久久久久久久久久久| 国产区性爱在线视频秋霞豆| 欧美日韩成人在线| 欧美激情色婷婷花野真衣一区二区| 手机在线视频国内精品| 人妻丝袜一区二区三区在线| 久久九七| 国产欧美美女免费观看视频| 亚洲午夜福利在线影院| 丰满人妻区一区二区三| 美国三级日本三级久久99| 亚洲 欧美 中文 日韩超碰| 午夜男人av| 男人亚洲天堂| 台湾佬中文娱乐网久久久久久久久久com | 色诱avtt| 污啪啪啪视频| 黄片视频,下载| 神马麻豆福利院| 亚洲 se图 欧美电影| 亚洲久9| 日韩激情视频| 精品一区二区三区最新| 强奸xx国产| 国产精品久久久久无码AV会牛| 欧美亚洲天堂| 欧美18老人禁| 亚洲福利影院一区久久| 日韩中文字幕宗合在线| 国产久久男人天堂| 日本不卡二区| 99re视频在线播放青草| 97在线观看免费| 亚洲色图 91| 97超碰国产亚洲精品| 中文字幕二区| 91宗合网| 一级片视频啪啪| 欧美gv在线观看| 日韩免费福利在线观看| 久久美女国产| 宅男91视频在线播放| 国产又猛又粗又爽又黄| 男人综合网| 不卡在线观看视频| 日韩激情啪啪啪| 免费人成?大片在线播放| 国产免a费看黄片在线| 熟女精品va中文字幕| 动漫爆乳3D奶水一区在线观看 | 大香蕉99re| 久操精品| 国产黄色av大片网站| 婷婷伊人| 人妻天天爽| 丰满少妇一区二区三区免费看| 国产在线播放成人免费| 亚洲精品无码久久AV| 欧亚性爱视频免费看| 久久精品视-一级做a爰片性色毛片16美国-中国女与老外在线精品 | 熟女视频久久| 人人超碰在线观看黄| 精品久久久久av影院| 91精品亚洲内射孕妇| 欧美顶级黄色大片免费| 无码heyzo高清一区| 久久99手机免费视频| 麻豆天天躁天天揉揉AV| 精品日韩中文在线| 99热免费精品| 精品九九九九九| 欧洲熟妇xxXx欧美老妇裸体| 日本熟人妻中文字幕在线|...久久国产精品-国产精品_日本一区二区三区中文字幕 | 久久精品中文字幕女同| 男人女人18禁片免费看网站| 97在线精品| 性生活无遮挡纯毛片在线看| 91综合熟女| 亚洲最新中文字幕免费| 九九Av| 91久久堂| 成年人黄色小视频网站| 久久久免费懂色| 操逼逼中文字幕| 公司1区2区3区精产精| 5月婷婷6月六月丁香| 黑丝制服中文字幕| 肥臀熟女福利视频一区二区| 女同女同恋久久级三级| 97久久久久久久久久| 99操视频| 亚洲伊人a线观看视频| 亚洲欧洲激情| 有码人妻系列| 99ri在线视频| 国产亚洲精品美女久久久久久2021| 99re6在线视频精品免费完整版安卓版| 亚州操逼网| 东京热一区二区中文字幕| 青青草乱入乱欲视频在线观看| 亚洲熟女性高潮久久久| 国产视频第二页| 秋霞一区二区三区四区五区六区七区| 97人人草| 啪一啪免费视频| av亚欧| 精产品久久| 1.igao73.com 加入收藏 免费专区 国产精品 中文字幕 日韩精品 欧美精品 精彩 | 岛国1区2区3区在线观看| 又大又黄国产| 久久久久久久久久久六六| 在线视频资源| 久久久九精品| 在线情色电影 91大| 91人妻视频在线| 动漫爆乳3D奶水一区在线观看| 国产无码精品高清| 午夜美女福利视频| 久久区| 亚洲欧洲日韩中文字幕一区| 欧美日韩人妻婷婷一区| 中出789在线视频| 99青草| 91亚·色| 精品视频123区小说区| 99久久婷婷国产综合精品草原| 熟女精品va中文字幕| 99在线免费公开视频| 久久国产逼| 日韩免费在线观看不卡| 亚洲无码国产探花在线观看| 亚洲熟女乱色一区二区三区| 少妇一级婬片免费放一级a性色.| 久艾草在线精品视频在线观看| 超清中文乱码字幕| 你懂的在线观看区国产| 97在线精品观看视频| 被男人添B超爽视频| 密乳AV免费观看| 欧美一区二区观看在线| 五月综合激情网| 亚洲 91 在线| 97一本大道亚洲一区| 加勒比久久av| 超碰成人人人爽人人爽| 一级aaaaa欧美中文字幕录像片| 日韩欧美午夜视频在线| 91麻豆天美国产欧美日| 91久久久老司机| 亚洲中文字幕熟女少妇一区二区| 极品内射| 国精品一区二区三| 久久久久密臀一区二区| 91精品国| 中文字幕五月婷婷免费| 亚洲日韩精品一区视频在线| 日本加勒比无码专区| 欧美亚洲色图另类国产| 亚洲熟妇极品| 一卡二卡三卡| 亚洲成?V人片在线观看福利| 91肏屄网| 偷拍视频青青草在线视频| 啪啪视频亚洲第一| 久久久蜜桃一区二区三区| 日本精品免费一区二区三区四区| 亚91网| 亚洲一区二区中文字幕| 日日摸日日碰| 国产av又色又爽又黄| 97精彩视频网站| 欧美自拍网| 五月婷婷爱六月丁香色| 超碰69| 久久精品—区二区三区内射| 国语av最新自产拍在线观看| 婷色五月天| 天天综合~91| 小日子操bb在线看| 午夜精品久久久久久久99热影院| 一级做a爰片性色毛片久久| 午夜久久一区二区无码中出 | 超碰1024久久| 十八禁的黄污污免费网站| 日本999精品| 999亚洲国产视频| 91激情综合| 亚洲乱熟女一区二区三区大香蕉| 欧美日本天堂| 大香蕉黄色一区| 91丝袜人妻| 少妇69中文| 久久久男人的天堂| AV在线性爱| 999熟女精品| 久久草在线综合视频| 天天天天做夜夜夜夜做| 日韩色欲久久一二三四区| 骚鸭AV| 九九毛片这里只有精品| 久久五月天婷婷丁香中文字幕| 啊啊啊啊啊啊啊在线| 伊人久久大香线蕉无码| 亚洲三级。日韩三级| 亚洲AV高潮| 人人扣人人操| 中文字幕精品一区二| 久久天堂网| caopeng97人妻| 东京热视频网| 亚洲高清视频在线免费观看| 97香蕉人人乳| 人妻熟女字幕一区二区| 18禁的网站在线| 插入逼91| 九九九九精品九九九九| 国产精品午夜精品| 欧美大干日韩| 91在线页| 天天拍天天操| 国产精品亚洲一区二区三区四区| 校园春色AV天堂| 天天操熟妇| AV色五月天| 丝袜无码a片| 肥臀熟女福利视频一区二区| 大香蕉黄色一区| 国内精品久久国产,www香蕉久久五月丁香,亚洲欧美日韩精品永久在线,日本精品一 | 97国产|免费| 伊人久久亚洲色欲综合网站| 色婷婷在线视频精品导航| 日本久操视频| 日日干夜夜欢| 91超碰丝袜制服| 九九久久久九九| 欧美三级一级| 加勒比东京热五月天天堂网| 亚洲婷婷五月天| 亚洲一区中文字幕一区| 色妇综合网| 无毛精品| 欧美丝袜亚洲| 色五月AV在线| 欧美综合自拍亚洲综合图| 狠狠2050在线观看| 加勒比海成人视频网 | 97国产天堂岛| 欧美精品三区| 超碰97极品9| 麻豆久久一区二区三区| 欧美性爱一区二区三区| 日韩亚洲中文有码视频| 亚洲黑丝在线| 中国女人内射6XXXXX| 日韩美女高潮喷水视频| 嗯啊不要啊在线 | 欧美不卡在线一区二区| 亚洲天堂第一页| 亚洲AV成人精品网站在AV| 久久男人网| 亚洲精品成人动漫在线| 亚洲欧美另类少妇精品| WWW啪啪的com| 97久久国产精品| 欧美成人黄网色网站| 人妻蜜桃臀| 五月天黄色激情视频| 亚洲国产福利视频| 精品妇女一区二区三区| 国内亚洲高清无码| 青草视频人妻在线观看| 一区三区啪啪| 天天欲望网| 欧美色三级片91| 精品国产91av一区二区三区| 久久中文字幕女同性恋一区| 成人性爱美曰韩| 男人的天堂1024| 超碰色中文| 亚洲蜜桃V妇女| 躁躁躁日日躁2020| 综合天天网| 久久婷婷五月天| 人妻啪| 日韩一级片在线看| 草草影院最新网址| 国产www色在线观看| 夜夜影视四色| 刺激性视频黄页| 日本三级A片网站com| 国产美女高潮视频| 午夜天堂精品久久| 婷婷综合久久| 日韩精品一区二区日韩| 天天狂操夜夜狂日| 夜夜操中文字幕| 色色色色色色色色色色色色色色综合 | 97色碰| 91无码人妻| 午夜福利久久久噜久噜久久综合| 国产成人无码高清| 91P0RNY大屁股人妻| 熟女一区二区三区| 日韩97超碰中文字幕| 色婷婷日韩精品一区二区三区 | 大香蕉乱伦视频网| 大香蕉性欧美| 久久超碰日韩精品| 男人的天堂久久狠| 亚洲淫乱骚妇AV| 日日干夜夜干| 天天看夜夜看日日干| 日逼逼免费看| 久久久久国产无av| 91人妻视频在线| 97欧美色综合| 亚洲丝袜综合| 国产性爱在线视频一区二区| 国产无码一二三区| 婷婷视频网| 欧美五区| 久夜操| 日本欧美韩国国产在线| 欧美丝袜美女电影一二三四区| 婷婷综合| 激情av| 高清在线偷拍自拍视频| 再深点灬舒服灬太大了添视频 | 成片免费播放| 亚洲二区精品在线观看 | 日欧美色| 日韩99神马视频片| 日韩天堂av电影在线观看| 志村玲子视频一区二区| 狠狠色丁香| 啪啪啪综合网| 五月激情天| 极品色社| 91天堂色男人的天堂| 天天综合香 ld视频| 97爱碰| 最新亚洲黄色免费电影| 色色香蕉| 欧美日韩免费专区在线| 蜜臀一二三区| 免费1级a做爰片观看| 正在播放:深夜激情大战,自带黑丝袜全力输出骚穴 | 亚洲国产熟妇综合色专区| 青青操在线亚洲视频观看欧美在线| 97人人草| 久久久久久久久久久人妻| 欧美日韩免费专区在线| 试看福利| 熟女欧美日韩综合婷婷| 亚洲有码第一页| 久久妇| 992大香蕉| 天天综合网网欲色| 午夜福利1区2区3区| 91影库| 色婷婷丁香| 无码聚合| 又黄又爽在线观看视频| 熟妇熟女一区二三区| 牛牛久久国产精品视频一二三 | 中文字幕国产| 狼人久草| 亚洲综合113页| 午夜AV污污污| 欧美日韩色| 超碰97人妻免费在线| 92福利社视频| 天天射夜夜| 精品毛片av一区二区| 91精品人妻一区二区三区蜜桃臀| 婷婷丁香人妻 | 亚洲91亚洲| 九九九影院| 欲色综合| 国产又黄又爽又刺激久久久久久| 亚洲强奸乱伦影视网| 亚洲丝袜色| 伊人久久亚洲中文字幕不卡| 欧洲中文字幕| 欧美色图电影| 殴美,日韩国产伦精品| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区 | 欧美熟妇操操视频| 成全在线观看免费观看| 天堂伊人久久| 免费?级毛片无码?∨蜜芽试看| 日韩传媒在线| 国产AV激情无码久久无码| 91男同| www.色操逼| 欧美在线|亚洲| 亚洲成人在线播放| 大肥女高潮bbwbbwhd视频| 1204av韩国| 九九香蕉网| 自拍偷拍第26| 蜜臀va69| 97超碰天天爱天天爱| 思思热影视| 中文一区二区三区影院| 91国产在线精品| 一区二区三区四区色图| 国产一区二区三区白丝| 视频黄站| 超碰久热| 日本羞羞的视频在线播放| 色婷婷淫色网| 国产男人又猛又粗又爽| 99久久99九九99九九九| 男人下部插入女人下部| 亚洲精品乱码线路中文字幕| 日韩人人精品| 亚洲欲色9532548967一区| 亚洲精品国产无码高清| 天天澡天天爽日日av| 99日精品欧美国产| 操碰97| 久久久96精品| 久久精彩视频9| 成人AV超碰免费在线| 国产精品夜夜夜| 日本熟人妻中文字幕在线|...久久国产精品-国产精品_日本一区二区三区中文字幕 | 91中文字幕| 人妻天天爽| 国内毛片免费h片在线| 天天射夜夜操| 欧美日韩中文字幕不卡| 国产精品久久久久久久久久久久久久久久 | 最近的最新的中文字幕视频| 欧美日韩丝袜| 国产视频人人网| 亚洲欧美色综合| 逼操网站| 色97欧美| 在线人妻熟女一区二区三区四区五区| 欧美性生活男人的天堂| 欧美少妇色综合| 国产免费一区在线观看| 久久久人妻| 欧美色天堂网在线视频| 国产精品岛国片在线观看| 精品夜夜澡人妻无码AV| 成人无码专区精品视频| 操逼啊啊啊91| 97碰碰色| 精品96久久| 99视频内射三四| 日本人妻伦在线中文字幕| 97干综合网| 日韩另类色图| 国产黄片在线免费观看| 国产精品农村妇女| 超碰中文字幕人妻草一区| 看一级黄色视频| 欧美亚洲国产91在线| 情色五月天就去干| 国内精品久久国产,www香蕉久久五月丁香,亚洲欧美日韩精品永久在线,日本精品一 | 久久老子无码午夜伦不卡| 久久无码电影| 熟女人妻一区二区三区| 日韩av在线免费网站| 国产 无码 一区二区| 萌白酱自拍视频| 日韩色欲久久一二三四区| 婷婷色色五月| 人人操人人摸人人看人人插| 大香蕉伊人75| 人妻激情在线视频| 91暧暧| 国产67194| 精品九九国产无码| 国产深夜福利| 91黄射| 久久久久亚洲一区女同性恋中文字幕| 婷婷视频网| 国产69精品久久久久99尤物| 尤物av网站免费在线播放| 亚洲自拍小说| 免费99精品国产自在在线| 九九九九九九亚洲| 日韩久久三区| 日本国产成人亚洲精品无码| 精品成人无码| 一级乱伦网站| 国产精品视频播放| 亚洲AV乱码专区国产噜噜亚洲| 亚洲国成人情色好看电影| 亚洲天堂日本| 殴美色网| 人妻色偷色噜| 国产高清MV操逼视频| 六十路日本| 国产日本熟女顶级一区二区三区视频| 亚洲色图加勒比| 九九九九97| 青娱乐91| 日本免费中文字幕在线| 国模吧 一区二区三区| 激情综合97| 97资源免费视频| 夜夜春夜夜操| 国模精品一区二区三区苹果色戒| 亚洲第一精品在线视频| 国产精品久久妻无码网站| 亚洲高清视频在线免费观看| 亚州综合| 欧美激情久操网| 亚洲成a人v欧美综合天堂下载| 中国特猛少妇色xxx| 躁躁日曰躁2020| 精品人妻少妇| 成人精品久久久午夜福利| 超碰三级秋霞| 女人妻一区| 天天综合欧美综合| 在线观看A啊啊啊| 操死我了嗯嗯嗯| 日噜夜夜夜夜夜夜夜夜夜夜爽爽爽爽爽爽爽爽爽爽爽爽 | 亚洲制服欧美另类内射| 一区二区三区视频在线观看免费| 久久久99久9| 黄页网站成人免费| 欧美偷拍区| 亚洲精品男人的天堂| 国产视频第2页| 91网站18| 国产精品久久久久久久久AV大片| 婷婷伊人一区| 久久精品国产亚洲粉嫩| 岛国黄| 久久发布国产伦子伦精品| 欧美综合色综合| 收看日本人日bb| 国产后入精品| 精品大全99999| 草草影院最新网址| 亚洲情色五月天 | 天天天天做夜夜夜夜做| 精品国产乱码久久| 亚洲AV成人在线| 国产人妻精品一区二区三区秋霞 | 91天堂丝袜美腿| 99热这里只有精品99| 日本一区二区三区精品| 五月开心久久AV官网| 99热精品在线观看| 色哟哟 日韩精品| 欧美日韩操逼动图| 免费夜夜爱黄色视频毛片| 色噜噜人妻丝袜AV资源| 亚洲人精品久久久| 国产高清亚洲日韩一区| 2021久久国产综合精品青草| 噜噜在线| 伊人aaa| 亚洲色图欧洲| 日本一级婬片试看三分钟| 五月婷婷无码| 97超碰久| 一区二区三区四区理论片| 日韩中文字幕视频| 国产精品电影| 性性久久| 欧美激情专区| 国产综合久久久麻桃个 | 日韩福利电影网| 熟女丰满人妻一区| 91视频综合网| 国产怡红院| 欧美性爽xyxOOOO| 欧美人妻二区三区| 日韩性爱啪啪视频| 欧美色图私拍91| 91av一区二区在线观看| 国产盗摄美女如厕大神作品在线观看| 69视频入口| 天天看人人操屄犊摸阴| 久久久久久国产成人| 伊人一区二区三区| 天天操夜夜操狠很操| 探花一区在线| 五月丁香影院| 日本 情色 1区2区3区| 成年人三级黄色片视频| 伊人五月天青青草婷婷| 日韩欧美三级| 高跟丝袜AV专区国产| 91美女在线视频| 97在线免费视频| 亚洲天堂,男人| 亚洲操操操无码| 婷婷视频在线免费观看| 欧美国产有色电影| 欧美爱三级日韩久久| 激情四射婷婷四五月天| 久久久啊啊啊| 日韩性爱网址| 日本精品一区二区三| 最新中文字幕精品在线| 亚洲情色在线| 操B视频日韩无码| 中文字幕天天天天天| 91色综合| 在线女人91| 91美女在线观看| 日韩精品区二区三区不卡| 91中文字幕在线观看| 亚洲成人性爱在线观看| 亚洲。天堂。日本在线观看| 欧美强奸乱能| 成人一区二区三区四区| 国产精品熟女九色九色蜜臀| 国产精品网站www| 人人操人人摸人人看人人插| 九九夜精品九九在线| 性久久久| 欧天美中出| 双插性欧美一二三区| 久久同城AV| 五月天玖玖资源站| 拍拍拍拍大尺度黄色三级片拍拍拍拍拍照 | 免费的黄片wwwwww| 免费男人的天堂| 人人摸人人入| 三级网站超变态精品| av国产无码| 午夜视频久久久久一区| 亚洲AV永久无码精品成人调教| 亚洲、日韩、综合、另类| 亚洲一卡2卡3卡4卡乱码网站| 啊啊啊啊好爽好舒服一区二区易域| 欧美日韩婷婷中文| 成人五月香网在线| 日本成人电影资源网| 亚洲?V高清一区二区三区尤物| 黄久在线| 欧洲Au麻豆| 99欧美| 黄片色区软件| 日韩国产精品人妻无码久久久| 久久网亚洲| 91成人国产综合久久精品蜜月| 桃色五月天| 精品无人区麻豆乱码1区2区图片| 国产精品成人福利在线| 久久久免费高清中文视频| 伊人综合色网| 被男人添B超爽视频| 亚洲 欧美 日本 国内 首页| 后入美女国产| 免费观看国产小粉嫩喷水精品午| 综合五月婷婷亚洲一区| 亚洲欧美经典一区二区| 另类图片天天影视| 狠狠图片青青草| 日本中文字幕在线电影| 秋霞男人网| 精品高清一区二区三区三州| 久久专区| 99999国产精品| 国产国产亚洲一二三久久| 天堂网 主播 亚洲| 粉嫩少妇自慰在线| 91亚洲不卡一区| 啊啊啊不要好疼视频| 亚洲夜夜欢无码一区二区| 一级特级aaaa毛片免费观看| 国产又色又粗又黄又爽| 久久久96| 免费国产视频| 色臀AV| 992视频一区| 色九九久九九| 亚洲精品 欧美97色色| 亚洲在钱| 激情婷婷丁香| 精彩久久中文| 蜜臀av中文字幕| Aa东京男人的天堂| 亚洲电影91| 中文字幕、久久精品国产2020、久久综合久久自在自线精品自、亚洲 | 亚洲精品九九九| 风月影院男女十八禁| 欧美性后入| www.婷婷五月天| 亚洲制服欧美另类内射| 日韩免费高清大片在线| 九九热三级片| 伊人久大| 日日噜噜夜夜久久亚洲一区二区| 日本一二区免费| 狠狠操狠狠爱| 亚洲AV无码国产精品久久久久| 亚洲国产第一页综合视频| 亞洲久久直播| 亚洲A曰本VA欧美VA视频| 久久伊人影院| 成人九九| 人妻喷水| 亚洲91射| 欧亚日本情色| 97超碰人操| 国产盗摄美女如厕大神作品在线观看 | 日韩av色图综合| 亚洲国内精品成人不卡| 东京热99999| 精品十八在线观看| 天美传媒精品一区二区| 欧美真人抽搐一进一出gif | JuliaAnnXXX888| 中文字幕在线观| 一级岛国大片| 操比国产| 一色网男人的天堂| 男人 天堂 日 亚洲| 97久久国产亚洲精品超碰热| 九久久精| 亚洲麻豆av一区二区| 久久久久久日韩| 五月丁香综合啪啪| 九九久久首页| 1024午夜激情男人的天堂| 97资源亚洲| 久久久久久国产成人| 国产伦乱91| 青青草九九九九九| 国产妇女精品视频青青草| 欧美97网| 极品内射| 欧美亚洲丝袜美女电影| 久久夜嗨| 99热日| 78m成人视线| 99re免费| 国产无码高清操逼视频|