Retorno Bitmap para dinamicamente Navegador
-
06-07-2019 - |
Pergunta
Estou cortar uma imagem, e deseja devolvê-lo usando um manipulador ashx. O código de culturas é a seguinte:
public static System.Drawing.Image Crop(string img, int width, int height, int x, int y)
{
try
{
System.Drawing.Image image = System.Drawing.Image.FromFile(img);
Bitmap bmp = new Bitmap(width, height, PixelFormat.Format24bppRgb);
bmp.SetResolution(image.HorizontalResolution, image.VerticalResolution);
Graphics gfx = Graphics.FromImage(bmp);
gfx.SmoothingMode = SmoothingMode.AntiAlias;
gfx.InterpolationMode = InterpolationMode.HighQualityBicubic;
gfx.PixelOffsetMode = PixelOffsetMode.HighQuality;
gfx.DrawImage(image, new Rectangle(0, 0, width, height), x, y, width, height, GraphicsUnit.Pixel);
// Dispose to free up resources
image.Dispose();
bmp.Dispose();
gfx.Dispose();
return bmp;
}
catch (Exception ex)
{
return null;
}
}
O bitmap está sendo devolvido, e agora precisa enviar de volta para o navegador através da corrente contexto, como eu não quero um arquivo físico criado.
Solução
Você realmente só precisa enviá-lo sobre a resposta com um tipo MIME apropriado:
using System.Drawing;
using System.Drawing.Imaging;
public class MyHandler : IHttpHandler {
public void ProcessRequest(HttpContext context) {
Image img = Crop(...); // this is your crop function
// set MIME type
context.Response.ContentType = "image/jpeg";
// write to response stream
img.Save(context.Response.OutputStream, ImageFormat.Jpeg);
}
}
Você pode alterar o formato para uma série de coisas diferentes; basta verificar a enumeração.
Outras dicas
Escreva o bitmap em seu fluxo de resposta (e definir o tipo de mime correto)
Pode ser uma ideia para convertê-lo para png / jpg para reduzi-la de sice demasiado
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow