public static void TransformImage(DisplayData currentPage, IntPtr outputRGBBuffer) { try { if (outputRGBBuffer == IntPtr.Zero) { return; } PresentationState pstate = currentPage.PState; int renderWidth = pstate.RenderWidth; int renderHeight = pstate.RenderHeight; int samplesPerPixel = currentPage.SamplesPerPixel; int width = currentPage.Width; int height = currentPage.Height; int pixelBits = currentPage.PixelBits; int pixelRepresentation = currentPage.PixelRepresentation; double rescaleSlope = currentPage.RescaleSlope; double rescaleIntercept = currentPage.RescaleIntercept; //if a image is a original PET image, its SopClassUID is 1.2.840.10008.5.1.4.1.1.128, So we use bIsOriPT to describe //if a image, its Modality is PT and it's not a RGB image, we use bIsNotRGBPT to describe bool bIsOriPT = (currentPage.SOPClassUID == "1.2.840.10008.5.1.4.1.1.128"); bool bIsNotRGBPT = (currentPage.Modality == Modality.PT && currentPage.SamplesPerPixel == 1); bool bIsPseudoColor = false; if (bIsOriPT) { bIsPseudoColor = !(PresentationState.PalettesEqual(pstate.Palette, PresentationState.DefaultPalette) || PresentationState.PalettesEqual(pstate.Palette, PresentationState.GetInversePalette(PresentationState.DefaultPalette))); } IntPtr imageDataPtr = currentPage.CreateSafePixelDataPtr(); IntPtr imageMaskPtr = currentPage.CreateSafeMaskDataPtr(); if (imageDataPtr != IntPtr.Zero) { NativeMethods.ImageTransform(renderWidth, renderHeight, 0, 0, renderWidth, renderHeight, imageDataPtr, imageMaskPtr, outputRGBBuffer, width, height, samplesPerPixel, pixelBits, pixelRepresentation, rescaleSlope, rescaleIntercept, pstate.RotationClockwise, pstate.OffsetLeft, pstate.OffsetTop, pstate.ScaleX, pstate.ScaleY, pstate.WindowLevel.WindowCenter, pstate.WindowLevel.WindowWidth, pstate.EnhancePara, pstate.PaletteData, (bIsOriPT && !bIsPseudoColor) ? !pstate.IsPaletteReversed : pstate.IsPaletteReversed, (int)DisplayData.InterpMode.Bilinear, bIsNotRGBPT); } else { int stride = (renderWidth * 3 % 4 == 0) ? (renderWidth * 3) : ((renderWidth * 3 / 4 + 1) * 4); NativeMethods.MemSet(outputRGBBuffer, 0, (uint)(stride * renderHeight)); } currentPage.FreeSafePixelDataPtr(); currentPage.FreeSafeMaskDataPtr(); } catch (Exception exp) { MedViewerLogger.Instance.LogDevError(MedViewerLogger.Source, "Exception: " + exp.ToString()); } }