Exemple #1
0
        private ResizeScale ResetScale(ResizeScale scale, int widthImgOriginal, int heightImgOriginal)
        {
            //' create New image and bitmap objects. Load the image file and put into a resized bitmap.
            bool retrato = widthImgOriginal <= heightImgOriginal;

            if (scale.Width < 1)
            {
                scale.Width = widthImgOriginal;
            }
            if (scale.Height < 1)
            {
                scale.Height = heightImgOriginal;
            }

            //Redimensiona o tamanho da imagem
            float width  = scale.Width;
            float height = scale.Height;

            // Se é pra manter a orientação então inverte se estiver diferente da imagem original
            if (scale.PreserveOrientation && (width <= height && !retrato))
            {
                width  = scale.Height;
                height = scale.Width;
            }

            if (scale.IsPercentage)
            {
                width  = widthImgOriginal * (width / 100);
                height = heightImgOriginal * (height / 100);
            }
            else
            {
                // Se deve manter proporção para evitar distorção na imagem
                if (scale.PreserveAspectRatio)
                {
                    float percetual;

                    if (width > 0)
                    {
                        if (width == widthImgOriginal)
                        {
                            height = heightImgOriginal; //mantem original
                        }
                        else
                        {
                            percetual = (float)width / widthImgOriginal;
                            height    = (heightImgOriginal * percetual);
                        }
                    }
                    else if (height > 0)
                    {
                        if (height == heightImgOriginal)
                        {
                            width = widthImgOriginal; //mantem original
                        }
                        else
                        {
                            percetual = (float)height / heightImgOriginal;
                            width     = (widthImgOriginal * percetual);
                        }
                    }
                }
            }

            if (width == 0 || height == 0)
            {
                width  = widthImgOriginal;
                height = heightImgOriginal;
            }

            scale.Width  = width;
            scale.Height = height;
            return(scale);
        }
Exemple #2
0
        public string Save(string inputFile, ResizeScale scale, string outputFile = null, string pathBackup = null)
        {
            if (string.IsNullOrEmpty(outputFile))
            {
                outputFile = inputFile;
            }

            string inPath  = Path.GetDirectoryName(inputFile);
            string outPath = Path.GetDirectoryName(outputFile);
            string outFile = Path.GetFileName(outputFile);

            if (string.IsNullOrEmpty(outFile))
            {
                outFile = Path.GetFileName(inputFile);
            }

            outputFile = Path.Combine(outPath, outFile);

            #region "SE SOLICITADO, SALVA BACKUP ANTES DE ALTERAR."

            if (!string.IsNullOrEmpty(pathBackup))
            {
                pathBackup = Path.GetDirectoryName(pathBackup); // normaliza o valor

                if (inPath != pathBackup)
                {
                    if (outputFile == Path.Combine(pathBackup, Path.GetFileName(inputFile)))
                    {
                        throw new ArgumentException("Local de Backup não pode ser o mesmo do local de destino");
                    }

                    this.SaveBackup(inputFile, pathBackup);
                }
            }

            #endregion

            #region "CRIA IMAGEM COM NOVAS DIMENSOES"

            // cria o diretorio de output se necessario
            if (!Directory.Exists(outPath))
            {
                Directory.CreateDirectory(outPath);
            }

            //outPath = $@"{outPath}\{Path.GetFileName(inputFile)}";

            Bitmap         imgOutput;
            ImageCodecInfo imgCodec;

            using (var img = Image.FromFile(inputFile))
            {
                imgCodec  = GetEncoderInfo(img.RawFormat);
                scale     = ResetScale(scale, img.Width, img.Height);
                imgOutput = new Bitmap(img, (int)scale.Width, (int)scale.Height);
            }

            // Para evitar o erro de GDI+ quando o caminho é muito longo
            using (MemoryStream ms = new MemoryStream())
            {
                imgOutput.Save(ms, imgCodec, null);
                imgOutput.Dispose();

                // Se arquivo estiver bloqueado cria um nome aleatorio
                //if (!Utils.DeleteFile(outputFile))
                //{
                //    outputFile = $@"{Path.GetFileNameWithoutExtension(outputFile)}_{Guid.NewGuid().ToString().Substring(0, 8)}{Path.GetExtension(outputFile)}";
                //    outputFile = Path.Combine(outPath, outputFile);
                //}

                File.WriteAllBytes(outputFile, ms.ToArray());
            }

            #endregion

            #region "GUARDA LISTA DOS ARQUIVOS PROCESSADOS"

            if (!this.Output.ContainsKey(inPath))
            {
                this.Output.Add(inPath, new Dictionary <string, List <string> >());
            }

            if (!this.Output[inPath].ContainsKey(outPath))
            {
                this.Output[inPath].Add(outPath, new List <string>());
            }

            this.Output[inPath][outPath].Add(outputFile);

            this.Outputs.Add(outputFile);

            #endregion

            return(outputFile);
        }