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)); }
/// <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(); } } }
/// <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(); } } }