BGR > RGB の変換が必要
.net 4.0から Parallel.For が使えるようになったので一部訂正。2015-08-12
- {
- if(PhotometricInterpretation != "RGB")
- retern;
- //dataSet: DicomDataSet
- Bitmap bitmap;
- int columns = dataSet.Columns;
- int rows = dataSet.Rows;
- byte[] pixelData = dataSet.PixelData;
- bitmap = new Bitmap(columns, rows, PixelFormat.Format24bppRgb);
- BitmapData bitmapData = bitmap.LockBits(new Rectangle(0, 0, columns, rows),
- ImageLockMode.WriteOnly, PixelFormat.Format24bppRgb);
- int padding = bitmapData.Stride - columns;
- 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++)
- {
- i = j + x;
- pBitmap[i * 3] = pixelData[i * 3 + 2]; //G
- pBitmap[i * 3 + 1] = pixelData[i * 3 + 1]; //B
- pBitmap[i * 3 + 2] = pixelData[i * 3]; //R
- }
- i += padding;
- }
- bitmap.UnlockBits(bitmapData);
- return bitmap;
- }
- fixed (byte* pData = pixelData)
- {
- byte* rgb = pData;
- int stride = bmpData.Stride;
- Parallel.For(0, rows, y =>
- {
- for (int x = 0; x < columns; x++)
- {
- int pos = (x * 3) + y * stride;
- pBitmap[pos] = rgb[pos + 2]; //G
- pBitmap[pos + 1] = rgb[pos + 1]; //B
- pBitmap[pos + 2] = rgb[pos]; //R
- }
- });
- }