Ejemplo n.º 1
0
            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));
            }
Ejemplo n.º 2
0
        //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);
                    }
                }
            }
        }
Ejemplo n.º 3
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();
        }
Ejemplo n.º 4
0
        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();
                    }
            }
        }
Ejemplo n.º 5
0
        public override void Save(Stream stream)
        {
            using (var encoder = new PngBitmapEncoder(WicImagingFactory, stream))
                using (var frameEncode = new SharpDX.WIC.BitmapFrameEncode(encoder))
                    using (var imageEncoder = new SharpDX.WIC.ImageEncoder((ImagingFactory2)WicImagingFactory, null))
                    {
                        var parameters = new ImageParameters(
                            new PixelFormat(SharpDX.DXGI.Format.R8G8B8A8_UNorm, AlphaMode.Premultiplied),
                            _direct2D.DotsPerInch.Width,
                            _direct2D.DotsPerInch.Height,
                            0, 0, PixelWidth, PixelHeight);

                        imageEncoder.WriteFrame(_direct2D, frameEncode, parameters);
                        frameEncode.Commit();
                        encoder.Commit();
                    }
        }
Ejemplo n.º 6
0
 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();
             }
         }
 }
Ejemplo n.º 7
0
        /// <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();
                }
            }
        }