140 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
			
		
		
	
	
			140 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
| <template>
 | |
|   <div>
 | |
|     <el-button plain @click="open">上传视频文件</el-button>
 | |
|     <el-button plain @click="$refs.file.click()">选择dicom文件</el-button>
 | |
|     <input
 | |
|       ref="file"
 | |
|       type="file"
 | |
|       name="file"
 | |
|       webkitdirectory
 | |
|       multiple
 | |
|       @change="beginScanFiles($event)"
 | |
|     />
 | |
|     <div>
 | |
|       <canvas id="img"></canvas>
 | |
|     </div>
 | |
|     <el-dialog title="上传视频" :close-on-click-modal="false" :visible.sync="IsOpen" width="450px" append-to-body>
 | |
|       <my-videos @uploadOver="uploadOver" />
 | |
|     </el-dialog>
 | |
|   </div>
 | |
| </template>
 | |
| 
 | |
| <script>
 | |
| import MyVideos from '@/components/videos'
 | |
| import * as cornerstoneWADOImageLoader from 'cornerstone-wado-image-loader'
 | |
| // import charLS from '@cornerstonejs/codec-charls';
 | |
| import * as cornerstone from 'cornerstone-core'
 | |
| import dicomParser from "dicom-parser";
 | |
| import { Anonymizer } from "dicomedit";
 | |
| console.log(Anonymizer)
 | |
| const script = `version "6.3"
 | |
| temp := "chany"
 | |
| (0008,0008) := "test"
 | |
| (0010,0010) := temp
 | |
| `;
 | |
| 
 | |
| const CharLs = require('@cornerstonejs/codec-charls')
 | |
| const codecWrapper = {
 | |
|   codec: undefined,
 | |
|   Decoder: undefined,
 | |
|   Encoder: undefined,
 | |
|   encoderName: "JpegLSEncoder",
 | |
|   decoderName: "JpegLSDecoder",
 | |
| };
 | |
| function setCodec(codecConfig, encoderName, decoderName, codec = {}) {
 | |
|   codecConfig.Encoder = codec[encoderName];
 | |
|   codecConfig.Decoder = codec[decoderName];
 | |
|   codecConfig.codec = codec;
 | |
| }
 | |
| CharLs().then(res => {
 | |
|   setCodec(codecWrapper, codecWrapper.encoderName, codecWrapper.decoderName, res);
 | |
| })
 | |
| export default {
 | |
|   components: { MyVideos },
 | |
|   data() {
 | |
|     return {
 | |
|       IsOpen: false,
 | |
|       videoUrl: null,
 | |
|       videoName: null
 | |
|     }
 | |
|   },
 | |
|   methods: {
 | |
|     async upload(name, file) {
 | |
|       let res = await this.OSSclient.put(name, file)
 | |
|       return res
 | |
|     },
 | |
|     beginScanFiles(e) {
 | |
|       var files = e.target.files
 | |
|       console.log(e.target.files)
 | |
|       if (files.length > 0) {
 | |
|         files.forEach(async (item, index) => {
 | |
|           const reader = new FileReader();
 | |
|           reader.onload = async (event) => {
 | |
|             let buffer = event.target.result;
 | |
|             const anonymizer = new Anonymizer(script, { test: 'hello' });
 | |
|             anonymizer.loadDcm(new Uint8Array(buffer))
 | |
|             await anonymizer.applyRules();
 | |
|             let buffer1 = anonymizer.write()
 | |
|             let data1 = dicomParser.parseDicom(new Uint8Array(buffer1))
 | |
|             let data = dicomParser.parseDicom(new Uint8Array(buffer))
 | |
|             // 传输语法 0002 0010
 | |
|             // if(1.2.840.10008.1.2.1) 才压缩 => 1.2.840.10008.1.2.4.80
 | |
|             let height = data.uint16('x00280011')
 | |
|             let width = data.uint16('x00280010')
 | |
|             let bitsPerSample = data.uint16('x00280100')
 | |
|             let componentCount = data.string('x00280004')
 | |
|             let transportSyntax = data.string('x00020010')
 | |
|             // let pixel = data.byteArrayParser.readUint16('x7fe0x0010')
 | |
|             let pixelDataElement = data.elements.x7fe00010;
 | |
|             let pixelDataOffset = pixelDataElement.dataOffset;
 | |
|             let pixelDataLength = pixelDataElement.length;
 | |
|             let pixelDataBytes = data.byteArray.subarray(pixelDataOffset, pixelDataOffset + pixelDataLength)
 | |
|             if (transportSyntax === '1.2.840.10008.1.2.1' && ~componentCount.indexOf('MONOCHROME')) {
 | |
|               let encoder = new codecWrapper.Encoder();
 | |
|               let decodedBytes = encoder.getDecodedBuffer({width: width, height: height, bitsPerSample: bitsPerSample, componentCount: 1})
 | |
|               encoder.setNearLossless(0);
 | |
|               // 像素数据 7fe0 0010
 | |
|               decodedBytes.set(pixelDataBytes);
 | |
|               let startTime = performance.now()
 | |
|               encoder.encode()
 | |
|               let endTime = performance.now();
 | |
|               // dicom替换压缩像素 组装
 | |
|               let encodeDurationInSeconds = endTime - startTime
 | |
|               let encodedBytes = encoder.getEncodedBuffer();
 | |
|               data.elements['x00020010'].value = '1.2.840.10008.1.2.4.80'
 | |
|               console.log(data.elements['x7fe00010'].length)
 | |
|               data.elements['x7fe00010'].length = encodedBytes.length
 | |
|               console.log(data.elements['x7fe00010'].length)
 | |
|               let mateDataBytes = data.byteArray.subarray(0, pixelDataOffset)
 | |
|               let modifiedByteArray = new Uint8Array([...mateDataBytes, ...encodedBytes])
 | |
|               let newData = new dicomParser.ByteStream(data.byteArrayParser, modifiedByteArray, 0)
 | |
|               console.log(data)
 | |
|               console.log(newData)
 | |
|               console.log(dicomParser.parseDicom(new Uint8Array(newData.byteArray)))
 | |
|               await this.upload(`test/${index}`, newData)
 | |
|               encoder.delete();
 | |
|               return
 | |
|             }
 | |
|           };
 | |
|           reader.readAsArrayBuffer(item);
 | |
|         })
 | |
|       }
 | |
|     },
 | |
|     open() {
 | |
|       this.IsOpen = true
 | |
|     },
 | |
|     uploadOver(isSuccess, res) {
 | |
|       if (isSuccess) {
 | |
|         this.IsOpen = false
 | |
|         this.videoUrl = res.url
 | |
|         this.videoName = res.name
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| }
 | |
| </script>
 | |
| 
 | |
| <style scoped>
 | |
| 
 | |
| </style>
 |