色五月色开心色婷婷色丁香,五月婷婷丁香花综合网,婷婷丁香五月激情综合在线,五月婷婷六月丁香动漫,婷婷丁香五月激情综合在线,丁香花中文字幕在线观看,播五月色五月开心五月网,开心激情综合网,狠狠色丁香婷婷综合最新地址,丁香视频在线观看,狠狠做六月爱婷婷综合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
返回資訊列表
久久久爆乳翘臀一线天伦理视频| 综合亚洲网| 多毛小伙内射老太婆 | 韩日色费| 人妻天天爽夜夜爽2| 久久香蕉网| 日本性爱欧美性爱| 国产高清自拍视频| 人妻熟女一区二区在线视频| 9999九九九久久久| 欧美图片色综合| 久久久中文| 成人免费不卡在线视频| 家庭乱伦国产| 老熟女乱伦一区| 97亚洲在线| 色五月av| 九九久久玖玖| 亚洲第一狼人丝袜美女另类| 国产精品免费1区2区视频| 97综合激情| 久久精品国产精品| 无码操逼天堂| 亚欧美综合网。| 草b在线| 激情婷婷五月天| 精品区国产区一区二区三区| 国产大学生高潮在线播放| 亚洲无码太久| 欧美十八禁导航成人| 国产精品日本无码A片| 亚洲熟女人妻中文字幕一区二区| 亚洲成人在线乱码色午夜| 91熟女视频网| 欧美后入式| 欧美91色| 久久久免费高清中文视频| 2019亚洲男人天堂| 啊啊啊啊,啊啊好多水| 东京热熟女亚洲视频网站| 麻豆性爱视频在线播放| 97玖玖超碰| 日韩欧美成人大香蕉| 精品精品精品| 日韩AV一区二区三区三州三州| 狠狠干狠狠干| 亚洲伊人久久精品狠狠在线| 自拍丝袜美腿人妻| 97国产|免费| 99re免费| 亚洲人妻在线一区| 日韩少妇丰满亚洲| 91性网| 国产强奸91| 午夜视频好爽啊| 日韩午夜精品一区二区三区电影| 国产懂色精品国产av| 99操视频| 99999精品成人| 天天天肏屄欧美| 熟女AV一区| 伊人性在线视频| 一区二区三| 成人av影院在线观看| 亚洲高清无码AAA久久久精品| 亚洲97久久精品亚洲| 婷婷色导航| 老女人日韩美91| 欧美大片一区二区三区| 亚洲三区视频| 嗯嗯啊啊好疼| 日韩99999| 激情网色| 有码人妻系列| 精品一区99999| 亚洲婷婷综合网| 亚洲精品无码久久AV| 久久激情五月| 国产精品另类一区大香蕉| 久热一区二区| 天天日日夜夜| 在线播放中文字幕| 日韩有码 一区二区三区| 激情无码日韩| 强上我不卡卡| 美女t无毒不卡不卡| 日本十八禁免费看污网站| 五月丁香社区婷婷日韩欧美精品影院| 欧美国产成人在线| 欧美人与性动交a美精品| 男人的天堂亚洲| 超碰欧美在线欧美| 视频在线观看免费一区二区三区| 欧美黄页在线| 91老司机视频| 天天射,天天操,天天爽-国内精品一区二区三区-成人AV | 思思视频免费看网站| 亚洲中文字幕网| 99re在线精品78| 国产精品福利资源在线尤物| 2024人人操人人摸| 欧美色图电影| 91jk色拍| 操比国产| 亚洲欧洲日韩中文字幕一区| 91狼人| 熟妇高潮二区三区| 久久欧美性爱视频| 伊人麻豆传媒| www.男人天堂| 人妻中文字幕日韩电影| 941超碰| 91精品国产日韩欧美综合| 亚洲欧洲小说图片视频 | 国产区性爱在线视频秋霞豆| 亚洲蜜臀懂色| 蜜乳AV一区| 色偷偷色偷偷欧美日韩| 2024人人操人人摸| 97久操| 探花激情视频| 亚洲 日本 不卡| 免费看A片毛毛片在线播| 国桃视频产巨乳精品一区二区在线| 立川理惠被中出无码| 久热超碰| 91人精品妻入口| 亚洲国产综合久久久性感熟妇| 亚州性9| 丁香六月婷婷综合| 97在线免费观看| 九月丁香婷婷| 国产一区二区免费福利片| 97色冈| 五月亭亭六月丁香| 久久久久9999妇女| 国产亚州高清国产拍精| 久久婷婷苹果| 欧美美女自慰一区二区三区| 超碰成人人人爽人人爽| 北京美女一区二区| 日韩不卡毛片Av免费高清| 国桃视频产巨乳精品一区二区在线| 国人欧美精品一区二区| 91热| 久久偷偷色综合蜜桃| 亚洲精品人妻吞精av| 亚洲不卡一| 91操操| 亚洲第一页第二页激情| 91精产一区二区三区| 久久艹逼视频| 国产真乱mangent| 久久伦理视频久久大香蕉视频| 8050午夜少妇无码| 八戒午夜福利理论片| 青青草玖玖爱| 超碰97爽| 丰满人妻av一区二区三区| 国产91 丝袜在线播放| 日韩不卡码| 国产无套粉嫩白浆在| 伊人麻豆传媒| 超碰97人人乐| 欧洲一区二区三区免费| 亚洲人人操| 午夜福利激情在线视频| 91中文字幕| 亚洲人妻中文在线视频| 不卡六六在线91| 亚洲色图加勒比| 久久婷婷热| 亚洲第一免费视频| 99re免费视频精品全部| 天天综合网~91| 国产精品乱码久久久、久久| 91精品婷婷国产综合久久竹菊| 狠狠五月天| 亚洲欧美在线观看免费| 成人26uuu| 97亚洲综合在线| 91欧美性| 青青欧洲黑| 天天操av懂色| 五月激情小说| 伊人久久艹| 乱伦Av网| 丝袜美腿制服人妻二区中文字幕| 再深点灬舒服灬太大了添视频 | 国产精品国产自产拍高清AV| 色情五月综合婷婷| 國產尤物AV尤物在線觀看| 欧美一二三级精品在线| 九九九九热| 96久久久久久久| 国产吹潮女在线观看| 白丝少妇一区二区| 欧美情色贴图| 极品粉嫩少妇视频| 色综合加勒比四四季| 精品久一区免费| 亚洲人成网www| 99视频内射三四| 国产日韩在线播放| 99热只有这里有精品| 成全在线观看免费观看| 国产精品毛片?v一区二区三区| 日本韩高清无砖码22o| 国内精品99999| 一区超碰一区| 67914在线兔费成人视频| 亚洲久草AV色图| 日韩不卡一二三四| 国产乱码久久久| 欧美后入式| 97在线观看免费| 欧美精品欧美精品系列| 97超碰中文在线| 2020中文字幕在线观看| 亚洲欧美天堂| 超碰精品日韩欧美国产| 日婷婷| 亚洲精品xxx| 国产精品欧美日韩久久| 狠狠 91| 99热亚洲天堂| 久久国语| 综合亚洲欧美| 毛片一区二区| 最新日韩黄片| 10000部十八禁看电影| 欧美 日韩 国产传媒| 精品一二三区四视频| 2003天天干夜夜操| 91亚洲欧美| 岛国网址国产| www.婷婷五月天| 午夜精品久久久99| 91少妇高潮| 亚洲av青草久久一区二区| 强奸乱伦AV网址| 人人操人人大香蕉| 欧美 中文字幕 一区| 日韩人妻精品中文字幕| 丰满人妻一区二区三区四区| 一级岛国大片| 干B网| 欧美九9 9 9| 亚洲天堂无码| 天天天乱色综合全| 91激情| 欧美激情综合色综合啪啪五月| 精彩视频日韩| 少妇一区二区三区| 99在线精品视频| 99久久久| 激情小说五月天| 亚洲黄色电影| 操久久久久久| 国产精品操| 久久亚洲不卡| 另类图片综合| 二区熟妇韩日| 日韩av不卡在线看| 超碰在线1234区| 亚欧Av| 欧美午夜熟妇黑人精品91| 久久精品国产亚洲AV先锋| 国产乱人伦AVA麻豆软件.| 久久人妻一区二区三区高清| 国产极品一区二区三区三州| 久久风骚城市| 可乐操在线| 超碰九7免费| 岛国大片国产| 久久久久久久久9| 美女露胸露奶头| 狠狠穞A片一區二區三區| 日本Xx性爱| 欧美一级特黄淫片在线观看| 黑人狂躁日本妞一区二区三区| 爽极品影院| 亚洲一本色道中文无码aV天美| 精品性爱一区二区| 日韩午夜啪啪视频| 天天欧美欧美亚洲网| 久久αⅴ| 丁香婷婷色五月| 国产三级资源在线观看| 老女人爆菊| 免费的很黄很污的全部视频| 好涩综合| B049AV在线播放| 粉嫩国产精品久久粉嫩| 欧美性爱伊人| 99九九久久| 熟妇人妻丰满久久久久久久无码| 国产农村妇女精品1区二区| 人妻 中文 日韩| 午夜性生活av免费在线看| 99热日| 日韩操逼性鲍| 五月天婷婷小说| 久久男人网| 天天看精品动漫视频一区| 黄片不用下载在线观看| 日本操逼视频免费| 中文字幕精品亚洲熟女| 好湿好紧好爽 视频| 国产欧美岛国精品一区| 天天看天天干| 91香蕉国产尤物视频| 嫩草 人人网精品| 九九色热| 中文字幕成人| 综合色图区| 亚洲天堂无码| 亚洲天堂 视频你懂的| 无码区蜜乳| 欧美色欧美| 蜜臀AV午夜精品久| 中文字幕视频二区| 国产精品另类| 天天日天天干少妇日| 日韩AV噜噜噜一区二区三区四区| 日本新免费二区三区| 极品粉嫩少妇视频| 亚洲欧美日韩中文久久自慰| 秋霞一区二区三区四区五区六区七区| 色鬼在线综合| 色超碰综合| 日产国产精品中文久久婷婷| 区一在线观看| 狠操91,com| 国产欧美日产一区二区三区 - 国产欧美日 | 超碰91在线| 丁香婷婷啪啪| 国产精品久久发布| 久久久久密臀视频| 殴美色网| 亚洲无线码欧洲精品区别| av日韩国产一区二区| 蜜乳Av成人片网站| 91Chinese在线| 蜜桃视频精品一区二区| 麻豆九九九| 精品人妻视频一区二区在线播放| 欧美午夜熟妇黑人精品91| 手机在线大香蕉| 欧洲黄色网| 国产强奸超碰AV| 婷婷四五区| m欧洲一级午老| 97国产精品一区| 亚洲免费成人在线高清无码视频| 欧美精品偷拍| 四虎免费视频| 国产精品成久久久久午夜午夜| 欧美日韩国产高清在线一二三区 | 久久青青草在线视频| 久久综合日韩亚洲欧美| 欧美久久人体| 亚洲精品国产专区在线观看| 亚洲中文制服诱惑| 男人的天堂在线| 欧在线一二区| 九九热AV| 88在线一区二区三区| 天天色天天干天天爱| 日韩人妻大香蕉| 国产拍偷精品网站| 精品久久視頻在线| 四虎精品一区二区| 啊视频在线| 色97综合中文字幕| 国产人伦a片信息免费片| 啊啊啊想要| 蜜乳性色无码专日粉嫩骚逼AV| 欧美激情片一区二区| 欧美春色| 麻豆 欧美 日韩| 亚洲天堂加勒比| 天天做天天爽| 欧美不卡五十路| 色香综合| 日韩成人色图| 秋霞免费无码视频日韩A片| 91N五十路| 日本媚薬中文字幕在线| 国产美女高潮叫床视频| 九九九国产精品| 国产精品无码论坛| 美女诱惑一区| 狠狠图片青青草| 国产资源中文字幕在线| 午夜激情床戏激情| 欧美日本中字另类在线| 天天射夜夜| 日本操BAV| 女优大全 - 91n| 在线 亚洲 网爆 自拍| 精品九九国产无码| 欧美97免费| 嗯~啊~快点 死我视频| 九九精品99| 97欧美综合网| 嗯嗯啊啊好大好爽| 天天操av懂色| 狠狠综合网| 波多野结衣AV无码一区| 狠狠激情综合狠狠操中文字幕| 综合欧美色图| 东北操逼| 91AV老熟女视频| 國產尤物AV尤物在線觀看| 国产97在线视频| 亚洲青青草| 日本道久久综合色色| 男女做爰猛烈动高潮A片免费应用| 久久精品中文| 欧美变态激情网| 久久最新免费视频23| 日本操BAV| 岛国视频一二三区| 一区二区免费电影久久| 亚洲精品九九九| 久久人| 国产成人五月天丁香花| 中国熟妇| 精品视频一二三中文| 欧美色九九| 亚洲五区熟女| 97av,com| 男人天堂毛片| 好爽免费视频| 午夜福利1区2区3区| 97欧美超碰| 大香蕉日韩| 欧美不卡在线美女| 麻豆天美传媒在线视频天堂| 黑人中出21连凳花野真衣| 天天综合香 ld视频| 2000亚洲男人天堂| 蜜臀th| 综合亚洲欧美| 久久性爱精品一区| 欧美性爱一级操| 东京热免费视频| 小草精彩毛片| 搡老女人老91妇女熟女| 超碰美国| 无码抄逼网| 中文字幕一二三区| 蜜臀久久99'精品久久久| 97资源久久| 亚洲日本大香蕉1| 91天堂丝袜美腿| 91一区二区三区蜜桃| 91色堂| 欧美懂色综合网| 国产精品呦一区二区三区| 99热官网| 欧日韩一二三f区| 国产乱伦亚洲| 婷婷香蕉欧美在线一区二区三区| 欧美日韩另类激情图片| 中文操逼字幕| 丁香五月偷拍| 91麻豆天美传媒HD| 久操97| 中文字幕在线观看网址| www.色婷婷.com| 欧天美中出| 91被操| 久久免费中文字幕在线观看| 日韩欧美中文日韩欧美色| 国产视频三区四区| 丰满熟女一区二区三区在线播放| 淫纸中9区| 亚洲AV操| 凹凸 69堂 在线播放| 欧美黄色大片在线观看 | 超碰人人妻| 一级啊性爱在线视频| 最新亚洲风情电影| 欧美天天综合网版| 另类欧美| 婷婷五月av| se..亚洲欧美| 有码人妻系列| 久久人妻无码毛片A片麻豆| 国产美女自拍AV| 综合 青草 伊久久 影院 综合 | 在线日韩日本亚洲国产| 新久久AV| 久久久精品中文字幕麻豆| 91欧美亚洲| 久久精品欧美一区蜜桃| 中文字幕日韩专区精品系列| 麻豆 亚洲 97| www超碰| 一级毛片电影免费看| 九九英色视频| 日本日皮视频逼| 天天操天天舔| 亚洲熟久久| 亚洲免费看片| 久久riav中文精品| 99rre在线精品99re8| 天天日老熟妇| av国产无码| 两女互慰AV高潮喷水在线观看| 天天爱综合网| 四虎视频在线观看| 精品久久久一本一道| 天天射网| 色墦五月丁香| 精品国产www久久| 日韩一级久久毛片| 男人的天堂com| 久久超碰98| 91肏屄网| 精品网站9999| 激情99| 超碰99热| 探花一区在线| 国产女性无套 免费观看| 中文字幕AV乱伦| 国产深夜福利| 九九伊人网| 欧美色图91| 中国91AV| 97免费视频在线| 我要色综合网站| 日本道人妻久久久在线不卡色视频| 欧美综合 站| 吉田爱美AV在线| 少妇人妻精品| 欧亚久久偷拍视频| 欧美五区| 亚洲诱惑天堂| 天天cao在线| 蜜臀AV午夜精品久| 91丝袜在线观看| 久久的免费性爱视频| 免费AV中文网在线观看| 26uuu成人影片| 操逼免费视频无码国产| av凤凰久久久| 四月丁香婷婷| 日本天天干天天日一区| 欧美懂色综合网| 亚洲日韩精品久久久久一区壹牛| 欧美成熟性爱精品| A片 AV一级在线播放观看免费| 五月丁香综合| 色香在线| 中文乱码99| 日本精品性生活久久久| 91免费看中出视频| 国产精品不卡一区二区三区av| 久久亚州精品成人Av无| 性爱精品一区| 中文字幕视频一区视频二区| 啊好爽受不了无码| 高潮毛片无遮挡高清免费| 日本久久网| av网站免费看| 可以免费观看的av| 亚洲情色综合| 亚洲高潮少妇| 国产日产精品久久快鸭的功能介绍| 色阁阁AV综合网| 亚洲蜜乳av| 午夜精品久久久久久久第一页按摩| 神马福利久草| 超碰成人国产| 激情抓乳插进去啪啪啪日韩| 黄站在线免费观看| 女人一区| 久久久久亚洲AV无码专区少妇| 亚洲综合97中文网| 久热99| 天天弄欧美| 成人草草视频| 嫩草 我啊~嗯~在线| 亚洲 日本 不卡| 亚洲无线码欧洲精品区别| 久久99综合| 91美女国产在线| 精品无码欧美三级| 婷婷丁香五月激情啪啪| 果冻传媒A片麻豆熟妇人妻| 视频国产成人精品日本亚洲18| 欧美色图校园春色| 国产人妖视频一区在线观看| 另类欧美综合| 日本精品性生活久久久| 后入福利视频| 男人的午夜天堂| 成人在线日韩| 香蕉色网| 激情第四色| 99综合视频一体| 日韩AV熟女乱伦| 久久久久久国产手机AV| 97视频网站在线观看| 天天影视色香欲综合网小说| 久久国产精品视频| 91超碰在线观看| 91人妻丝袜无码| 大香蕉啪啪啪| 欧美综合娱乐久久| 九九拍拍精品视频在线播放| 91视频伊人| AV综合中文字幕干| 影音先锋中文字幕日本好一区二区| 国产福利小视频高清在线观看| 歐美性天天| 丁香五月天社区| 亚洲一区操| AV中文字幕三四五| 熟妇激情| 夜夜操2028| 欧美色性情| 国产乱码精品久久久久久| 波多野结衣先锋影音| 色欲三区| 少妇免费视频| 日韩女模中文造逼| 99色网| 国产操逼网站亚洲一级黄色| 日本一区二区电影网站| 伊人久久大香大香线蕉中文| 亚洲天堂五月天国产| 97视频免费在线观看| 97人人操人人摸| 97爱爱| 久久亚洲一区女同性恋中文字幕| 第四色色综合91| 凹凸视频特色日本特黄| 黑人猛交| 国产性爱强奸乱伦大全| 熟妇一区二区| 久久久四区| 日韩内| 欧美一级二级三级| 人澡逼| 亚洲综合69| 色男人色天堂东京热| 69精品人人人人| 91爰爱欧美| www.高清无码诱惑一区.com | 嗯嗯啊啊操我| 深夜福利黄片| 激情小说日韩无码| 国产熟女精品一区二区| 国产精品不卡高清在线观看| 国产精品内射婷婷一级二| 探花视频免费观看国产专区| 人妻激情视频| 乱伦熟女专区| 国岛片视频| 中文字幕老熟妇黄色视频| 日韩紧密久久| 99后入| 久久久九九九| 国产操偷| 久热久操| 人妻夜爽夜夜爽| 久久婷婷电影网| 国产精品久久久久亚洲av| 色牛牛AV| 国产精品午夜成人福利| 91超碰丝袜制服| 婷婷丁香九月| 91干熟女| 99色婷婷中文字幕乱色| 欧美情色亚洲| 美国aaaaa一级黄片| 超碰免费97| 男人的天堂2010| 一本精品日本在线视频精品 | 熟妇视频一区二区三区在线观看| 亚洲成人久久一区二区| 少妇被c 黄 免费观看| 免费中文在线| www.男人天堂| 国产精品白丝在线播放 | 久久久久精| 九九九只有精品| 日韩不卡在线一区二区| 爱爱久久| 超碰色97| 婷婷91| 欧美,亚洲,日韩,v,天堂,手机在线观看| 熟女一区二区| 在线观看日韩av不卡| 亚洲综合另类欧美久久久| 日夜精品| 夜夜爽爽爽| 91夜色| 99国产在线绯色一区| 中文操逼字幕| 欧美极品女人的天堂| 精品一级毛片在线观看| 一区=区三区视频| 国产久久成人| 蜜乳av一区二区三区四区不卡| 高清国产性猛交xxxx乱大交| 国产成人亚洲精品自产在线 | 欧美日韩性爱精品| 日日摸日日碰夜夜爽视频| 91xingse| 国产av波波国产精品| 在线五区| 91国产丝袜足交精品视频| 被男人吃奶很爽的毛片| 亚洲熟妇AV日韩熟妇在线| 偷窥自拍亚洲天堂网爆| 欧美999| 后入福利| 欧美日韩222| 全球成人中文在线| 欧美成人免费在线观看| 少妇丝袜在线观看AV| 亚洲人妻一区二区三区| 欧美一级久久久久久久大片动画| 精品美女少妇一区二区| 操人妻视频| 久久久久久久久九九久孕交| 亚洲一区日韩| 欧美综合娱乐久久| 日本潮催一卡操| 国产精品。| 欧美大码在线视频| 日本综合色图| 九月色婷婷| 男人的天堂一区三区| 精品人体无圣光凹凸| 天天日天天操天天射河南省| 91色欧美| 欧美亚洲在线| 天天夜夜rb| 97在线观视频免费观看| 久久久艹艹艹| 五月丁香啪啪啪| 亚洲天堂久久| 东京日日夜夜| 夜夜中出国产| 91新在线欧美| 欧美精品97| 黄色大片一区二区密桃丝袜| 熟女视频久久| 成人乱码一区二区三少妇| a级成人毛片免费视频高清| 成 人 A V免费视频在线观看| 国产日本一区二区三区蜜臀在线观看| 综合五月天| 俺去也婷婷| 九九人人操| 91人妻超碰| 中文字幕久久精品一区| 久久久久大香青草精品综合| 91 亚洲情侣偷拍 久久| 欧亚韩国999| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师黑人潮喷一 | 啊啊啊啊啊啊在线| 一起草三级AV电影在线观看 | 97综合在线观看| 99操| 大香蕉淫人| 波多野42部激情无码喷潮| 亚洲色图欧美色图日韩色图| 成人国产精品三级A片| 久草色在线观看| 欧美色图片91| 伊人网一本| 日韩成人无码| 五月天色色色| 亚洲永久AV无码精品秋霞| 亚洲加勒比色图| 亚洲天堂区| 国产25页| 国产精品又黄又猛又粗| 国产超碰在线| 久久久久久久久国产| 97色97干| 熟妇在线视频一区二区| 免费97视频| 美女t无毒不卡不卡| 强奸乱伦 亚洲一区| 夜夜中出国产| 亚洲婷婷综合网| 久操视频资源站公开| 男人的天堂2018.| JuliaAnn丝袜熟女系列| 全球成人中文在线| 另类欧美| www欧美性爱| 精品人妻一区二区三区视频| 一级性爱视频免费在线| 最新一二三区视频| 性色亚洲| 99热精品国产| 中文字幕AV乱伦| 黄色一区三区| 97人人干人人操| 精品国产乱码久久久久久蜜臀| 男人午夜天堂| 日韩AV电影网站| 情色五月天就去干| 国产女人极品高潮毛片| 欧美色图 人妻| 操逼国产免费| 免费草草草草草视频| 天天操人人操狠狠插| 青青欧洲黑| 亚洲精品国产精品乱码不99| 日韩性爱1级片视频| 综合天天网| 国产日本久久免费精品| 啊啊啊啊嗯嗯在线久久久| 女同在线视频一区| 国产乱伦亚洲| 资源新线在线天堂| 美女91在线观看| 国产免费一区二区在线A片视频| 欧美一级二级三级| 91强在线播放| 人妻天天爽夜夜爽爽| 操操逼操操逼操操逼逼| 97欧美视频| 一区二区你上我| 国产辣妈在线视频福利| 中文在线视频| 宗合情欲网| 成在线人在线观看视频| 天天热精品| 五月天色电影| 欧洲无码一区二区| 久草视频分类在线| 午夜影美女日鸡鸡天天视频国产| 欧美亚洲激情| 欧美97爱| 无码粉嫩白虎一线天b区| 欧美熟女逼久久久久久| 四虎国产成人精品免费一女五男| 婷色五月| 欧美黄色片AAAAA| 亚洲国产成人精品无码专区| 欧美性爱日韩高清| 午夜小电影在线插入淫高潮| 偷拍 亚洲 欧美| 亚州综合色| 唐山老熟妇露脸啪啪叫| 91精品国久久久久久无码| 综合网~91综合网| 熟妇一区二区三区| 爱干爱射网啊啊啊| 歐美性天天| 99黄页网站| 青青草影视蜜久久| 久久粉色| 天天影视色香欲综合网小说| 欧美精品成人一区二区在线观看| 夜夜草天天| 欧美日本国产日韩激情视频| A 天堂在线观看视频| 色色激情五月天| 精品妇女一区二区三区| 少妇被玩视频二三区| 狠狠色五月亚洲91| 秋霞一集毛片观看| 近亲乱伦一区二区| 亚洲综合激情五月久久| 亚洲另类综合欧美| 青青草字幕AV| 亚洲不雅视频1区二区| 性爱视频免费网址| 一级啊性爱在线视频| 北京专精特新企业招聘信息| 婷婷精品国产一区二区三区日韩| chaopen97久久| 国产成人拍国产亚洲精品| 久久鲁干| 国产免费久久精品99re韩国| 漂亮人妻被强中文字幕hd| 高潮的A片激情扒开一区| 超碰国产在线| 亚洲在线综合| 亚洲精品国产熟女久久久久久| 1204人成网站色www| 91丝袜美女| 日韩精品亚洲一二三| 333kkkk·亚洲com久久| 成人久久久| 特级毛片特黄久久免费看| 精品久久視頻在线| 九九这里只有精品| 最近2019中文字幕国语免费版| 亚洲日韩肥臀视频在线观看| 天天天干977| 人人看人人摸人人色| 成人片视频| 日韩精品一区二区日韩| 亚洲av热热色| 欧美日韩国产黄色片| 九九九九九九成人| 18禁精品网站在线看| 神马久久网| 成人日本精品九区| 97色97干| 97频视在线| 日韩性爱播放| 天天操天天舔| 99啪啪视频| 亚洲最大成人a毛毛片| 日韩二区三四区五区六区在线看| 国产精品一级片在线看| 亚洲男人在线观看天堂| 东京热激情视频一二三区| PMv在线观看| 亚州男人的天堂| 日韩三级视频一区二区三区| 国产成人超碰在线| 综合网亚洲1| 中文字幕一二三区| 粉嫩av在线| 四虎免费视频| 69AV女优男人的天堂| 欧美日韩性爱操大逼| 久久久久99999| 欲色啪| 嗯啊啊啊轻点视频| 黄片直播三级黄片两女一男| 九九热精品视频六| 精品妇操一区二区三区| 欧美日不卡| 欧美黄色片AAAAA| 欧美男人天堂| 欧美色图亚洲色| 肉丝中文无码高清| 五十路二区在线| 乱人伦 国语对白:视频直接看| 欧美不卡二区| 久久欲| 岛国1区2区3区在线观看| 精品无码少妇| henhen91| 日韩成人小视频| 青草伊人网| 欧美性巨大╳╳╳╳╳高跟鞋| 亚州色综合| 在线不欧美| 超碰人妻久久| 超碰97色| 69视频入口| 久操操AV电影| 91香蕉视频在线观看免费| 老司机深夜18禁污污网站| 亚洲中文字幕在线视频一区二区| 热热色91| 欧洲性爱无码区| 欧美综合色,www| 91美女视频直播| 亚洲自拍97| 五十路六十路素人熟女| 青青草综合在线| 狠狠爱夜夜| 人妻偷拍一区二区三区| 国产乱伦亚洲| 91色久| 裸模AV女优| 欧美日日人人天天| 啊啊啊无码| 国产精品久久久久久无码红治院| 粉嫩av在线一区二区| 91人人爽人人爽人人人,gav福利视频导航,日韩欧美亚洲国产字幕四区 | 内射老妇BBWX0C0CK| 欧美,日韩综合久久| 日本色色网| 蜜桃色院一区久久 | 久久伊人影院| 精品一区二区在线针对华人免费观看这里只有精品免费观看 | 亚州伊人色综台| 九九色逼| 18一区二区三区| 在线综合 亚洲 欧美中文字幕| 精品少妇人妻av久久免费| 99精品无码| 97频视在线| 亚洲中文字幕在线视频一区二区| 日本三级A片网站com| 992这里有精品| 久久是精品| 国产一级内射无挡观看| 色性荡荡荡荡视频| 五月天婷婷社区| h无码动漫在线观看| laoshunv91| 欧洲性爱无码区| 欧洲无码一区二区| 97资源久久| 女优免费一区二区永久| 91蜜臀人妻中文字幕在线| 一区二区视频在线播放| 亚洲大胆人体av| 天天激情干| 久久99精品九九久久久婷婷| 国产精品视频自拍在线| 超碰人人乐97| 亚洲精品一区二区精华| oumeisetupian| 亚洲一区中文精品| 综合网久久| 一线黄色免费性爱片| 淫穴高潮色图| 九九伊人网| 欧美日韩在线视频网站| 婷婷成人久久久精品| 日韩黄色片子| 日韩人妻精品| 67914亚洲精品| 国产女s强制榨精视频| 另类视频在线| 欧美精品1区2区3区| 97视频在线播放| 超碰精品| 99热超碰| 精品九九国产无码| 天天综合网~91| 18岁禁 茉莉成人久久| 强奸乱伦αv片| 天天激清| 97超级久久| 欧美巨大性舒爽顶到了| 亚洲精品一卡二卡三卡福利视频网站| 图片区小说区| 人人操我人人干| 蜜臀99久久国产| 亚洲天天精品| 麻豆婷婷成人一二三| 精品精品精品| 丰满少妇一区二区三区免费看| 天天摸夜夜摸| 日本欧美国内在线| 日韩免费福利在线观看| 少妇天堂| 91性网| 日本最新1区2区3区| 欧美中文字幕一区 | 成人九九| 爱丝福利| 五月开心久久AV官网| 日韩乱码Av| 美国美女AV在线| 久久麻豆一区二区| 天美精品av| 日韩三级一区| 久久婷婷一区二| 97人人干| 中文字幕精品一区二区精品| 国模精品一区二区三区苹果色戒| 激情无码日韩| 色哟哟511老熟女| 日韩av不卡在线看| 亚洲导航深夜福利| 日韩视频啪啪| 九九aV| 熟女一区二区| 久久久久久久久久久久九| 国产乱子伦一区二区三区免看| 91影视亚洲| 三级色影综合网| 俺去啦俺来也久久综合| 日韩欧美成人性爱在线| 免费伦费视频在线观看| 伊人久久婷婷| 亚州操操穴网| 国产妇女精品视频青青草| 91天天美女| 日本成人在线不卡一区二区三区| 亚洲中文字幕熟女| 性爱乱伦网址| 国产在线不卡导航| 91国内外在线| 欧美性爱精品七区| 国产熟女二区| aV中文麻| 国产特级毛片AAAAAA高潮流水| 亚洲成人久久美女| 二对二中文字幕。| 久久在肏| 熟女六十路| 亚洲精品一区二区免费在线观看| 男女啊啊啊啊啊| 激情综合二| 欧美伦乱爱| 丁香九月 婷婷| 中文字幕黑人大片| 99色在线| WWW黄片COM| AV在线播放网址| 国产麻豆福利av在线播放| 伊人精品视频| 黄色香蕉视频网站一区| 黄色污污污污污污网站| 少妇淫妇久久久久久久| 一级免费啪啪片| 宅男91视频在线播放| 精品人妻高清麻豆av| 黄色成人网久久久久久| 中文乱码字幕观看视频| 久久草草亚洲蜜桃臀| 日本三级一区二区 在线 | 婷婷五月天成人| 中文字幕人妻资源在线| 玖色AV| 国产精品久久久久久久久久久久| 成人夜夜爽| 亚洲影院无码在线| 伊人一区二区三区| 不卡av在线中文字幕| 激情小说亚洲视频| 久久久久久AV无码免费网站| 国产自偷| 91蜜臀熟女| 手机在线视频国内精品| 九九热re99re6在线精品| 操91| 在线人成亚洲视频免费观看| 成人久久精品| 亚洲福利中文字幕在线| 久久99九九九九6666免费观看软件| 深田咏美亚洲精品福利社| 91色花堂| 韩日精品福利视频一区不卡在线免| 粉嫩粉嫩一区性色AV片| 久久97视频| 中文字幕乱碼在线| 男女真人网18| 91丝袜在线观看| 神马久久69| 2010男人的天堂| 久久直播国产| 亚洲激情片| 日日嗨AV一区二区夜夜| 亚洲国产中文字幕| 日本综合色图| 无码国产Av| 91老熟妇| 欧美色九九| 啊啊啊啊啊,啊啊啊啊好舒服,操我舒服啊啊啊 | 激情视频网址| av无码av无码专区| 在线中文字幕| 久久久久国产精品久久久| 豆1无夜无码| 亚州色图欧美|