No projeto que estou trabalhando precisamos implementar uma forma de o usuário poder enviar imagens ao servidor, mas que essa imagem tivesse um tamanho máximo fixo, para resolver esse problema resolvi criar um Helper.
/// <summary>
/// Classe especializada em tratamento de imagens
/// </summary>
public class HelperImage
{
/// <summary>
/// Gera uma imagem em miniatura
/// </summary>
/// <param name="stream">Visão genérica da sequência de bytes</param>
/// <param name="sizeInPercentage">Tamanho da imagem para ser redimencionada em %</param>
/// <returns>Miniatura da imagem</returns>
public Image GetThumbnail(Stream stream, int sizeInPercentage)
{// Utiliza o visão genérica da visão de bytes para carregar a imagem, após utilizar libera a utilização da memória
using (stream)
{// Carrega a imagem através do stream
using (Image image = Image.FromStream(stream))
{// Calcula o tamanho da altura e largura com base na porcentagem
int newWidth = (image.Width * sizeInPercentage) / 100;
int newHeight = (image.Height * sizeInPercentage) / 100;
// Gera a miniatura da imagem
return image.GetThumbnailImage(newWidth, newHeight, null, System.IntPtr.Zero);
}
}
}
/// <summary>
/// Gera uma imagem em miniatura
/// </summary>
/// <param name="file">Caminho para a imagem</param>
/// <param name="sizeInPercentage">Tamanho da imagem para ser redimencionada em %</param>
/// <returns>Miniatura da imagem</returns>
public Image GetThumbnail(string file, int sizeInPercentage)
{// Carrega a imagem informada pelo usuário
return this.GetThumbnail(File.OpenRead(file), sizeInPercentage);
}
/// <summary>
/// Gera a miniatura da imagem
/// </summary>
/// <param name="stream">Visão genérica da sequência de bytes</param>
/// <param name="newWidth">Nova largura para a imagem definida em pixel</param>
/// <param name="newHeight">Nova altura para a imagem definida em pixel</param>
/// <returns>Miniatura da imagem</returns>
public Image GetThumbnail(Stream stream, int newWidth, int newHeight)
{// Utiliza o visão genérica da visão de bytes para carregar a imagem, após utilizar libera a utilização da memória
using (stream)
{// Carrega a imagem através do stream
using (Image image = Image.FromStream(stream))
{// Gera a miniatura da imagem
return image.GetThumbnailImage(newWidth, newHeight, null, System.IntPtr.Zero);
}
}
}
/// <summary>
/// Gera a miniatura da imagem
/// </summary>
/// <param name="file">Caminho para a imagem</param>
/// <param name="newWidth">Nova largura para a imagem definida em pixel</param>
/// <param name="newHeight">Nova altura para a imagem definida em pixel</param>
/// <returns>Miniatura da imagem</returns>
public Image GetThumbnail(string file, int newWidth, int newHeight)
{// Carrega a imagem informada pelo usuário
return this.GetThumbnail(File.OpenRead(file), newWidth, newHeight);
}
/// <summary>
/// Salva a imagem
/// </summary>
/// <param name="image">Imagem a ser salva</param>
/// <param name="folderFile">Nome da imagem original para gerar a miniatura</param>
public void Save(Image image, string folderFile)
{// Verifica as informações do arquivo
FileInfo fileInfo = new FileInfo(folderFile);
FileSystemInfo fileSystemInfo = (FileSystemInfo)fileInfo;
//Pega o nome do arquivo sem a extensão
string fileName = fileInfo.Name.Replace(fileSystemInfo.Extension, "");
string caminhoCompleto = string.Format(@"{0}\{1}-mini{2}", fileInfo.Directory, fileName, fileSystemInfo.Extension);
image.Save(caminhoCompleto);
}
/// <summary>
/// Retorna o tamanho proporcional da nova altura com base na nova largura
/// </summary>
/// <param name="originalWidth">Largura original da imagem</param>
/// <param name="originalHeight">Altura original da imagem</param>
/// <param name="newWidth">Largura que ficará a imagem</param>
/// <returns>Altura proporcional à largura</returns>
public int GetHeightFromWidth(int originalWidth, int originalHeight, int newWidth)
{
return (newWidth * originalWidth) / originalHeight;
}
/// <summary>
/// Retorna o tamanho proporcional da nova largura com base na nova altura
/// </summary>
/// <param name="originalWidth">Largura original da imagem</param>
/// <param name="originalHeight">Altura original da imagem</param>
/// <param name="newHeight">Altura que ficará a imagem</param>
/// <returns>Largura proporcional à altura</returns>
public int GetWidthFromHeight(int originalWidth, int originalHeight, int newHeight)
{
return (newHeight * originalWidth) / originalHeight;
}
}
Deixe um comentário