我使用DICOM#(http://sourceforge.net/projects/dicom-cs/)将dicom文件(.dcm)转换为.jpg。 我已完成的代码:
string strFileName = nomeFile;
string strOutFileName = Server.MapPath("uploads/" + "teste");
Stream ins = null;
Dataset ds = null;
FileStream fs = new FileStream(strFileName, FileMode.Open, FileAccess.Read);
System.IO.Stream strm = fs;
Dataset imgds;
imgds = new Dataset();
imgds.ReadFile(strm, FileFormat.DICOM_FILE, 10000);
ByteBuffer byteBuffer = imgds.GetByteBuffer(Tags.PixelData);
byte[] byteArray = (byte[])byteBuffer.ToArray();
MemoryStream ms = new MemoryStream(byteArray);
Image returnImage = Image.FromStream(ms);
strOutFileName = strOutFileName + ".PNG";
returnImage.Save(strOutFileName, ImageFormat.Png);
但是这给了我一个错误:
类型' System.ArgumentException'的例外情况发生在System.Drawing.dll中但未在用户代码中处理
在这一行:
Image returnImage = Image.FromStream(ms);
有没有人有解决方案?
答案 0 :(得分:0)
看起来问题在于从流中解码图像。遗憾的是,ArgumentException
是一个非常一般的错误,当底层GDI库无法处理你提供的内容时,System.Drawing类会抛出这个错误。我怀疑其中一个:
您没有从ByteBuffer
创建的数组中的所有字节,因此Image.FromStream
无法对其进行解码
来自ByteBuffer
的数据太大,无法让GDI制作图像
数据不是已知的图像格式,Image.FromStream
无法对其进行解码。 (例如,它是原始像素数据吗?如果是这样,你必须通过将像素字节写入编码器来不同地构建图像)
额外提示:
使用10000作为传递给ReadFile
的缓冲区大小并不是最佳选择。从底层文件系统读取的块是4096字节的倍数,并且最适合的缓冲区将具有相同的倍数。请参阅:Optimum file buffer read size?。