示例#1
0
        /// <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));
            }

            ThrowIfDirectoryDoesntExist(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);
                }
            }
        }
示例#2
0
        /// <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);
                }
            }
        }
示例#3
0
        public void Save(Stream stream, ImageFormat format)
        {
            ImageCodecInfo?encoder = FindEncoderForFormat(format);

            if (encoder == null)
            {
                throw new ArgumentException(SR.Format(SR.NoCodecAvailableForFormat, format.Guid));
            }

            Save(stream, encoder, null);
        }
示例#4
0
        public static void CreateSmallCopy(FileInfo sourceImageFile, FileInfo targetImageFile)
        {
            using (Image sourceImage = Image.FromFile(sourceImageFile.FullName))
            {
                // Determine how to resize -- we want the longest side to be IMAGE_SIZE
                Single scaleFactor = 1;
                if (sourceImage.Width >= sourceImage.Height)
                {
                    // Landscape
                    if (sourceImage.Width > IMAGE_SIZE)
                    {
                        // E.g., if longer edge is 2048, the scaleFactor is 0.5
                        scaleFactor = IMAGE_SIZE / ( Single )sourceImage.Width;
                    }
                }
                else
                {
                    // Portrait
                    if (sourceImage.Height > IMAGE_SIZE)
                    {
                        scaleFactor = IMAGE_SIZE / ( Single )sourceImage.Height;
                    }
                }

                Int32 newWidth  = ( Int32 )(sourceImage.Width * scaleFactor + 1);
                Int32 newHeight = ( Int32 )(sourceImage.Height * scaleFactor + 1);

                // Create an Encoder object based on the GUID
                // for the Quality parameter category.
                // https://docs.microsoft.com/en-us/dotnet/framework/winforms/advanced/how-to-set-jpeg-compression-level?redirectedfrom=MSDN

                ImageCodecInfo?   jgpEncoder          = GetEncoder(ImageFormat.Jpeg);
                Encoder           myEncoder           = Encoder.Quality;
                EncoderParameters myEncoderParameters = new EncoderParameters(1);
                EncoderParameter  myEncoderParameter  = new EncoderParameter(myEncoder, QUALITY);
                myEncoderParameters.Param[0] = myEncoderParameter;

                using (Bitmap bitmap = new Bitmap(newWidth, newHeight))
                    using (var graphics = Graphics.FromImage(bitmap))
                    {
                        graphics.SmoothingMode      = SmoothingMode.AntiAlias;
                        graphics.InterpolationMode  = InterpolationMode.HighQualityBicubic;
                        graphics.PixelOffsetMode    = PixelOffsetMode.HighQuality;
                        graphics.CompositingQuality = CompositingQuality.HighQuality;

                        graphics.DrawImage(sourceImage, new Rectangle(0, 0, newWidth, newHeight));
                        bitmap.Save(targetImageFile.FullName, jgpEncoder, myEncoderParameters);
                    }

                File.SetLastWriteTime(targetImageFile.FullName, sourceImageFile.LastWriteTime);
            }
        }
示例#5
0
        public void Save(string filename, ImageFormat format)
        {
            ImageCodecInfo?encoder = FindEncoderForFormat(format);

            if (encoder == null)
            {
                // second chance
                encoder = FindEncoderForFormat(RawFormat);
                if (encoder == null)
                {
                    string msg = string.Format("No codec available for saving format '{0}'.", format.Guid);
                    throw new ArgumentException(msg, nameof(format));
                }
            }
            Save(filename, encoder, null);
        }
示例#6
0
        /// <summary>
        /// Saves this <see cref='Image'/> to the specified file in the specified format.
        /// </summary>
        public void Save(string filename, ImageFormat format)
        {
            if (format == null)
            {
                throw new ArgumentNullException(nameof(format));
            }

            ImageCodecInfo?codec = format.FindEncoder();

            if (codec == null)
            {
                codec = ImageFormat.Png.FindEncoder() !;
            }

            Save(filename, codec, null);
        }
示例#7
0
        private static ImageCodecInfo?GetEncoder(ImageFormat format)
        {
            ImageCodecInfo?ret = null;

            ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders();

            foreach (ImageCodecInfo codec in codecs)
            {
                if (codec.FormatID == format.Guid)
                {
                    ret = codec;
                }
            }

            return(ret);
        }
示例#8
0
        internal ImageCodecInfo?FindEncoderForFormat(ImageFormat format)
        {
            ImageCodecInfo[] encoders = ImageCodecInfo.GetImageEncoders();
            ImageCodecInfo?  encoder  = null;

            if (format.Guid.Equals(ImageFormat.MemoryBmp.Guid))
            {
                format = ImageFormat.Png;
            }

            /* Look for the right encoder for our format*/
            for (int i = 0; i < encoders.Length; i++)
            {
                if (encoders[i].FormatID.Equals(format.Guid))
                {
                    encoder = encoders[i];
                    break;
                }
            }

            return(encoder);
        }
示例#9
0
        public static bool ConvertPdfToTiff(string sourceFile, string outputFile, float dpi, RenderType type, bool rotateLandscapePages, bool shrinkToLetter, int maxSizeInPdfPixels, string pdfPassword)
        {
            bool output = false;

            if (string.IsNullOrEmpty(sourceFile) || string.IsNullOrEmpty(outputFile))
            {
                throw new ArgumentNullException();
            }

            using (MuPDF pdfDoc = new MuPDF(sourceFile, pdfPassword))
            {
                using (FileStream outputStream = new FileStream(outputFile, FileMode.Create, FileAccess.ReadWrite, FileShare.None))
                {
                    ImageCodecInfo?info = null;
                    foreach (ImageCodecInfo ice in ImageCodecInfo.GetImageEncoders())
                    {
                        if (ice.MimeType == "image/tiff")
                        {
                            info = ice;
                        }
                    }

                    Bitmap saveTif = null;
                    pdfDoc.AntiAlias = false;
                    for (int i = 1; i <= pdfDoc.PageCount; i++)
                    {
                        pdfDoc.Page = i;

                        Bitmap FirstImage = pdfDoc.GetBitmap(0, 0, dpi, dpi, 0, type, rotateLandscapePages, shrinkToLetter, maxSizeInPdfPixels);
                        if (FirstImage == null)
                        {
                            throw new Exception("Unable to convert pdf to tiff!");
                        }

                        using (EncoderParameters ep = new EncoderParameters(2))
                        {
                            ep.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.SaveFlag, (long)EncoderValue.MultiFrame);
                            ep.Param[1] = new EncoderParameter(System.Drawing.Imaging.Encoder.Compression, (long)EncoderValue.CompressionLZW);
                            if (type == RenderType.Monochrome)
                            {
                                ep.Param[1] = new EncoderParameter(System.Drawing.Imaging.Encoder.Compression, (long)EncoderValue.CompressionCCITT4);
                            }

                            if (i == 1)
                            {
                                saveTif = FirstImage;
                                saveTif.Save(outputStream, info, ep);
                            }
                            else
                            {
                                ep.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.SaveFlag, (long)EncoderValue.FrameDimensionPage);
                                saveTif.SaveAdd(FirstImage, ep);
                                FirstImage.Dispose();
                            }
                            if (i == pdfDoc.PageCount)
                            {
                                ep.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.SaveFlag, (long)EncoderValue.Flush);
                                saveTif.SaveAdd(ep);
                                saveTif.Dispose();
                            }
                        }
                    }
                }
                if (File.Exists(outputFile))
                {
                    output = true;
                }
            }
            return(output);
        }