private static bool[] CreateOverlayData(FrameDataGetter frameDataGetter, int frameCount) { bool[] overlayData = null; for (int n = 0; n < frameCount; n++) { var frameData = frameDataGetter.Invoke(n + 1); if (overlayData == null) { overlayData = new bool[frameData.Length*frameCount]; } var cursor = frameData.Length*n; for (int i = 0; i < frameData.Length; i++) { overlayData[cursor++] = frameData[i] > 0.5f; } } return overlayData; }
private static byte[] CreatePixelData(FrameDataGetter frameDataGetter, int frameCount, int bitsAllocated, int bitsStored, int highBit, bool isSigned) { if (bitsAllocated != 8 && bitsAllocated != 16) throw new ArgumentException("bitsAllocated must be either 8 or 16.", "bitsAllocated"); byte[] pixelData = null; for (int n = 0; n < frameCount; n++) { var frameData = frameDataGetter.Invoke(n + 1); if (pixelData == null) { pixelData = new byte[frameData.Length*frameCount*bitsAllocated/8]; } int min = DicomPixelData.GetMinPixelValue(bitsStored, isSigned); int max = DicomPixelData.GetMaxPixelValue(bitsStored, isSigned); if (bitsAllocated == 16) { var cursor = frameData.Length*n*2; for (int i = 0; i < frameData.Length; i++) { var value = Math.Max(min, Math.Min(max, (int)(min + (max - min) * frameData[i]))); value = value << (highBit - bitsStored + 1); if (ByteBuffer.LocalMachineEndian == Endian.Little) { pixelData[cursor++] = (byte) (value & 0x00FF); pixelData[cursor++] = (byte) ((value >> 8) & 0x00FF); } else { pixelData[cursor++] = (byte) ((value >> 8) & 0x00FF); pixelData[cursor++] = (byte) (value & 0x00FF); } } } else if (bitsAllocated == 8) { var cursor = frameData.Length*n; for (int i = 0; i < frameData.Length; i++) { var value = Math.Max(min, Math.Min(max, (int)(min + (max - min) * frameData[i]))); value = value << (highBit - bitsStored + 1); pixelData[cursor++] = (byte) (value & 0x00FF); } } } //just in case, we'll clean the pixel data up. This also (cheaply) removes the //higher order 1s that shouldn't be there for the signed case. DicomUncompressedPixelData.ZeroUnusedBits(pixelData, bitsAllocated, bitsStored, highBit); return pixelData; }