找回密码
 立即注册

QQ登录

只需一步,快速开始

zssok315

注册会员

3

主题

4

帖子

43

积分

注册会员

积分
43
最新发帖
zssok315
注册会员   /  发表于:2019-1-3 16:05  /   查看:3765  /  回复:3
版主你好,在V20的HTML5 Medical Viewer这个例子中 ObjectRetrieveAddin.cs 这个文件中有一个方法GetImageTile 用来给前端返回一个png图片的流。我想问下现在这个方法的入参是一个本地磁盘上的dicom文件。 我这边有个需求是有个网络上的dicom流文件,有什么办法直接从dicom流文件中解析获取到png图片的流给前端用来显示,这个dicom流文件不需要保存到本地磁盘上
附上SDK中 GetImageTile 方法如下:

        public Stream GetImageTile(string sopInstanceUID, int frameNumber, LeadRect tile, int xResolution, int yResolution, Boolean wldata, string userData, out string mime)
        {
           mime = SupportedMimeTypes.PNG;

           //GetReferencedFile already handles external storage
           var referencedFile = GetReferencedFile(new ObjectUID() { SOPInstanceUID = sopInstanceUID});

           //var referencedFile = "G:\\images\\DX0002.dcm";

           if (!string.IsNullOrEmpty(referencedFile))
           {
              using (var dicomSourceProxy = new DicomSourceProxy(DataCache))
              {
                 var query = new ViewImageQuery() { FileName = referencedFile, FrameNumber = frameNumber + 1, Tile = tile, Resolution = LeadSize.Create(xResolution, yResolution) };

                 //processing?
                 {
                    var specialFunctions = GetUserFunctions(userData);
                    var specialFunction = (from u in specialFunctions
                                           where u.Name == "Perio" || u.Name == "Dentin" || u.Name == "Endo"
                                           select u).FirstOrDefault();

                    if (specialFunction != null)
                    {
                       query.PostLoadAction = (image) => { ProcessSpecialFunction(image, specialFunction); };
                       query.PostLoadActionName = specialFunction.Name;//may add parameters here so to cache different ones
                    }
                 }

                 try
                 {
                    var result = dicomSourceProxy.Load(query);
                    {
                       if (result.Raw != null)
                       {                          
                          mime = result.RawMimeType;
                          return result.Raw;//return same stream, no dispose off of the result
                       }

                       var output = new byte[0];
                       if (null != result.AutoScaleData && !result.AutoScaleData.IsEmpty)
                       {
                          output = SerializeAutoScale(result.AutoScaleData.AutoScaleIntercept, result.AutoScaleData.AutoScaleSlope, result.Image);
                       }

                       var imageStream = new MemoryStream();

                       if (!wldata)
                       {
                          ApplyImageProcessing(result.Image, userData);

                          using (RasterCodecs codecs = new RasterCodecs())
                          {
                             codecs.Options.Jpeg.Save.QualityFactor = 2;
                             codecs.Save(result.Image, imageStream, RasterImageFormat.Jpeg, 0);

                             imageStream.Position = 0;
                          }
                       }
                       else
                       {
                          GetImageBufferAsPNG(result.Image, output, imageStream);
                       }

                       result.Dispose();//done with
                       return imageStream;
                    }
                 }
                 catch
                 {
                    //ignored
                 }
              }
           }

           return new MemoryStream();
        }



3 个回复

倒序浏览
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2019-1-4 10:24:40
沙发
可以看到这个方法里下面就是去获取PNG流,也就是result.Raw,
或者自己创建一个MemoryStream,然后保存一个result.Image到这个流里面

因此您只需要替换这里的代码为您要传输的流就可以了
回复 使用道具 举报
zssok315
注册会员   /  发表于:2019-1-4 14:46:57
板凳
Richard.Ma 发表于 2019-1-4 10:24
可以看到这个方法里下面就是去获取PNG流,也就是result.Raw,
或者自己创建一个MemoryStream,然后保存一 ...

不好意思,可能我没表达太清楚,其实是这个方法
var query = new ViewImageQuery() { FileName = referencedFile, FrameNumber = frameNumber + 1, Tile = tile, Resolution = LeadSize.Create(xResolution, yResolution) };
var result = dicomSourceProxy.Load(query);
这个ViewImageQuery 里面FileName 这里只能是磁盘上的dicom文件的路径,而不能传进去一个dicom的stream作为入参的参数,这边我通过其他方法解决了这个问题

           using (DicomDataSet dicomDs = new DicomDataSet())
           {
               dicomDs.Load(fileStream, DicomDataSetLoadFlags.None);  
              //上面这里的fileStream就是一个dicom的stream
              
               image111 = GetImage(dicomDs);
               if (image111 != null)
               {
                   GetImageBufferAsPNG(image111, output, imageStream);
               }
           }
回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2019-1-4 23:18:06
地板
解决了就好
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部