public void Save(string filename, ImageCodecInfo encoder, EncoderParameters encoderParams) { if (filename == null) { throw new ArgumentNullException("filename"); } if (encoder == null) { throw new ArgumentNullException("encoder"); } IntPtr encoderParamsMemory = IntPtr.Zero; if (encoderParams != null) { _rawData = null; encoderParamsMemory = encoderParams.ConvertToMemory(); } int status = SafeNativeMethods.Gdip.Ok; try { Guid g = encoder.Clsid; bool saved = false; if (_rawData != null) { ImageCodecInfo rawEncoder = RawFormat.FindEncoder(); if (rawEncoder != null && rawEncoder.Clsid == g) { using (FileStream fs = File.OpenWrite(filename)) { fs.Write(_rawData, 0, _rawData.Length); saved = true; } } } if (!saved) { status = SafeNativeMethods.Gdip.GdipSaveImageToFile(new HandleRef(this, nativeImage), filename, ref g, new HandleRef(encoderParams, encoderParamsMemory)); } } finally { if (encoderParamsMemory != IntPtr.Zero) { Marshal.FreeHGlobal(encoderParamsMemory); } } if (status != SafeNativeMethods.Gdip.Ok) { throw SafeNativeMethods.Gdip.StatusException(status); } }
/// <summary> /// Saves this <see cref='Image'/> to the specified file in the specified format and with the specified encoder parameters. /// </summary> public void Save(string filename, ImageCodecInfo encoder, EncoderParameters encoderParams) { if (filename == null) { throw new ArgumentNullException(nameof(filename)); } if (encoder == null) { throw new ArgumentNullException(nameof(encoder)); } if (!Directory.Exists(Path.GetDirectoryName(filename))) { throw new DirectoryNotFoundException(SR.Format(SR.IO_PathNotFound_Path, filename)); } IntPtr encoderParamsMemory = IntPtr.Zero; if (encoderParams != null) { _rawData = null; encoderParamsMemory = encoderParams.ConvertToMemory(); } try { Guid g = encoder.Clsid; bool saved = false; if (_rawData != null) { ImageCodecInfo rawEncoder = RawFormat.FindEncoder(); if (rawEncoder != null && rawEncoder.Clsid == g) { using (FileStream fs = File.OpenWrite(filename)) { fs.Write(_rawData, 0, _rawData.Length); saved = true; } } } if (!saved) { Gdip.CheckStatus(Gdip.GdipSaveImageToFile( new HandleRef(this, nativeImage), filename, ref g, new HandleRef(encoderParams, encoderParamsMemory))); } } finally { if (encoderParamsMemory != IntPtr.Zero) { Marshal.FreeHGlobal(encoderParamsMemory); } } }
/// <summary> /// Saves this <see cref='Image'/> to the specified stream in the specified format. /// </summary> public void Save(Stream stream, ImageCodecInfo encoder, EncoderParameters?encoderParams) { if (stream == null) { throw new ArgumentNullException(nameof(stream)); } if (encoder == null) { throw new ArgumentNullException(nameof(encoder)); } IntPtr encoderParamsMemory = IntPtr.Zero; if (encoderParams != null) { _rawData = null; encoderParamsMemory = encoderParams.ConvertToMemory(); } try { Guid g = encoder.Clsid; bool saved = false; if (_rawData != null) { ImageCodecInfo?rawEncoder = RawFormat.FindEncoder(); if (rawEncoder != null && rawEncoder.Clsid == g) { stream.Write(_rawData, 0, _rawData.Length); saved = true; } } if (!saved) { using DrawingCom.IStreamWrapper streamWrapper = DrawingCom.GetComWrapper(new GPStream(stream, makeSeekable: false)); unsafe { Gdip.CheckStatus(Gdip.GdipSaveImageToStream( new HandleRef(this, nativeImage), streamWrapper.Ptr, &g, new HandleRef(encoderParams, encoderParamsMemory))); } } } finally { if (encoderParamsMemory != IntPtr.Zero) { Marshal.FreeHGlobal(encoderParamsMemory); } } }
/// <include file='doc\Image.uex' path='docs/doc[@for="Image.Save4"]/*' /> /// <devdoc> /// <para> /// Saves this <see cref='System.Drawing.Image'/> to the specified stream in the specified /// format. /// </para> /// </devdoc> public void Save(Stream stream, ImageCodecInfo encoder, EncoderParameters encoderParams) { if (stream == null) { throw new ArgumentNullException("stream"); } if (encoder == null) { throw new ArgumentNullException("encoder"); } IntPtr encoderParamsMemory = IntPtr.Zero; if (encoderParams != null) { rawData = null; encoderParamsMemory = encoderParams.ConvertToMemory(); } int status = SafeNativeMethods.Ok; try { Guid g = encoder.Clsid; bool saved = false; if (rawData != null) { ImageCodecInfo rawEncoder = RawFormat.FindEncoder(); if (rawEncoder.Clsid == g) { stream.Write(rawData, 0, rawData.Length); saved = true; } } if (!saved) { status = SafeNativeMethods.GdipSaveImageToStream(new HandleRef(this, nativeImage), new UnsafeNativeMethods.ComStreamFromDataStream(stream), ref g, new HandleRef(encoderParams, encoderParamsMemory)); } } finally { if (encoderParamsMemory != IntPtr.Zero) { Marshal.FreeHGlobal(encoderParamsMemory); } } if (status != SafeNativeMethods.Ok) { throw SafeNativeMethods.StatusException(status); } }