Como vamos fazer?
- Converter a imagem, ainda no servidor, em uma imagem de baixa resolução.
- Exibir essa imagem em baixa definição assim que a página for carregada.
- Fazer uma chamada Ajax para buscar a imagem em maior resolução.
- "Trocar" a imagem de baixa resolução, que está sendo exibida na tela, pela imagem de maior resolução.
Obter imagem em baixa resolução
private Image ObterImagemBaixaResolucao() { Image retorno = null; using (var image = ObterImagem()) { retorno = image.GetThumbnailImage((image.Width / 16), (image.Height / 16), () => false, IntPtr.Zero); } return retorno; }
Assim obtemos a imagem em menor resolução, nesse caso 16x menor.
GetThumbnailImage é o método responsável por nos dar uma imagem em resolução menor.
Logo após eu converto a imagem em base 64:
public static string ImageToBase64(this Image image,ImageFormat format) { using (MemoryStream ms = new MemoryStream()) { image.Save(ms, format); byte[] imageBytes = ms.ToArray(); return Convert.ToBase64String(imageBytes); } }
Quem tiver alguma dúvida sobre base 64 sugiro que dê uma lida aqui: http://inchoo.net/ecommerce/magento/what-is-base64-encoding-and-how-can-we-benefit-from-it/
E exibo na View:
<img id="imageCarregar" src="data:image/jpg;base64,@Model.ImagemBase64" />
Obter a imagem em resolução maior
Uma chamada Ajax busca a imagem em maior resolução:
function obterImagemAltaResolucao() { $.ajax({ type: "POST", url: "/Home/ObterImagemResolucaoNormal", success: function (base64Data) { $('#imageCarregar').attr('src', "data:image/jpg;base64," + base64Data); }, error: function (xhr) { alert("Occoreu um erro ao carregar a imagem. " + xhr.responseText); } }); }
Coloque a função JavaScript para executar assim que a página estiver carregada:
$(document).ready(function () { obterImagemAltaResolucao(); });
Essa função carrega a imagem assincronicamente a quando termina substitui a imagem de baixa definição pela imagem retornada.
Essa é o método no controller responsável por retornar a imagem:
[HttpPost] public string ObterImagemResolucaoNormal() { var imageBase64 = String.Empty; using (Image image = ObterImagem()) { using (Image newImage = new Bitmap(image)) { imageBase64 = newImage.ImageToBase64(ImageFormat.Jpeg); } } return imageBase64; }
O código pode ser baixado aqui: https://github.com/rafaelguinho/ProgressiveLoadImage
0 comentários:
Postar um comentário