体检系统架构
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

365 lines
13 KiB

// using System;
// using System.Collections.Generic;
// using System.Drawing;
// using System.Drawing.Drawing2D;
// using System.Drawing.Imaging;
// using System.Linq;
//
// namespace DICOMCoverter
// {
// public enum ImageBitsPerPixel { Eight, Sixteen, TwentyFour };
//
// internal class ImageControl
// {
// private List<byte> pix8;
// private List<ushort> pix16;
// private List<byte> pix24;
// private Bitmap bmp;
//
// // For Window Level
// private int winMin;
//
// private int winMax;
// private int winCentre;
// private int winWidth;
//
// private byte[] lut8;
// private byte[] lut16;
//
// //======================
// private List<byte> pixels8;
//
// private List<ushort> pixels16;
// private List<byte> pixels24; // 30 July 2010
//
// /// <summary>
// /// 每一个像素的取样数,一般来说,CT,MR,DR等灰度图像都是1,而彩超等彩**图像都是3,分别表示R, G, B三个颜色通道。
// /// </summary>
// // int samplesPerPixel; // Updated 30 July 2010
// private double windowsCentre;
//
// private double windowsWidth;
// private int maxPixelValue; // Updated July 2012
// private int minPixelValue;
// //=====================
//
// public ImageControl()
// {
// pix8 = new List<byte>();
// pix16 = new List<ushort>();
// pix24 = new List<byte>();
// winMin = 0;
// winMax = 65535;
// lut8 = new byte[256];
// lut16 = new byte[65536];
// //==========================
// pixels8 = new List<byte>();
// pixels16 = new List<ushort>();
// pixels24 = new List<byte>();
// maxPixelValue = 0;
// minPixelValue = 65535;
// //===========================
// }
//
// /// <summary>
// /// 生成8位深度图
// /// </summary>
// /// <param name="dd"></param>
// public void CreateImage8depth(DicomDecoder dd)
// {
// if (dd.samplesPerPixel == 1 && dd.bitsAllocated == 8)
// {
// windowsCentre = dd.windowCentre;
// windowsWidth = dd.windowWidth;
// pixels8.Clear();
// pixels16.Clear();
// pixels24.Clear();
// dd.GetPixels8(ref pixels8);
//
// minPixelValue = pixels8.Min();
// maxPixelValue = pixels8.Max();
//
// if (dd.signedImage)
// {
// windowsCentre -= char.MinValue;
// }
//
// if (Math.Abs(windowsWidth) < 0.001)
// {
// windowsWidth = maxPixelValue - minPixelValue;
// }
//
// if ((windowsCentre == 0) ||
// (minPixelValue > windowsCentre) || (maxPixelValue < windowsCentre))
// {
// windowsCentre = (maxPixelValue + minPixelValue) / 2;
// }
//
// winWidth = Convert.ToInt32(windowsWidth);
// winCentre = Convert.ToInt32(windowsCentre);
//
// pix8 = pixels8;
// if (bmp != null)
// bmp.Dispose();
// ResetValues();
// ComputeLookUpTable8();
// bmp = new Bitmap(dd.width, dd.height, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
//
// CreateImage8(dd.width, dd.height);
// }
//
// if (dd.samplesPerPixel == 3 && dd.bitsAllocated == 8)
// {
// windowsCentre = dd.windowCentre;
// windowsWidth = dd.windowWidth;
// winWidth = Convert.ToInt32(windowsWidth);
// winCentre = Convert.ToInt32(windowsCentre);
// pixels8.Clear();
// pixels16.Clear();
// pixels24.Clear();
// dd.GetPixels8(ref pixels8);
// pix24 = pixels8;
//
// if (bmp != null)
// bmp.Dispose();
// ResetValues();
// ComputeLookUpTable8();
// bmp = new Bitmap(dd.width, dd.height, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
// CreateImage24(dd.width, dd.height);
// }
// }
//
// /// <summary>
// /// 生成16位深度的图
// /// </summary>
// /// <param name="dd"></param>
// public void CreateImage16Depth(DicomDecoder dd)
// {
// windowsWidth = dd.windowWidth;
// windowsCentre = dd.windowCentre;
// pixels16.Clear();
// pixels8.Clear();
// pixels24.Clear();
// dd.GetPixels16(ref pixels16);
//
// minPixelValue = pixels16.Min();
// maxPixelValue = pixels16.Max();
//
// if (dd.signedImage)
// {
// windowsCentre -= short.MinValue;
// }
//
// if (Math.Abs(windowsWidth) < 0.001)
// {
// windowsWidth = maxPixelValue - minPixelValue;
// }
//
// if ((windowsCentre == 0) ||
// (minPixelValue > windowsCentre) || (maxPixelValue < windowsCentre))
// {
// windowsCentre = (maxPixelValue + minPixelValue) / 2;
// }
//
// winWidth = Convert.ToInt32(windowsWidth);
// winCentre = Convert.ToInt32(windowsCentre);
//
// pix16 = pixels16;
// if (bmp != null)
// bmp.Dispose();
// ResetValues();
// ComputeLookUpTable16();
// bmp = new Bitmap(dd.width, dd.height, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
// CreateImage16(dd.width, dd.height);
// }
//
// // Create a bitmap on the fly, using 8-bit grayscale pixel data
// private void CreateImage8(int imgWidth, int imgHeight)
// {
// BitmapData bmd = bmp.LockBits(new Rectangle(0, 0, imgWidth, imgHeight),
// System.Drawing.Imaging.ImageLockMode.ReadOnly, bmp.PixelFormat);
//
// unsafe
// {
// int pixelSize = 3;
// int i, j, j1;
// byte b;
//
// for (i = 0; i < bmd.Height; ++i)
// {
// byte* row = (byte*)bmd.Scan0 + (i * bmd.Stride);
//
// for (j = 0; j < bmd.Width; ++j)
// {
// b = lut8[pix8[i * bmd.Width + j]];
// j1 = j * pixelSize;
// row[j1] = b; // Red
// row[j1 + 1] = b; // Green
// row[j1 + 2] = b; // Blue
// }
// }
// }
//
// bmp.UnlockBits(bmd);
//
// bmp = KiResizeImage(bmp, 400, 400);
// SaveImage(bmp, DateTime.Now.ToString("yyyy-MM-dd") + DateTime.Now.Millisecond);
// }
//
// // Create a bitmap on the fly, using 24-bit RGB pixel data
// private void CreateImage24(int imgWidth, int imgHeight)
// {
// {
// int numBytes = imgWidth * imgHeight * 3;
// int j;
// int i, i1;
//
// BitmapData bmd = bmp.LockBits(new Rectangle(0, 0, bmp.Width,
// bmp.Height), ImageLockMode.WriteOnly, bmp.PixelFormat);
//
// int width3 = bmd.Width * 3;
//
// unsafe
// {
// for (i = 0; i < bmd.Height; ++i)
// {
// byte* row = (byte*)bmd.Scan0 + (i * bmd.Stride);
// i1 = i * bmd.Width * 3;
//
// for (j = 0; j < width3; j += 3)
// {
// // Windows uses little-endian, so the RGB data is
// // actually stored as BGR
// row[j + 2] = lut8[pix24[i1 + j]]; // Blue
// row[j + 1] = lut8[pix24[i1 + j + 1]]; // Green
// row[j] = lut8[pix24[i1 + j + 2]]; // Red
// }
// }
// }
// bmp.UnlockBits(bmd);
// }
// }
//
// // Create a bitmap on the fly, using 16-bit grayscale pixel data
// private void CreateImage16(int imgWidth, int imgHeight)
// {
// BitmapData bmd = bmp.LockBits(new Rectangle(0, 0, imgWidth, imgHeight),
// System.Drawing.Imaging.ImageLockMode.ReadOnly, PixelFormat.Format8bppIndexed);
//
// unsafe
// {
// int pixelSize = 3;
// int i, j, j1 = 0;
// byte b;
//
// for (i = 0; i < bmd.Height; ++i)
// {
// //取到每行的总长度
// byte* row = (byte*)bmd.Scan0 + (i * bmd.Stride);
//
// //i1 = i * bmd.Width;
//
// for (j = 0; j < bmd.Width; ++j)
// {
// //取色值
// b = lut16[pix16[i * bmd.Width + j]];//i*width+j当前行的第j个像素点
// j1 = j * pixelSize;
// row[j1] = b; // Red
// row[j1 + 1] = b; // Green
// row[j1 + 2] = b; // Blue
// }
// }
// }
// bmp.UnlockBits(bmd);
// //指定压缩后的图片大小
// bmp = KiResizeImage(bmp, imgWidth, imgHeight);
// SaveImage(bmp, DateTime.Now.ToString("yyyy-MM-dd") + DateTime.Now.Millisecond);
// //bmp.Save(DateTime.Now.ToString("yyyy-MM-dd") + DateTime.Now.Millisecond + ".jpg");
// }
//
// /// <summary>
// /// 压缩图片大小
// /// </summary>
// /// <param name="bmp"></param>
// /// <param name="newW"></param>
// /// <param name="newH"></param>
// /// <param name="Mode"></param>
// /// <returns></returns>
// public Bitmap KiResizeImage(Bitmap bmp, int newW, int newH)
// {
// try
// {
// Bitmap b = new Bitmap(newW, newH);
// Graphics g = Graphics.FromImage(b);
// // 插值算法的质量
// g.InterpolationMode = InterpolationMode.Low;
// g.DrawImage(bmp, new Rectangle(0, 0, newW, newH), new Rectangle(0, 0, bmp.Width, bmp.Height), GraphicsUnit.Pixel);
// g.Dispose();
// return b;
// }
// catch (Exception ex)
// {
// return null;
// }
// }
//
// // Method to save an image as PNG. The image is saved as per the current window/level values.
// public void SaveImage(Bitmap bmp, String fileName)
// {
// if (bmp != null && !string.IsNullOrWhiteSpace(fileName))
// bmp.Save(fileName + ".jpg");
// }
//
// // We use the linear interpolation method here
// // Nonlinear methods like sigmoid are also common, but we don't do them here.
// private void ComputeLookUpTable8()
// {
// if (winMax == 0)
// winMax = 255;
//
// int range = winMax - winMin;
// if (range < 1) range = 1;
// double factor = 255.0 / range;
//
// for (int i = 0; i < 256; ++i)
// {
// if (i <= winMin)
// lut8[i] = 0;
// else if (i >= winMax)
// lut8[i] = 255;
// else
// {
// lut8[i] = (byte)((i - winMin) * factor);
// }
// }
// }
//
// // Linear interpolation here too
// private void ComputeLookUpTable16()
// {
// int range = winMax - winMin;
// if (range < 1) range = 1;
// double factor = 255.0 / range;
// int i;
//
// for (i = 0; i < 65536; ++i)
// {
// if (i <= winMin)
// lut16[i] = 0;
// else if (i >= winMax)
// lut16[i] = 255;
// else
// {
// lut16[i] = (byte)((i - winMin) * factor);
// }
// }
// }
//
// // Restore original window/level values
// public void ResetValues()
// {
// winMax = Convert.ToInt32(winCentre + 0.5 * winWidth);
// winMin = winMax - winWidth;
// }
// }
// }