Cargar Imagenes Thumnbail
El otro día haciendo una pequeña aplicación para ver la lista de fotos que tengo de mi hijo que os podéis imaginar que son miles en los casi tres años que tiene, vi que al cargarlos en un ListView me tardaba bastante, también lo achaque a que algunas fotos (la mayoría) son de mas de 5 MB.
Hacia una carga del las fotos de mi disco duro
var fotos = from d in new DirectoryInfo(@"d:\fotos").GetDirectories()
from f in d.GetFiles()
where f.Extension.Contains("JPG")
orderby d.Name
select new { ImagePath = f.FullName, dirName = d.Name };
DataContext = fotos;
Yo utilizaba una ListView de este tipo
<ListView ItemsSource="{Binding}">
<ListView.ItemTemplate>
<DataTemplate>
<Image Source="{Binding Path=ImagePath, Converter={StaticResource ImageConverter}}" />
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
Con el típico Converter de imágenes que ya hemos explicado
public sealed class ImageConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
try
{
return new BitmapImage(new Uri((string)value));
}
catch
{
return new BitmapImage();
}
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
La verdad es que tardaba bastante y además quería que se visualizase en formato thumbail, me puse a buscar si habría alguna manera mas rápida de hacerlo y si hay, nos tenemos que basar en la clase BitmapImage. Esta clase tiene la propiedad DecodePixelWidth que obtiene o establece el ancho, en píxeles, en el que se decodifica la imagen, en este caso pasamos las imagenes a100 poxels que para un thumbail es mas que suficiente.
De manera que le Converter pasaba a
public sealed class ImageConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
BitmapImage bi = new BitmapImage();
bi.BeginInit();
bi.DecodePixelWidth = 100;
bi.CacheOption = BitmapCacheOption.OnLoad;
bi.UriSource = new Uri(value.ToString());
bi.EndInit();
return bi;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
La carga era mucho mas rápida y eficiente, además de mostrar en el tamaño adecuado. Así que ya sabéis si queréis mostrar thumbails de imágenes utilizar esta propiedad.
Pero para poner una pega ese listbox me muestra por defecto una lista hacia abajo, si quisiera cambiar la propiedad ItemsPanelTemplate para poner un WrapPanel y me las muestre en horizontal que creéis que pasara? Probarlo os llevareis una sorpres(para probarlo utilizar mas de 1000 archivos una carga masiva) En el siguiente post lo contare