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