Hace mucho tiempo que no participo en el foro, he estado desarrollando
mucho.
Tengo una aplicación que utiliza un listview para mostrar miniaturas
de imágenes, todo está bien, pero... las imágenes se distorcionan ya
que el ImageList asociado al Listview utiliza un sólo tamaño de imagen
mediante la propiedad ImageSize que se asigna el mismo tamaño para
todas las imñagenes del ImageList.
Quisiera si alguien sabe cómo hacer para mantener el aspecto de la
imagen como cuando en el explorador de windows se selecciona ver
vistas en miniatura; se muestra un recuadro de igual tamaño para todas
las imágenes y dentro del cuadro se ve la imagen en miniatura con su
aspecto real.
Gracias
Federico Luna.
>>> utiliza un listview para mostrar miniaturas
> de imágenes, todo está bien, pero... las imágenes se distorcionan ya
> que el ImageList asociado al Listview utiliza un sólo tamaño de imagen
> mediante la propiedad ImageSize que se asigna el mismo tamaño para
> todas las imñagenes del ImageList. <<<
aunque quizas ya lo hayas resuelto, o hallas desistido, te comento una
posibilidad que se me ha ocurrido
de todas formas seguro que hay algo mas 'propio' y/o sencillo, pero
parece funcionar bien, aunque quizas algo lento si las imagenes son
muy grandes y muchas. Pej, con 320 imagenes (aprox) de considerable
tamaño, y mostrandolas con un tamaño de 125 en su lado mas grande, a
mi me ha tardado (con mi tartana) un minuto y medio, aprox. Pero con
pocas tarda bastante poco
bueno te pongo los codigos, y si quieres ver alguna explicacion
adicional echale un ojo a este hilo =>
bueno, esta seria una funcion que devuelve una imagen cuadrada con la
foto original en su interior con las proporciones reales y con el
resto en blanco
Public Function CuadreImagen(ByVal RutaImagen As String) As Image
On Error Resume Next
Dim im As Bitmap = New Bitmap(RutaImagen)
If Err.Number <> 0 Then Return Nothing
On Error GoTo 0
Dim imagen As New Bitmap(im)
im.Dispose()
Dim lado, iX, iY As Integer
With imagen
lado = IIf(.Width > .Height, .Width, .Height)
iX = (lado - .Width) / 2
iY = (lado - .Height) / 2
End With
Dim imgLienzo As New Bitmap(lado, lado)
Dim marco As Graphics = Graphics.FromImage(imgLienzo)
marco.Clear(Color.White)
marco.DrawImage(imagen, iX, iY)
marco.Dispose() : marco = Nothing
imagen.Dispose() : imagen = Nothing
Return imgLienzo
End Function
y este el ej. con que lo he ido probando
para este ej. cargo previamente un combobox (cmbImagenes) con las el
nombre de archivo (foto1.jpg, fotoX.jpg) de todas las imagenes de un
directorio y el Tag de dicho combo con la ruta a dicho directorio.
despues desde un boton carga el ImageList1 y el ListView1
Private Sub btCargarLV_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btCargarLV.Click
With cmbImagenes
If .Items.Count > 0 Then
ImageList1.ImageSize = New Size(125, 125)
ListView1.LargeImageList = ImageList1
ListView1.View = View.LargeIcon
ListView1.BeginUpdate()
Dim n As Integer
For n = 0 To .Items.Count - 1
ImageList1.Images.Add(.Items(n), _
CuadreImagen(.Tag & "\" & .Items(n)))
ListView1.Items.Add(.Items(n), .Items(n))
' si son muchas imagenes quizas no venga mal
'My.Application.DoEvents()
Next
ListView1.EndUpdate()
End If
End With
End Sub
es solo para pruebas y no tiene manejo de errores
espero te ayude
Un saludo
Ivan
PD: seguro que el tiempo se puede optimizar (y el resto tambien, je,
je, ..) y si alguien ve cualquier cosa, bienvenido sea
Muchas gracias y en efecto, ya lo había conseguido de forma similar a
la que propones, de todas maneras voy a probar tu código.
Federico