亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

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
返回資訊列表
2000亚洲男人天堂| 久久久久国产精品久久久| 日韩乱码av| 高清国产性猛交xxxx乱大交| 九一国产精品| 91丝袜在线观看视频在线观看| 中文字幕一区二区在线日韩精品| 人妻铁牛TV| 久久亚洲熟妇在线视频| 亚洲精品视频在线| 超碰精品国产无码| 极品色综合| 超碰人妻中文在线| 富二代亚洲精品99| av中文在线| 影音先锋少妇| 色网站导航大全| 大香蕉99re| 亚洲国产剧情少妇激情| www.91理论| 亚州欧美在线| 无码二级三级| 久久9精品网站| 日韩精品三区四区| 人人插人人搞人人操| 操逼视频色| 中文字幕丰满子伦无码专区在线视频最新| 久久久精精精| 亚洲区 欧美区| 久久精品成人| 中文字幕青青草| 老熟女中文字幕高清| 大香蕉天天看妹子| 综合久草| 依人大香蕉| 无码av永久免费专区网站| 综合欧美激情网| 91久久免费视频互動交流| 欧美大的香蕉有线电视视频| 97超级色碰碰| 熟妇人妻一区二区| gogogo免费高清看中国国语| 99久久99久久免费精品蜜臀| 97在线视频观看| 好属操| 亚洲综合嫩| 熟妇高潮二区三区| 色情婷婷久久五月天| 91jk色拍| 人妻 欧美 中文| 欧美精品另类人妖xxxx| 91视频观看网站| 操操操操操操| 欧美狠狠弄| 青娱乐手机日韩在线视频| 青娱乐手机日韩在线视频| 久久久久亚洲精品| 国产天美传媒精品| 亚爽爽爽爽爽爽爽爽| 91欧美综合在线| 亚洲久久东京热一二三四五区视频| 久久思思热| 国产91丝袜 在线播放| 亚洲国产天堂| 精品国产av一区二区三区四区入口 | 成熟熟女国产精品一区二区| 91亚洲欧美综合高清在线| 玖玖久久久| 免费精品国偷自产在线在线| 性爱乱伦视频免费| 天天躁日日躁XXXXYY| 天天综合精品| 久久久9视频| 嗯嗯啊啊啊啊轻点视频| 91色欧美| 久久区| 人人操人人摸人人骑| 欧美日韩在线国产在线| 亚洲色五月| 青青国产精品在线| 自拍视频大全亚洲专媒视频/一区二区三区| 久久亚码| 国产一区二区三区影片| 欧美精品97| 蜜臀AV成人精品蜜臀AV久久| 在线观看啊啊啊啊啊| 欧美 亚洲精品首页| 伦激情人妻另类人妻| 日本日逼高清| 国产AV天美| 有码专区最新中文字幕有码| 欧美色图色综合| A 在线网址| 亚洲色图 欧美热图 清纯唯美 另类自拍| 亚洲永久AV无码精品秋霞| 亚洲砖码砖专无区2023| 91在线无码精品秘 软件| 老熟女熟妇| 99re在线视频| 370p日韩欧美亚洲精品| 九九热AV| 96国产精品| 日本高清一区二区在线| 97超碰在线资源网站| 国产日本一区二区三区蜜臀在线观看| 久久久免费一级黄片| 精品国产国产AV| 色吧 综合| 美女黄色一级A视频| 亚洲av热热色| 日韩9区| 婷婷五月天_亚洲小说欧美激情另类_精品久久国产字幕 | 青青五月天| 久草在| 久久久久久9| 欧美 青青草| 亚洲欧洲综合成人av一区| 久久久草成人网站久久久草成人久久久草久久久 | 综合网亚洲1| 强奸乱亚洲| 9久9久| 精品少妇后入一区二区三区四区人妻巨乳 | av中亚| 久久偷拍人| 成人性爱全视频观看| 91 偷| 精品夜夜澡人妻无码| 日本人妻丰满熟妇久久久久久| 一区,二区,三区视频| 亚洲综合伊人| 超碰亚洲欧美日韩无| 北约熟女超碰| 久久日本熟妇熟色一区| 亚洲激情 欧美色图| 激情网色| 高清视频一区| 综合九九| 天天天天操| 无码操逼视频一下| 青娱乐91| 精品九九九| 日韩一级久久毛片| 日本免费专区| 国产白领连续中出在线观看| 亚洲色图欧美色图在线播放| www.av在线视频| 日韩无码服务区| 亚洲日韩美女中文字幕乱| 亚洲无码99| 亚洲欧洲激情卡通另类文学四射小说网站| 天天做天天爱天天爽| 九九九九九精品| 欧美激情精品| 久久精品亚洲婷婷| 精品人妻一区二区视频| 久久夜嗨| 五月激情小说| 91精品人| 91超碰碰在线| 少妇一区二区三区高速| 四虎影视 亚洲无码| 婷婷亚洲五月***久久| 欧美日韩亚洲天堂| 亚州国产精品乱| 天天久久| 大香蕉青青9| 亚洲 自拍偷拍 欧美| 91精产一区二区三区| 色婷亚洲五月在线观看| 欧美精品不卡一二三四在线91| A V视频日本| 色爽——AV| 亚洲无线码一区国产欧美国| 国产兽交视频在线播放| 国产精品伦理| 91麻豆一二三区| 亚洲综合码| 日本午夜操逼| 防屏蔽在线视频| 欧美日韩另类在线播放| 91熟女视频| 91精品免费| 久久性爱网站| 九九九九免费视频| 午夜久久一区二区无码中出| AV污污污污| 欧美少妇人妻| 国产免费黄色一级大片| 熟女熟妇伦久久影院毛片一区二区| 亚洲日韩肥臀视频在线观看| 99热免费| 色哟哟 日韩精品| 88在线一区二区三区| 久久久久久国产精品| 久草免费在线一区二区| 五月丁香拍拍激情综合三级| 久久国产成人精品国产成人亚洲| 97亚洲自在精品在线观看| 97硬碰| 亚洲九九夜夜| 亚洲福利中文字幕在线| 永久免费av无码网站国产app| 欧美综合亚洲综合| 高清孕妇孕交 交| 中文字幕久久亚州无码| 大乔未久88一区| 欧美日韩国第一区| 日欧操屄视频| 密乳无码| 人人 操人人 操人人| 国产精品美女视频诱惑| 91操操操操| 综合亚洲网| 精品人妻无码一区二区三区不卡-精品人妻无码一区二区...|精品少妇一区二区三 | 欧美96在线|欧| 少好三P| 伊人久久亚洲色欲综合网站| 很狠操| 久久免费看高潮毛片韩国| 日韩美一区| 97在线精品| 新婚人妻扶着粗大强行坐下| 亚洲成人一区二区精品| 人人透人人操| 操穴国产| 欧美天堂亚洲电影院一区在线播放| 中文有码第五页| 伊蕉97蜜桃97狠狠综合干| 美女淫穴| 国产大片精久久久久久| 色香在线| 国产中午字一暮区| 久操视频在线| 亚洲天堂精品日韩电影| 成人乱人伦一区二区| 国产精品免费美女视频| 粉嫩国产精品久久粉嫩| 久久欧美1卡2卡3| 和协无码影院| 天天干夜夜肏| 夜夜性| 欧美,日韩,中文,另类| 久草加勒比一区在线| 中文字幕乱码人妻二区三区| 久久婷婷色| 欧美午夜精品久久久久久3D| 色偷综合| 男女啪啪啪18禁网站| 日韩人妻一区二区精品| 日本淫色网| 91精产一区二区三区| 亚洲综合嫩| 午夜a成v人电影| 深夜激情无码| 天天欧美色| 久九九九九九九热| 欧美黑人与女人91| 美女尤物人人操| 欧美v亚洲v日韩v最新在线二区 | 天天综合~91| 人人看黄色视频| 欧美一区二区一级岛国大片| 国产AV超爽| 欧美性暴力猛交XXXX| chaopen97久久| 91久久青青草原精品| se吧提供国产乱老熟视频胖女人| 色噜噜婷婷| 特级大荫道BBwBBwBBW| 久操国产在线| 五月婷久久| 亚洲揄拍网| 人妻天天爽天天爽三区| www.久久爱| 91欧美丝袜| 日韩免费看在线黄色片| 色 婷97| 国产精品3| 亚洲无992tv| 国产强奸超碰AV| 极品五月天噜噜| av东京热男人的天堂| 2018天天日天天日| 亚洲成a人在线观看久| 天天综合影院91| 黄片免费日韩| 久久久9品一区二区三区| 亚洲97超碰| 日本一级二级三级网站| 曰韩香蕉97| 午夜男女爽爽大片免费观看| 丁香啪啪| 97欧美资源| 国产又爽又黄| 久热久| 国产毛片在线| 欧美,亚洲,日韩,v,天堂,手机在线观看| 国产精品自拍xxxx| 蜜臀无码一区二区| 欧美日本一区二区a人| 国产精品色哟哟| 综合久久久久久久久91| 最新精品久久蜜桃| 国产91乱伦| 久久夜色一区二区| 无码 黑人一区二区三区| 大香蕉操久久| 久久99久久99精品天美传媒棢·纸:.| 国产色呦呦| 97超碰免费人人性爱| 天天日天天干天天操| 色五91| www.99色| 九九十八精品| 岛国免费黄色网址| 亚洲丝袜制服国产91_国语字幕免费观看完整版下载第5集_ | 超碰97欧美| 国产传媒一区日韩| av在线观看不卡网站| 黑人精品久久97| 天天干天天舔| 久久久婷婷| 手机在线观看不卡无码av| 国产白丝av| 亚洲中文电影| 五月激情综合网| 999精品乱码| 日韩欧美丝袜诱惑| 亚洲精品精品一区二区| 超碰97久久| 日韩无码AB| 2001天天操| 人干人人人操人人摸| 五十路一区无码| 懂色AV一区二区三区| 国产操操日韩三级黄| 999久久久国产精品| 亚洲AV不卡在线观看尤物| 美中日韩无码| 少妇一级婬片免费放一级a性色.| 91亚洲在线| 国产熟女自拍| 中文字幕黑人大片| 浪人综合网| 91另类| 久热99999| 岛国免费黄色网址| 曰韩中文人妻视频| 久久有码视频| 久久综合日韩亚洲欧美| 婷婷五月影院| 国产精品嫩草影院免费| 另类欧美色| 亚州春色| 99re3这里只有精品| 久久乐| 亚洲精品无码少妇久久| 97国产超碰| 欧美日韩美女精品久草一区二区三区| 中文字幕少妇色| 97色色视频| 欧美日产国产在线成人第一区| 97亚洲综合影院| 嗯嗯啊啊好大好爽| 亚洲精品丝袜| 荡小穴在线观看| 日韩成人电影AV| 精品中文字幕一区二区l - 百度| 黄色无码高清黄色无码网站| 综合亚州欧美| 男人天堂毛片| 一区二区高清视频| 91欧美网| 在线日韩日本亚洲国产| 国产精品九九九| 中文字幕一区二区三区50路| 久久男人的天堂| 欧美情色亚洲| 91综合色噜噜| 亚洲AV无码翔田千里网站| 天堂а√在线最新版在线| 亚洲AV成人无码一二三久久| 九月激情婷婷| 欧美国产欧美在线观看| 国产精品自拍欧美在线| 99热国产| 美国一区二区免费视频| 97色伦97色伦国产欧美| 亚洲国产综合图区中文字幕| 国产高清自拍| 丰满人妻一区二区三区色-百度| yaouchengrenav| 91爆操视频| 大香蕉手机视频| 欧美中文字幕男人天堂久久精品| 日韩免费人妻色情网站| 国产一区二区三区不卡手机在线| AV一二区| 极品少妇久久久久| 狼人狠干| 日韩人成网站在线播放| 啊…啊…操我用力操我| 亚洲欧美色综合| 亚洲日韩在线a不卡99精品| 欧美18 在线观看| 一区三区啪啪| 99re9在线| 狠狠图片青青草| 欧洲自拍第一页| 20cm女自慰在线日韩欧美| 粉嫩在线一区二区懂色| 色综合98| 久久久久久久久久久久久女过产乱-少妇高潮一区二区三区喷水-成人AV | www.男人天堂| 啊啊啊爽爽| 无码天天操| 国产精品无码久久久久2028| 日韩欧美经典在线观看| 97干天天| 98超碰欧美| 操操吧亚洲乱伦视频| 激情五月综合| 国产精品一区二区后入| 欧美黄业| 五月大香蕉| 加勒比色综合| 日韩中文字幕视频| 亚洲色天堂日韩中| 97看操| 亚洲国产成人精品女人久久久| 成 人片 黄色大片| 淫色网综合| 夜色综合| 熟妇在线视频一区二区| 天堂综合网| 免费作爱一级视频| 神马久久69| 强奸乱伦 亚洲一区| 亚洲日韩成人性爱视频| 日韩熟女视频二区| 无码外流操逼视频| 日韩中文字幕熟妇人妻 | 亚洲成人妻日韩在线| 91色香| 欧美黄页在线| 亚洲精品国产精品成人| 五月天激情四射| 国产极品久久久| 日本欧美中文字幕| 日本人体九九九九九九| 精品对白久久不卡| 午夜一区| 综合久久2017| 麻豆黄色五月天| 97在线免费观看视频| 国产超碰| 操逼无毒无码免费视频| 亚州AV无码国产精品| 天天日日日射| 亚洲欧美综合区自拍另类| 人妻精品4K4K4K4K4| 影音先锋日本一区二区| 亚洲黄日韩无码专区| 欧 美 自 拍 偷 拍| 亚洲中文电影| 久久精品国产亚洲AV嘿嘿| 91综合天天看| 亚洲综合有玛| 自拍偷拍 高清无码| 五十路熟女,国产欧美精品区一区二区三区| 久久6热视频免费观看| 91日产桃蜜| 欧美图片色综合| 精品一区二区在线针对华人免费观看这里只有精品免费观看 | 色色色日本| 亚洲永久AV无码精品秋霞| 国产对白刺激视频| 欧美九一精品久久久熟妇| 五月丁香影院| 欧美性性性| 求求你操操我| 日韩不卡av一二三| 97极品无码| 国产精品密臀网在线观看| 大香蕉亚洲中文| 亚洲中文字幕在线视频一区二区| 日韩欧美丝袜诱惑| 激情综合色| 国产多人在线观看视频| 青青草大香蕉视频| 白丝jkav| 欧美人人曰人人操人人射射| 91精品国| 九九九九九九九九九五码| 激情第四色| 操啊国产| 91麻豆天美| 蜜桃午夜视频一区二区| 最近的最新的中文字幕视频| 乱伦一二三| 久久蜜桃一区二区| 亚州Av天美传媒| 中国黑人三级片网站上区| 国产精品久久久久久片| 中文?日韩?免费?精品| 日韩精品怡红院| 久久久9品一区二区三区| 国产成人自拍视频在线| 亚洲 一区二区 自拍| 色欲三区| 精品人妻一区二区三区日产乱码| 丰满欧美放荡少妇在线| 啊啊啊不要好疼视频| 色欲久久综合| 国产伦精品一区二区三区在线观 | 青青草啪啪网| 亚洲熟女国产综合另类| 久9久| 丁香五月激情网| 国产精品探花在线| 欧美午夜一区二区三区| 999亚洲国产视频| 欧 美 自 拍 偷 拍| 乱伦Av网| 日韩黄色一区二区三区| 99精品久久久久久久婷婷| 91精品人妻偷情| 欧洲性爱无码区| 天美91| 超碰色中文| 91狠| 亚洲午夜免费狠狠干| 天天综合网站| 天天操av懂色| 亚洲综合影片| 超碰 av 女人天堂| 久久只有精品一区二区三区| 丰满欧美少妇| 性性欧美| 久草毛片| 久久69| 无码人妻一区二区三区色欲aⅴ | 精品久| 国产精品直播在线观看直播| 日本一区二区三区免费观看| 香蕉久久AⅤ...| 国产女人与拘做受视频免费| 亚洲成aⅴ人片不卡无码| 97资源视频| 人看人人摸人人操| 国产女人91精品嗷嗷嗷嗷| 日韩性爱再线视频| 成人av动漫在线观看| 男人的天堂不卡一区二区| 久久a久久| 国产中文日韩欧美一区二区三区人妻丝袜美腿 | 国产又大又粗又长视频在线| 97视频新免费| 成·人免费午夜在线观看| 色就色综合| 三级三级三级日本99| 伊人久久国产免费观看视频| 五月天亚洲网| 成人精品无码| 国产精品电| 国产免费内射视频| 久久91精品国产9丨久久分亭| 日本久久99| 另类av天堂| 91精品人妻五十路| 亚洲一区日韩精品中文字幕| 久久精品国产72国产精品福利| 丁香色色网| 野狼激情网| 乱码人妻一区二区三区| 中日韩一区二区三区欧美| 中文字幕 码精品视频网站| 五月丁香六月婷综合成人综合 | 性色avv| 欧美日综合| 亚洲阿v天堂无码z2018| 乱伦AVxx| A啊啊在线观看| 欧美日韩在线小说| 六月婷婷综合| 亚洲自拍一区夜夜操| 啊啊啊久久| 在线可观看的黄色网址| 亚洲高清视频在线观看| 日韩欧美性吧婷婷乱伦大香蕉 | 久久无码一区二区二三区性色 | 91狠狠综合久久| 操逼视频免费日韩无码| 懂色AV中文| 婷婷五月天激情四射| 日韩免费性爱视频在线观看| 精品中文日韩字幕视频| 精品91日日夜夜超清资源| 福利天堂| 日本免费一级AAA大片器| 国产后入精品| 97欧美综合| 久久综合九九| 俞拍久久国应视频| 五月天黄色激情视频| 久9久精品视频| 欧美亚洲色图另类国产| 国内精品久久国产,www香蕉久久五月丁香,亚洲欧美日韩精品永久在线,日本精品一 | 五月天色色色| 狠狠躁日日躁夜夜躁A| AV乱伦国产| 玖玖视频在线资源一区二区三区| 四虎免费视频| 天天做天天爱天天高潮| 日韩综合97p| 色综合九九| 亚洲三级。日韩三级| 99操视频| 亚州,欧美在线| 91九色网| 亚洲欧美另类激情小说| 91 丝袜在线| 精品无码一区二区人妻久久蜜桃| 欧美精品久久久久久久丰满| 老熟女中文字幕高清| 国产 丝袜 欧美中文 另类| 97国产精品一区| 99精品网| 91在线精品一区二区三区| 色香在线| 十八禁成人网站在线观看| 久久精品日韩专区免费观看| 天天躁日日躁AAAXX| 精品国产一区探花在线观看| 亚洲第一页欧美| 99热最新| gogogo免费高清看中国国语| 超碰 av 女人天堂| 天天日日夜夜| 精品人妻免费观看| 蜜桃AV天堂| 超碰激情808| 欧美疯狂做爰xxxx| 无遮挡男女激烈动态图| 日日干男人的天堂| 亚洲第一综合| 色综合国产在线观看| 久久久久久裸体| 五月丁香久久| 久操网址| 精品免费视频国产一区| 亚精品无码毛片一区二区三区| 五月激情天| 一区二区视频在线播放| 高清国产无码av| 五月丁香亭亭| 亚洲午夜福利在线影院| 啊啊啊好多水| 俞拍自拍| 大香蕉在线视频重口味毛片在线| 无码色| 伊人少妇久久久| 夜夜嗨AV蜜臀av| 黄色网址久久精品欧美喷水| 脫衣舞一区二区三区| 欧美综合传媒| 成人一区二区三区四区| 亚洲中文字幕乱码无码一区二区| 极品色社| 国产精品秘 福利姬在线观看| 男女啪啪啪18禁网站| 网友自拍第1页| 国产精品3| 操淫穴亚洲五月丁香| 97欧美精品综合| 九九人人操| 综合色99| 精品国产一区二区三区香蕉欧美| 国产精品午夜AV完会免费| 91精品国产91熟女| 亚洲深夜福利| 国产精品乱码久久久| 东京热,男人的天堂| 精人妻无码一区二区三区伊人直播| 成人在线视频一区| 60秒免费小视频| 久久一留热品黄| 老熟妇综合| 蜜臀99999| www. 男人天堂成人在线| 情侣操 逼视频99| 久久有碼| 物业黑人 AV一区| 1024手机看片欧美日韩| 天天干夜夜肏| 久久九操在线观看| 亚洲中文丝袜美腿诱惑字幕| 欧美天天综合| ji熟女.com| 男女日B国产| 日韩AV无码中文一区二区| 996热| 日韩精品 资源| 欧美亚洲激情小说| 亚洲色图大香| 91美腿丝袜在线观看| 亚洲AV无码| 丝袜色综合| 极品色综合| 天天摸夜夜添无码小视频| 91P0RNY大屁股人妻| 国产熟女完整版中字| 日本中文字幕在线视频| 韩国一区二区精品亚洲| 亚洲自拍欧美国产首页网曝 | 日韩欧美一级特黄大片| 国产超碰人人操| 91狠婷| 日本不卡免费二区| 色五月AV| 第四色奇米影视777| 久久久久久亚洲Av无码| 思思热在线cao| 艹少妇网站| 成人婷婷丁香| 一级免费啪啪片| 97久久久久久久精| 四虎视频在线观看| 亚州综合色图| 91在线/欧洲| 国产欧美另类久久久精品课程| 青娱乐欧美激情一区二区| 五月激情天| 一区二区不卡| 少妇被c 黄 免费观看| 91人人臊| 91人妻丝袜无码| 欧美少妇性乱| 久久岛国| 国内毛片婷婷六月色| 人人操天天爽| 超碰97亚洲| 91丨九色丨熟女高潮| 91国产美女丝袜足交精品视频| 麻豆视频一区二区| 伦激情人妻另类人妻| 五月黑AⅤ| 亚洲美女精品九九视频| 四色永久成人网站| 黑白配性爱AV成| 芊芊操逼视频无码| 大奶尤物鲍汁淫荡欧美视频粉嫩夜夜骚| 大香蕉中文在线| 国产高清精品福利| 中文字幕视频一区视频二区| 亚洲欧美黄| 这里只有精品视频| 啊啊啊爽爽| 男人的天堂啪啪| 97视频免费播放| 激情文学网伊人| 天天综合亚洲综合| 淮穴色AV| 一级性爱视频免费在线| 中文字幕少妇色| 少妇人妻好深太紧了vr91| www.色婷婷.com| 91bbb| 日日日啊啊啊| 四虎国产精品永久地址入口| 亚州综合图片| 91搞逼视频| 久久久久亚洲精品| 国产成人手机视频激情| 国产免费一区| 综合久| 色综合91好| 操狠狠| 91美女网站| 欧美最婬乱婬爆婬性视频 | 日韩97视频!在线| 欧美一二三级精品在线| 激情四射五月天| 大屁股xxxxx| 日本免费二区三区| 亚洲老熟妇xxx| www.色吧5.com| 91N综合网在线| 婷婷五月天av| 两女互慰AV高潮喷水在线观看| 肉丝无码中文高清| 欧美久久草熟女| 亚洲电影中字一区二区| 九九九九九九九九九九九蜜桃 | 国产妇女精品视频青青草| 欧美一区二区三区日韩| 日本一道在线播放高清| 国产精品熟女九九九| 九九性爱网| 国产区在线| 日韩ab网| 欧美aaaaaaa| 亚洲天堂一区二区| 偷拍欧美激情| 熟女人妻一区二区三区| 欧美精品黑人猛交高潮| baiduhicn.com。| 婷婷五月天成人网| 曰韩操B| 欧美97爱| 国产9熟妇视频网站| 国产大片精久久久久久| av资源在线观看少妇| 国产无码精品高清| 中文字幕在线免费观看2| 东北女人性交| 激情四射婷婷六月天| 亚洲欧洲日产国产综合网| 国模限制级电影| 激情综合网五月婷婷五月天| 84YTCOM性无码| 亚洲色图综合网| 操九九九九九九| 久久久久久亚洲精品中文字幕人妻| 亚洲开心网| 2001天天操| 小说区 图片区色 综合区| 久久久久9999妇女| 国产亚州精品美女久久久免费| 色噜噜日韩精品| 亚洲激情综合| AA级电影三区| 国产超碰欧美| 色九九九| 天天色天天干天天爱| 色与欲影视天天看综合网| 九九九九88| 国产美女裸体秘 永久无遮挡| 素人伊尹大香蕉免费下载视频| 这里只有精品久久| 人人操人人肉久久精品| 色天使大香蕉| 国产吞精a级片激情电影| 97色网| 后入式五六区| 中文字幕精品人妻丝袜| 天天操天天干一区二区| 性色综合网| 蜜屁Av| 深夜啪啪啪视频免费| 日韩激情啪啪啪| 91亚洲欧美激情| 宗合情欲网| 天美麻花大全视频| 人人干人人操人人爱| 热热色AV| 国产传媒美日韩av| 色99在线| 久操网视频| 亚洲色图亚洲| 97在线观看免费| 亚洲狼狼干综合1| 久久大香蕉| 377p欧洲日本亚洲大胆| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区 | 9精品久久| 校园春色 男人天堂| 国产 无码 一区二区| 国产蜜臀精品一区二区尤物| 国产熟女二区| 欧美熟妇视频| 精品国产久热在线观看| 国内精品嫩模A∨私拍小视频| 精品国产乱码久久久久久久| 国产有码一区| 成人午夜小视频手机在线看| 100啪啪视频大全| 精品天堂| 亚洲AV免费在线观看| 大黄片做爱的大的| 蜜桃无码AV一区二区| AV高清一区| 久久久精品日本一道| 亚洲一区二区三区麻豆传媒| www被窝色com| a片自拍直播视频| 日本成人A片网站| 国产精品国产精品国产| 日本高清一本二本免费不卡| 国产成人主播| 色婷婷狠狠| 亚洲啪啪视频一区二区| 在线色导航| 国产精品亚洲一区二区三区四区| 国产91精品在线免费| 亚欧高清| 成人性爱电影一区二区| 国产探花精品在线| 日韩欧视频| 久久久久久久久国产| 国产精品久久久久久久久久久久久久久久 | 2020天天色综合| 欧美一区二区三区黄色影视| 国产精品一二三免费网站| 黄页视频网站野外| 亚洲精品xxx| 五十路三级片| 五月婷网站| 97超碰日韩| 熟女少妇视频| 久久久久九九九| 亚洲字幕一区二区| 最新中文字幕精品在线| 黄骗免费网站| 男女激情黄色网址| 伊人大香蕉在线| 丝袜内射| 国产13区| 久操在97| 99re热| 欧美天天影院| 高清有码一区二区| 日本天天操| 国产第25页在线观看| 人妻久久久久久| 超碰免费在线| 日日骚一区二区三区| 日本 欧美 国产一区| 男人的天堂久久狠| 亚洲色图大香| 亚洲精品啪视频| 丝袜美腿av女优在线| yy少妇精品久久| 校园春色美腿丝袜| 好爽视频在线观看视频| 亚洲激情四射| 亚洲自拍天堂| 大香蕉淫人| 超碰人妻中文在线| 78超碰| 久久精品 六十路 熟女 欧美| 国产精品自在线发布| 综合激情婷婷| 高清不卡国产| 午夜福利合集| 国产精品久久泡妞网站| 翔田千里AV无码秘 三区| 国产久久天堂资源| 99爱爱| 啪啪啪东京| 国产精品久久| 日本一二三免费久久| 小骚逼被操的爽不爽| 亚洲熟妇乱女区二区三区| 91丨九色丨43老版熟女| 国产精品色片一区二区| 天天舔日美女视频| 精品美女人人干| 午夜成人福利影视| 久久亚洲不卡| 能看的AV| 国产呦精品一区二区三区下载| 女同女同恋久久级三级| 日韩三级伊人| 人人妻人人玩人人澡人人爽| 少妇熟女视频一二三区| 女上位精品在线| 97爱b| 九九无码久久精品视频| 五月天婷婷色| 婷婷色在线| 日本在线激情一区二区三区| 免费在线黄片视频| 999亚洲国产视频| 国产精品美女视频诱惑| 久久久久久综合久久伊人蜜月| 日曰骚久久精品| 91男女| 久久久久久裸体| 97网址97| 亚洲男人综合网| 九九九九九九九| 97精品在线| 国产精品第一页国产大屁股视频免费区i| 操操操操操操| 色婷婷久久综合超碰| 啊啊啊好舒服好爽啊啊啊视频| 怡红院怡春院| 久久久久9999妇女| 亚州再线| 国产精品网站免费| 蜜屁Av| 美女裸体麻豆天美蜜桃91| 久久本道| 熟妇最新先锋一二三区| 97二区四区| 白丝1区2区3区| 九九久久久九九| 国产农村妇女精品一二区| 抽插爽| 中文字幕综合人妻| 97一区二区三区视频| 国产精品在线一区二区| 狠狠做深爱婷婷久久二区| 啊啊啊不要嗯嗯在线观看| 91美女高潮| 日韩精品人妻中文字有码在线| 天天舔天天日天天射| 成人精品欧洲亚洲| 久久久神马影院| 国产一区二区三区,在线观看观看| 任我爽在线视频免费观看| 亚洲精品国产av天美传媒| 国产免费久久精品99re韩国| 偷拍片久久| 蜜臀中文无码午夜| 青青青国产| 亚洲人在线| 少妇内射www在线观看视频| 加勒比伊人综合| 亚洲中字慕不卡| 欧美日韩小说| 9999久久久| 日韩极品无码B| 性爱边摸边日免费AV| 自拍偷拍2025在线观看| 香蕉综合网| 91欧美偷拍| 亚州色阁| 91久久国产精品| 亚洲成a人v欧美综合天堂下载| 情趣丝袜无码操逼视频| 中文字幕亚洲热播人妻| 巨爆乳肉感一区二区三区竹菊影视 | aaa亚无码专区| 操逼操逼逼操操逼91 | 一区二区三区探花在线观看| 色综合婷婷| www.99色| 久久综合日韩亚洲欧美| 手机av亚洲丝袜美腿日韩第一页二页| 91日日夜夜| 国产精品。| 日本有码久久| 欧亚在线视频| 乱抡国产91| 久久久久久九九九| 久久精品一区二区三区蜜桃臀| juliaann精品熟女一区| 黄网在线播放| 欧 美 自 拍 偷 拍| 欧美色图色综合| 91精品导航| 久久久999国产精品| 久久99深爱久久99精品| 亚洲欧洲无码97久久精品| 中文字幕一区 二 区 三 四 五 区日 日 骚| 日本片日本片祼观看网站在线看中文版网页在线看| 国产成年免费大片黄在线观看| 亚洲中文字幕在现观看| 性交一区二区在线播放| 真实高潮91| 老色69| 精品久久久九九九孕妇| 欧亚乱色熟一区二区三四区| 欧美第一页| 国产精品爽爽v| 日本精品一区二区不卡| 国产视频人人网| 亚洲高清无码在线桃色| 91女在线观看| ...日韩成人一区二区三区字幕| 久久69| 思思性爱| 久久久久密臀一区二区| 亚洲欧洲综合| 亚洲 欧美 偷拍 唯美| aaaa少妇高潮大片| 福利色色| 亚洲精品乱码久久久久久蜜桃麻豆| 国产精品久久久无码AV网站| yellow网站免费观看日韩高清无码| 国模不卡| 98福利在线视频| 抽插爽| 九九九热精品| 精品一区二区三区国产| 婷婷在线精品| 国产又大又粗又色生活片亚洲国产精品成人久久久综合免费 | 九九草| 啪啪免费| 怡红院怡春院| 久久97超碰| 亚洲夜夜欢无码一区二区| 亚洲资源网| 久久精品熟妇丰满人妻99| 性爱精品一区| 日日夜夜草草草| 亚洲狠| 久久久免费一级黄片| 金典av| 久久性爱精品一区| ss久久| 老熟女91视频| 国产超碰| 98超碰日本| 五月婷网站| 中文字幕视频2区| 校园春色五月天| 五月婷婷色| 午夜传煤十二区精品| 亚洲色色探花| 白丝少妇一区二区| 一级岛国大片| 亚洲色图欧美色图制服丝袜| 屁股久久久久久久久久| 中文字幕亚洲在线一区| 精久久久| 国产精品不卡av免费在线观看| 精品女人999| 超碰97丝袜| 丰满人妻一区二区三区| 91亚洲黄色网| 日韩午夜精品一区二区三区电影| 成人一区二区三区四区| 综合av社区| 一区二区三区男女操逼黄色小电影| 中文一区二区三区影院| 一品道视频一区二区三区| 欧美日日人人天天| 日韩一级成人毛片免费观看| 精品人妻一区二区三区视频| 亚洲一曲日韩精品| 我中文字幕6区| 中文字幕一二三av| 国内偷自视频区视频综合| 日本淫色网| 久久粉色| 大香蕉人妻| 精品人妻一区二区三区不卡断| 伊人网综合在线视频| 欧美少妇高潮久久91| 久久精品福利影院| 性色中出| 日本性感人妻91| 中文字幕在线观看视频www| 噜噜噜亚洲精品| 一区二区三区亚洲| 9/A片| 国产精品盗摄 偷窥盗摄| 色九月综合| 国产传媒操逼视频| 亚洲综合九| 色五月综合网| 少妇精品久久| 91最新综合| 亚洲精品视频在线播放| 操逼操2| 精品视频久久区| 日韩熟女精品无码专区一区二区 |