Array
(
)

esize de image - escrevendo nela com DrawString (redimensionando imagem com qualidade e escrevendo nela)

Leonardo Dorathoto
   - 06 nov 2013

Boa tarde a todos,
Estou fazendo um upload e toda vez que fizer o upload eu vou redimensiona-la com qualidade e possívelmente ou não etiqueta-la (escrever no rodapé dela)
Cada item desse eu consegui fazer
classe resize
classe de etiquetar
porém quando eu ia etiquetar a imagem já feita resize ela dava o erro de GDI+ pois ela já existia. tinha que criar uma nova.
E como o sistema vai ser muito utilizado, milhares de fotos, não da para eu mover para um _temp_folder depois etiqueta-la e depois voltar a mover.
Então pensei em fazer na mesma função.
Mas não consegui.
public class Manipular_image
{
private string _path_temp;
private string _path_save;
private string _foto;
private string _linha;
private bool _etiquetar;
public string Path_Temp
{
get { return _path_temp; }
set { _path_temp = value; }
}
public string Path_Save
{
get { return _path_save; }
set { _path_save = value; }
}
public string NomeFoto
{
get { return _foto; }
set { _foto = value; }
}
public string Linha1
{
get { return _linha; }
set { _linha = value; }
}
public bool Etiquetar
{
get { return _etiquetar; }
set { _etiquetar = value; }
}

public void resize_Pro(int width)
{
string pathimg = _path_temp + _foto;
using (Image imageOriginal = Image.FromFile(pathimg)) //abre a imagem
{
int altura = (imageOriginal.Height * width) / imageOriginal.Width; // calcula largura em proporção
var thumbnailImg = new Bitmap(width, altura);
using (var thumbGraph = Graphics.FromImage(thumbnailImg))
{
if (_etiquetar == true)
{
// retangulo de fundo
Brush brush = new SolidBrush(Color.FromArgb(120, 255, 255, 255));
thumbGraph.FillRectangle(brush, 0, imageOriginal.Height - 20, imageOriginal.Width, 20);
// texto
brush = new SolidBrush(Color.White);
thumbGraph.DrawString(_linha, new Font("verdana", 12, FontStyle.Bold), brush, new Point(6, imageOriginal.Height - 19));
// sombra do texto
brush = new SolidBrush(Color.Black);
thumbGraph.DrawString(_linha, new Font("verdana", 12, FontStyle.Bold), brush, new Point(5, imageOriginal.Height - 20));
}
thumbGraph.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
thumbGraph.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
thumbGraph.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
var imageRectangle = new Rectangle(0, 0, width, altura);
thumbGraph.DrawImage(imageOriginal, imageRectangle);
}
thumbnailImg.Save(_path_save + _foto, System.Drawing.Imaging.ImageFormat.Jpeg); //salva sempre em .jpg
imageOriginal.Dispose();
}
}
Com a função acima esta redimensionando com qualidade mas não esta etiquetando.
a função que funciona para etiquetar é
public void Etiqueta(string Linha1)
{
string pathimg = _path_temp + _foto; // ela já utiliza a imagem tratada
using (Image image = Image.FromFile(pathimg))
{
using (Graphics graphics = Graphics.FromImage(image))
{
// retangulo de fundo
Brush brush = new SolidBrush(Color.FromArgb(120, 255, 255, 255));
graphics.FillRectangle(brush, 0, image.Height - 20, image.Width, 20);
// texto
brush = new SolidBrush(Color.White);
graphics.DrawString(Linha1, new Font("verdana", 12, FontStyle.Bold), brush, new Point(6, image.Height - 19));
// sombra do texto
brush = new SolidBrush(Color.Black);
graphics.DrawString(Linha1, new Font("verdana", 12, FontStyle.Bold), brush, new Point(5, image.Height - 20));
}
// salva nova imagem
image.Save(_path_save + "_etiquetada" + _foto); // aqui tem que ter um nome diferente senão da erro
}
}
porém só funciona se o resultado final for uma nova imagem! e não a foto já existente
estaria chamando assim:
Manipular_image img1 = new Manipular_image();
img1.Path_Temp = @"D:\mydocuments\C#\FileUpload\FileUpload\uploads\";
img1.Path_Save = @"D:\mydocuments\C#\FileUpload\FileUpload\foto\";
img1.Linha1 = "Frase";
img1.Etiquetar = true;
img1.NomeFoto = "original.jpg";
img1.resize_Pro(680);