public float[] GetFloats(ImageSourceFormat srcFormat, ChannelConfiguration channels, bool premultiplied, GammaEncoding gamma) { ImageDestFormat destFormat; if (srcFormat == ImageSourceFormat.HalfRGBA || srcFormat == ImageSourceFormat.SingleRGBA) { if (premultiplied) { destFormat = channels == ChannelConfiguration.BGR ? ImageDestFormat.PremultipliedBGRA32 : ImageDestFormat.PremultipliedRGBA32; } else { destFormat = channels == ChannelConfiguration.BGR ? ImageDestFormat.BGRA32 : ImageDestFormat.RGBA32; } } else { destFormat = channels == ChannelConfiguration.BGR ? ImageDestFormat.BGR32 : ImageDestFormat.RGB32; } var bytesPerPixel = EXRFile.GetBytesPerPixel(destFormat); var channelCount = srcFormat == ImageSourceFormat.SingleRGB || srcFormat == ImageSourceFormat.HalfRGB ? 3 : 4; var bytes = GetBytes(srcFormat, destFormat, gamma, DataWindow.Width * bytesPerPixel); float[] floats = new float[bytes.Length / sizeof(float)]; Buffer.BlockCopy(bytes, 0, floats, 0, bytes.Length); return(floats); }
public Half[] GetHalfs(ImageSourceFormat srcFormat, ChannelConfiguration channels, bool premultiplied, GammaEncoding gamma) { ImageDestFormat destFormat; if (srcFormat == ImageSourceFormat.HalfRGBA || srcFormat == ImageSourceFormat.SingleRGBA) { if (premultiplied) { destFormat = channels == ChannelConfiguration.BGR ? ImageDestFormat.PremultipliedBGRA16 : ImageDestFormat.PremultipliedRGBA16; } else { destFormat = channels == ChannelConfiguration.BGR ? ImageDestFormat.BGRA16 : ImageDestFormat.RGBA16; } } else { destFormat = channels == ChannelConfiguration.BGR ? ImageDestFormat.BGR16 : ImageDestFormat.RGB16; } var bytesPerPixel = EXRFile.GetBytesPerPixel(destFormat); var channelCount = srcFormat == ImageSourceFormat.SingleRGB || srcFormat == ImageSourceFormat.HalfRGB ? 3 : 4; var bytes = GetBytes(srcFormat, destFormat, gamma, DataWindow.Width * bytesPerPixel); Half[] halfs = new Half[bytes.Length / 2]; Buffer.BlockCopy(bytes, 0, halfs, 0, bytes.Length); return(halfs); }
public byte[] GetBytes(ImageSourceFormat srcFormat, ImageDestFormat destFormat, GammaEncoding gamma, int stride) { CheckHasData(); int bytesPerPixel = EXRFile.GetBytesPerPixel(destFormat); int bitsPerPixel = EXRFile.GetBitsPerPixel(destFormat); if (stride < bytesPerPixel * DataWindow.Width) { throw new ArgumentException("Stride was lower than minimum", "stride"); } byte[] buffer = new byte[stride * DataWindow.Height]; var padding = stride - bytesPerPixel * DataWindow.Width; bool isHalf = srcFormat == ImageSourceFormat.HalfRGB || srcFormat == ImageSourceFormat.HalfRGBA; bool sourceAlpha = false; bool destinationAlpha = destFormat == ImageDestFormat.BGRA16 || destFormat == ImageDestFormat.BGRA32 || destFormat == ImageDestFormat.BGRA8 || destFormat == ImageDestFormat.PremultipliedBGRA16 || destFormat == ImageDestFormat.PremultipliedBGRA32 || destFormat == ImageDestFormat.PremultipliedBGRA8 || destFormat == ImageDestFormat.PremultipliedRGBA16 || destFormat == ImageDestFormat.PremultipliedRGBA32 || destFormat == ImageDestFormat.PremultipliedRGBA8 || destFormat == ImageDestFormat.RGBA16 || destFormat == ImageDestFormat.RGBA32 || destFormat == ImageDestFormat.RGBA8; bool premultiplied = destFormat == ImageDestFormat.PremultipliedBGRA16 || destFormat == ImageDestFormat.PremultipliedBGRA32 || destFormat == ImageDestFormat.PremultipliedBGRA8 || destFormat == ImageDestFormat.PremultipliedRGBA16 || destFormat == ImageDestFormat.PremultipliedRGBA32 || destFormat == ImageDestFormat.PremultipliedRGBA8; bool bgra = destFormat == ImageDestFormat.BGR16 || destFormat == ImageDestFormat.BGR32 || destFormat == ImageDestFormat.BGR8 || destFormat == ImageDestFormat.BGRA16 || destFormat == ImageDestFormat.BGRA32 || destFormat == ImageDestFormat.BGRA8 || destFormat == ImageDestFormat.PremultipliedBGRA16 || destFormat == ImageDestFormat.PremultipliedBGRA32 || destFormat == ImageDestFormat.PremultipliedBGRA8; Half[] hr, hg, hb, ha; float[] fr, fg, fb, fa; hr = hg = hb = ha = null; fr = fg = fb = fa = null; if (isHalf) { if (!HalfChannels.ContainsKey("R")) { throw new ArgumentException("Half type channel R not found", "srcFormat"); } if (!HalfChannels.ContainsKey("G")) { throw new ArgumentException("Half type channel G not found", "srcFormat"); } if (!HalfChannels.ContainsKey("B")) { throw new ArgumentException("Half type channel B not found", "srcFormat"); } hr = HalfChannels["R"]; hg = HalfChannels["G"]; hb = HalfChannels["B"]; if (srcFormat == ImageSourceFormat.HalfRGBA) { if (!HalfChannels.ContainsKey("A")) { throw new ArgumentException("Half type channel A not found", "srcFormat"); } ha = HalfChannels["A"]; sourceAlpha = true; } } else { if (!FloatChannels.ContainsKey("R")) { throw new ArgumentException("Single type channel R not found", "srcFormat"); } if (!FloatChannels.ContainsKey("G")) { throw new ArgumentException("Single type channel G not found", "srcFormat"); } if (!FloatChannels.ContainsKey("B")) { throw new ArgumentException("Single type channel B not found", "srcFormat"); } fr = FloatChannels["R"]; fg = FloatChannels["G"]; fb = FloatChannels["B"]; if (srcFormat == ImageSourceFormat.HalfRGBA) { if (!FloatChannels.ContainsKey("A")) { throw new ArgumentException("Single type channel A not found", "srcFormat"); } fa = FloatChannels["A"]; sourceAlpha = true; } } // !PARALLEL /* * int srcIndex = 0; * int destIndex = 0; * * BinaryWriter writer = new BinaryWriter(new MemoryStream(buffer)); * * for (int y = 0; y < DataWindow.Height; y++, destIndex += padding) { * GetScanlineBytes(bytesPerPixel, destIndex, srcIndex, isHalf, destinationAlpha, sourceAlpha, * hr, hg, hb, ha, fr, fg, fb, fa, * bitsPerPixel, gamma, premultiplied, bgra, buffer, writer); * destIndex += DataWindow.Width * bytesPerPixel; * srcIndex += DataWindow.Width; * } * * writer.Dispose(); * writer.BaseStream.Dispose(); */ var actions = (from y in Enumerable.Range(0, DataWindow.Height) select(Action)(() => { var destIndex = stride * y; var srcIndex = DataWindow.Width * y; using var stream = new MemoryStream(buffer); using var writer = new BinaryWriter(stream); GetScanlineBytes(bytesPerPixel, destIndex, srcIndex, isHalf, destinationAlpha, sourceAlpha, hr, hg, hb, ha, fr, fg, fb, fa, bitsPerPixel, gamma, premultiplied, bgra, buffer, writer); })).ToArray(); Parallel.Invoke(actions); return(buffer); }
public byte[] GetBytes(ImageSourceFormat srcFormat, ImageDestFormat destFormat, GammaEncoding gamma) { return(GetBytes(srcFormat, destFormat, gamma, DataWindow.Width * EXRFile.GetBytesPerPixel(destFormat))); }