public System.Drawing.Bitmap FlushToBitmap() { byte[] bits = new byte[width * height * 4]; memStream = new System.IO.MemoryStream(bits); var stream = new SharpDX.WIC.WICStream(wicFactory, memStream); // Initialize a Jpeg encoder with this stream var encoder = new SharpDX.WIC.BitmapEncoder(wicFactory, SharpDX.WIC.ContainerFormatGuids.Bmp); encoder.Initialize(stream); // Create a Frame encoder var bitmapFrameEncode = new SharpDX.WIC.BitmapFrameEncode(encoder); bitmapFrameEncode.Initialize(); bitmapFrameEncode.SetSize(width, height); var pixelFormatGuid = SharpDX.WIC.PixelFormat.FormatDontCare; bitmapFrameEncode.SetPixelFormat(ref pixelFormatGuid); bitmapFrameEncode.WriteSource(wicBitmap); bitmapFrameEncode.Commit(); encoder.Commit(); bitmapFrameEncode.Dispose(); encoder.Dispose(); stream.Dispose(); return((System.Drawing.Bitmap)System.Drawing.Bitmap.FromStream(memStream)); }
//TODO: check this way to getting back texture //public BitmapSource ToBitmap() { // if (_d3D11Image == null) // return null; // // Copy back buffer to WriteableBitmap. // int width = _d3D11Image.PixelWidth; // int height = _d3D11Image.PixelHeight; // var format = EnableAlpha ? PixelFormats.Bgra32 : PixelFormats.Bgr32; // var writeableBitmap = new WriteableBitmap(width, height, 96, 96, format, null); // writeableBitmap.Lock(); // try { // uint[] data = new uint[width * height]; // _d3D11Image.TryGetData(data); // // Get a pointer to the back buffer. // unsafe { // uint* pBackbuffer = (uint*)writeableBitmap.BackBuffer; // for (int i = 0; i < data.Length; i++) // pBackbuffer[i] = data[i]; // } // writeableBitmap.AddDirtyRect(new Int32Rect(0, 0, width, height)); // } finally { // writeableBitmap.Unlock(); // } // return writeableBitmap; //} static void Copy(Texture2D texture, Stream stream, SharpDX.Direct3D11.Device device) { var desc = new Texture2DDescription { Width = (int)texture.Description.Width, Height = (int)texture.Description.Height, MipLevels = 1, ArraySize = 1, Format = texture.Description.Format, Usage = ResourceUsage.Staging, SampleDescription = new SampleDescription(1, 0), BindFlags = BindFlags.None, CpuAccessFlags = CpuAccessFlags.Read, OptionFlags = ResourceOptionFlags.None }; using (var factory = new SharpDX.WIC.ImagingFactory()) { using (var textureCopy = new Texture2D(device, desc)) { device.ImmediateContext.CopyResource(texture, textureCopy); var dataBox = device.ImmediateContext.MapSubresource( textureCopy, 0, 0, MapMode.Read, global::SharpDX.Direct3D11.MapFlags.None, out SharpDX.DataStream dataStream); using (dataStream) { var t = dataStream.ReadByte(); //ReadFloat(); var dataRectangle = new SharpDX.DataRectangle { DataPointer = dataStream.DataPointer, Pitch = dataBox.RowPitch }; //https://github.com/sharpdx/Toolkit/blob/master/Source/Toolkit/SharpDX.Toolkit.Graphics/WICHelper.cs using (var bitmap = new SharpDX.WIC.Bitmap(factory, textureCopy.Description.Width, textureCopy.Description.Height, SharpDX.WIC.PixelFormat.Format32bppRGBA, dataRectangle, 0)) { stream.Position = 0; using (var bitmapEncoder = new SharpDX.WIC.PngBitmapEncoder(factory, stream)) { using (var bitmapFrameEncode = new SharpDX.WIC.BitmapFrameEncode(bitmapEncoder)) { bitmapFrameEncode.Initialize(); bitmapFrameEncode.SetSize(bitmap.Size.Width, bitmap.Size.Height); var pixelFormat = SharpDX.WIC.PixelFormat.FormatDontCare; bitmapFrameEncode.SetPixelFormat(ref pixelFormat); bitmapFrameEncode.WriteSource(bitmap); bitmapFrameEncode.Commit(); bitmapEncoder.Commit(); } } } device.ImmediateContext.UnmapSubresource(textureCopy, 0); } } } }
/// <summary> /// 保存图片 /// </summary> /// <param name="wicFactory"></param> /// <param name="wicBitmap"></param> /// <param name="outputStream"></param> static void SaveD2DBitmap(SharpDX.WIC.ImagingFactory wicFactory, SharpDX.WIC.Bitmap wicBitmap, Stream outputStream) { using var encoder = new SharpDX.WIC.BitmapEncoder(wicFactory, SharpDX.WIC.ContainerFormatGuids.Png); encoder.Initialize(outputStream); using var frame = new SharpDX.WIC.BitmapFrameEncode(encoder); frame.Initialize(); frame.SetSize(wicBitmap.Size.Width, wicBitmap.Size.Height); var pixelFormat = wicBitmap.PixelFormat; frame.SetPixelFormat(ref pixelFormat); frame.WriteSource(wicBitmap); frame.Commit(); encoder.Commit(); }
public static void SaveBitmap(DeviceManager dev, SharpDX.WIC.Bitmap bm, string filename) { System.Diagnostics.Debug.Assert(bm != null); Guid containerFormat = Guid.Empty; string lowerName = filename.ToLower(); if (lowerName.Contains(".png")) { containerFormat = SharpDX.WIC.ContainerFormatGuids.Png; } else if (lowerName.Contains(".bmp")) { containerFormat = SharpDX.WIC.ContainerFormatGuids.Bmp; } else if (lowerName.Contains(".jpg")) { containerFormat = SharpDX.WIC.ContainerFormatGuids.Jpeg; } else if (lowerName.Contains(".jpeg")) { containerFormat = SharpDX.WIC.ContainerFormatGuids.Jpeg; } else if (lowerName.Contains(".tif")) { containerFormat = SharpDX.WIC.ContainerFormatGuids.Tiff; } else if (lowerName.Contains(".gif")) { containerFormat = SharpDX.WIC.ContainerFormatGuids.Gif; } Guid format = bm.PixelFormat; using (var stream = System.IO.File.OpenWrite(filename)) { stream.Position = 0; using (SharpDX.WIC.BitmapEncoder enc = new SharpDX.WIC.BitmapEncoder(dev.WICFactory, containerFormat, stream)) using (SharpDX.WIC.BitmapFrameEncode bfe = new SharpDX.WIC.BitmapFrameEncode(enc)) { bfe.Initialize(); bfe.SetPixelFormat(ref format); bfe.SetSize(bm.Size.Width, bm.Size.Height); bfe.WriteSource(bm); bfe.Commit(); enc.Commit(); } } }
public void Save(string filePath) { using (SharpDX.WIC.WICStream wICStream = new SharpDX.WIC.WICStream(imagingFactory, filePath, SharpDX.IO.NativeFileAccess.Write)) using (SharpDX.WIC.PngBitmapEncoder encoder = new SharpDX.WIC.PngBitmapEncoder(imagingFactory)) { encoder.Initialize(wICStream); using (SharpDX.WIC.BitmapFrameEncode bitmapFrameEncode = new SharpDX.WIC.BitmapFrameEncode(encoder)) { bitmapFrameEncode.Initialize(); bitmapFrameEncode.SetSize((int)this.Width, (int)this.Height); var pixelFormatGuid = SharpDX.WIC.PixelFormat.FormatDontCare; bitmapFrameEncode.SetPixelFormat(ref pixelFormatGuid); bitmapFrameEncode.WriteSource(wicBitmap); bitmapFrameEncode.Commit(); encoder.Commit(); } } }
/// <summary> /// Copies to a stream using WIC. The format is converted if necessary. /// </summary> /// <param name="context"></param> /// <param name="texture"></param> /// <param name="outputFormat"></param> /// <param name="stream"></param> public void ToStream(SharpDX.Direct3D11.DeviceContext context, Texture2D texture, ImageFormat outputFormat, Stream stream) { if (wicFactory == null) { wicFactory = ToDispose(new SharpDX.WIC.ImagingFactory2()); } DataStream dataStream; var dataBox = context.MapSubresource( texture, 0, 0, MapMode.Read, SharpDX.Direct3D11.MapFlags.None, out dataStream); try { var dataRectangle = new DataRectangle { DataPointer = dataStream.DataPointer, Pitch = dataBox.RowPitch }; var format = PixelFormatFromFormat(texture.Description.Format); if (format == Guid.Empty) { return; } using (var bitmap = new SharpDX.WIC.Bitmap( wicFactory, texture.Description.Width, texture.Description.Height, format, dataRectangle)) { stream.Position = 0; SharpDX.WIC.BitmapEncoder bitmapEncoder = null; switch (outputFormat) { case ImageFormat.Bitmap: bitmapEncoder = new SharpDX.WIC.BmpBitmapEncoder(wicFactory, stream); break; case ImageFormat.Jpeg: bitmapEncoder = new SharpDX.WIC.JpegBitmapEncoder(wicFactory, stream); break; case ImageFormat.Png: bitmapEncoder = new SharpDX.WIC.PngBitmapEncoder(wicFactory, stream); break; default: return; } try { using (var bitmapFrameEncode = new SharpDX.WIC.BitmapFrameEncode(bitmapEncoder)) { bitmapFrameEncode.Initialize(); bitmapFrameEncode.SetSize(bitmap.Size.Width, bitmap.Size.Height); var pixelFormat = format; bitmapFrameEncode.SetPixelFormat(ref pixelFormat); if (pixelFormat != format) { // IWICFormatConverter var converter = new SharpDX.WIC.FormatConverter(wicFactory); if (converter.CanConvert(format, pixelFormat)) { converter.Initialize(bitmap, SharpDX.WIC.PixelFormat.Format24bppBGR, SharpDX.WIC.BitmapDitherType.None, null, 0, SharpDX.WIC.BitmapPaletteType.MedianCut); bitmapFrameEncode.SetPixelFormat(ref pixelFormat); bitmapFrameEncode.WriteSource(converter); } else { this.DebugMessage(string.Format("Unable to convert Direct3D texture format {0} to a suitable WIC format", texture.Description.Format.ToString())); return; } } else { bitmapFrameEncode.WriteSource(bitmap); } bitmapFrameEncode.Commit(); bitmapEncoder.Commit(); } } finally { bitmapEncoder.Dispose(); } } } finally { context.UnmapSubresource(texture, 0); } }
public static void SaveToTiff(SharpDX.WIC.ImagingFactory imagingFactory, UnmanagedImage image, string filename, Guid format, int bytesPerPixel) { var file = new System.IO.FileStream(filename, System.IO.FileMode.Create); var stream = new SharpDX.WIC.WICStream(imagingFactory, file); var encoder = new SharpDX.WIC.BitmapEncoder(imagingFactory, SharpDX.WIC.ContainerFormatGuids.Tiff); encoder.Initialize(stream); var bitmapFrameEncode = new SharpDX.WIC.BitmapFrameEncode(encoder); //bitmapFrameEncode.Options.TiffCompressionMethod = SharpDX.WIC.TiffCompressionOption.None; bitmapFrameEncode.Initialize(); bitmapFrameEncode.SetSize(image.Width, image.Height); bitmapFrameEncode.SetPixelFormat(ref format); bitmapFrameEncode.WritePixels(image.Height, image.DataIntPtr, image.Width * bytesPerPixel); bitmapFrameEncode.Commit(); encoder.Commit(); bitmapFrameEncode.Dispose(); encoder.Dispose(); stream.Dispose(); file.Close(); file.Dispose(); }
public static void SaveBitmap(DeviceManager dev, SharpDX.WIC.Bitmap bm, string filename) { System.Diagnostics.Debug.Assert(bm != null); Guid containerFormat = Guid.Empty; string lowerName = filename.ToLower(); if (lowerName.Contains(".png")) containerFormat = SharpDX.WIC.ContainerFormatGuids.Png; else if (lowerName.Contains(".bmp")) containerFormat = SharpDX.WIC.ContainerFormatGuids.Bmp; else if (lowerName.Contains(".jpg")) containerFormat = SharpDX.WIC.ContainerFormatGuids.Jpeg; else if (lowerName.Contains(".jpeg")) containerFormat = SharpDX.WIC.ContainerFormatGuids.Jpeg; else if (lowerName.Contains(".tif")) containerFormat = SharpDX.WIC.ContainerFormatGuids.Tiff; else if (lowerName.Contains(".gif")) containerFormat = SharpDX.WIC.ContainerFormatGuids.Gif; Guid format = bm.PixelFormat; using (var stream = System.IO.File.OpenWrite(filename)) { stream.Position = 0; using (SharpDX.WIC.BitmapEncoder enc = new SharpDX.WIC.BitmapEncoder(dev.WICFactory, containerFormat, stream)) using (SharpDX.WIC.BitmapFrameEncode bfe = new SharpDX.WIC.BitmapFrameEncode(enc)) { bfe.Initialize(); bfe.SetPixelFormat(ref format); bfe.SetSize(bm.Size.Width, bm.Size.Height); bfe.WriteSource(bm); bfe.Commit(); enc.Commit(); } } }