PCでは8bitしか表示できないので、これを変換。
また Bitmap.SetPixel がとても遅いため LockBits を使用。
using System; using System.Drawing; using System.Drawing.Imaging;DICOMオブジェクト
int columns = dicomData.Columns; int rows = dicomData.Rows; int windowCenter = dicomData.WindowCenter; int windowWidth = dicomData.WindowWidth;ビットマップ
1byteが1pixelのグレースケール用ColorPaletteを作成する。
3byte=1pixelのグレースケール(R=G=B)より容量減か。
byte[] pixelData = dicomData.PixelData;Bitmap bitmap; ColorPalette colorPalette; for (int i = 0; i < 256; i++) colorPalette.Entries[i] = Color.FromArgb(i, i, i); Bitmap bitmap = new Bitmap(columns, rows, PixelFormat.Format8bppIndexed);
データの挿入 ()
public unsafe Bitmap Grayscale16To8() { int padding = bitmapData.Stride - columns; int min = windowCenter - windowWidth / 2; int max = windowCenter + windowWidth / 2; fixed (byte* pData = pixelData) { int pixel; short* ptr = (short*)pData; byte* pBitmap = (byte*)bitmapData.Scan0; int j = 0, i = 0; for (int y = 0; y < _rows; y++) { j = y * _columns; for (int x = 0; x < _columns; x++) { pixel = (int)ptr[j + x]; if (pixel <= min) pixel = 0; else if (pixel >= max) pixel = 255; else pixel = (int)((pixel - min) * 255 / (max - min)); pBitmap[i] = (byte)pixel; i++; } i += padding; } } bitmap.UnlockBits(bitmapData); return bitmap; }
0 件のコメント :
コメントを投稿