基于WebSocket的dicom.PixelData的数据的传输

PixelData数据传输两个问题,第一个数据传输前后的格式转换。第二个数据的压缩与解压。

第一步数据传输前后的格式转换

后台

1.通过Attributes 得到像素字节数组:pixelModel.setPixelData(att.getBytes(Tag.PixelData));

2.转化为二进制字节流缓冲流:ByteBuffer buffer=ByteBuffer.wrap(dicom2json.getCompressPixelData());

3.发送数据:this.session.getBasicRemote().sendBinary(buffer);

前端

1.在WebSocket的连接时声明webSocket接收到的数据类型(如果不声明的话默认是blob)
    if ('WebSocket' in window) {
        websocket = new WebSocket("ws://localhost:8080/WebDemo2/test");
        websocket.binaryType = "arraybuffer"; //关键步骤。设置webSocket接收到的数据对象类型
    } else {
        alert('Not support websocket')
    }
2.将字节流读取为双字节的整形数组var ints = new Int16Array(event.data);//event.data为arraybuffer类型

3.将Int16Array转化为普通的array数组,方便全局调用。var arr = [].slice.call(ints);

到这里数据格式的前后端转化就完成了。

第二步数据的压缩和解压

数据的压缩

数据的压缩我们暂时采用的是Gzip压缩(LZ77算法和Huffman编码)
关于Gzip压缩的详细原理可以参考:http://blog.csdn.net/ghevinn/article/details/45747465
压缩率目前测试浮动比较大50%~99%。压缩率与dicom文件中pixel数据的规律性,重复性有关,不做过多探讨。

以下是后台的压缩代码

ByteArrayOutputStream bos = new ByteArrayOutputStream();
GZIPOutputStream oos = new GZIPOutputStream(bos);// 将数据压缩到内存流中
oos.write(huPixleData);
oos.close();
byte dest[] = bos.toByteArray();// 从内存流中取出压缩后的数据
System.out.println("压缩率:"+(((float)dest.length)/huPixleData.length));
return dest;

前端的解压

var data = pako.inflate(event.data);//调用pako.js组件  解压arrayBuffer。  data是int8Array数据类型

由于解压出来直接是int8Array类型,而我们需要的是int16Array类型的数据。所以需要做一个转化处理

var ints = new Int16Array(data.buffer);

至此前后端的数据传输与压缩解压就全部完成了。

基于WebSocket的dicom.PixelData的数据的传输_第1张图片

图片太大,截图截不全 ╮(╯_╰)╭ 

你可能感兴趣的:(DICOM)