Visual Basic Foro

Programación => Visual Basic 6 => Mensaje iniciado por: YAcosta en Noviembre 03, 2014, 09:22:49 pm

Título: ucImage: Detectar tamaño
Publicado por: YAcosta en Noviembre 03, 2014, 09:22:49 pm
Se me ha presentado esta inquietud.

Por ejemplo tengo dos imagenes que pesan casi lo mismo, pero una es vertical y la otra horizontal. El problema que tengo es  que el control ucImage lo tengo con scalemode en 1 (stretch) y esto lo tengo asi para que la foto no rebase del espacio que le designe. El problema es que si "la foto" es larga la imagen se achata quedando antiestetico y lo mismo a la inversa.

¿Como podría resolverlo para que quede de forma estética? Se me ocurre que quizá deba capturar el tamaño de la imagen (ancho y alto) y según eso modificar el width y el heigt del ucImage ¿asi seria? o hay una otra forma mejor? de momento el ucImage lo tengo como un cuadrado porque el +/-80% de las imagenes queda bien pero el restante no y esto se traduce en unas 200 fotos "feas".

Agradezco cualquier comentario

Saludos
Título: Re:ucImage: Detectar tamaño
Publicado por: coco en Noviembre 03, 2014, 11:07:41 pm
No entendi el problema. Tenes 2 imagenes que aparentemente una es mas "ancha" que "alta" (horizontal) y otra que es mas "alta" que "ancha" (vertical)?

Si tenes una imagen y queres que entre en un espacio menor, tenes 2 opciones.
* La primera es resizearlo para que el "mayor" tamaño se reduzca para que entre en tu lugar (obviamente que se reduce en alto y ancho de misma forma).
* La segunda es detectar el "menor" tamaño, y escalar la imagen para que ese tamaño coincida con tu lugar. Obviamente que va a "sobrar" partes de la imagen, y vas a tener que recortarla.
Título: Re:ucImage: Detectar tamaño
Publicado por: AxioUK en Noviembre 03, 2014, 11:27:15 pm
Master Yacosta:
  Yo no utilizo el ucImage, pero utilizo esta rutina para centrar la imagen a escala en una PictureBox de tamaño fijo, quizas con algunos retoques le pueda servir...

Código: (VB) [Seleccionar]
Option Explicit

Private Pic As IPictureDisp

'Subrutina que dibuja el gráfico en el control Picture en forma centrada y a escala
 '*******************************************************
Sub DrawPic(Objeto As Object, Path_Imagen As String)
On Error GoTo ErrSub
   Dim Pos_x As Single
   Dim Pos_y As Single
   Dim Ancho_IMG As Single
   Dim Alto_IMG As Single
   Dim Ancho_Obj As Single
   Dim Alto_Obj As Single
   Dim Old_Scale As Single

Set Pic = LoadPicture(Path_Imagen)

With Objeto
    .AutoRedraw = True
    .Cls
    Old_Scale = .ScaleMode
    .ScaleMode = vbPixels
    Ancho_IMG = .ScaleX(Pic.Width, vbHimetric, vbPixels)
    Alto_IMG = .ScaleY(Pic.Height, vbHimetric, vbPixels)
    Ancho_Obj = .ScaleWidth
    Alto_Obj = .ScaleHeight
   
    If Ancho_IMG > Ancho_Obj Then
        Alto_IMG = Alto_IMG * Ancho_Obj / Ancho_IMG
        Ancho_IMG = Ancho_Obj
    End If
    If Alto_IMG > Alto_Obj Then
        Ancho_IMG = Ancho_IMG * Alto_Obj / Alto_IMG
        Alto_IMG = Alto_Obj
    End If
    Pos_x = (Ancho_Obj - Ancho_IMG) / 2
    Pos_y = (Alto_Obj - Alto_IMG) / 2
End With
   
   Objeto.PaintPicture Pic, Pos_x, Pos_y, Ancho_IMG, Alto_IMG
   Objeto.ScaleMode = Old_Scale
   Exit Sub
   
'Error
ErrSub:
    If Err.Number = 76 Then
       Objeto.Cls
       Exit Sub
    Else
       MsgBox Err.Description, vbCritical
    End If
End Sub

Espero le sirva...

Saludos Cordiales
Título: Re:ucImage: Detectar tamaño
Publicado por: YAcosta en Noviembre 04, 2014, 12:00:32 am
Gracias amigo, lo voy a checar a ver que me resulta.

Saludos
Título: Re:ucImage: Detectar tamaño
Publicado por: gasafonso en Noviembre 04, 2014, 08:49:27 am
Master Yacosta:
  Yo no utilizo el ucImage, pero utilizo esta rutina para centrar la imagen a escala en una PictureBox de tamaño fijo, quizas con algunos retoques le pueda servir...

Código: (VB) [Seleccionar]
Option Explicit

Private Pic As IPictureDisp

'Subrutina que dibuja el gráfico en el control Picture en forma centrada y a escala
 '*******************************************************
Sub DrawPic(Objeto As Object, Path_Imagen As String)
On Error GoTo ErrSub
   Dim Pos_x As Single
   Dim Pos_y As Single
   Dim Ancho_IMG As Single
   Dim Alto_IMG As Single
   Dim Ancho_Obj As Single
   Dim Alto_Obj As Single
   Dim Old_Scale As Single

Set Pic = LoadPicture(Path_Imagen)

With Objeto
    .AutoRedraw = True
    .Cls
    Old_Scale = .ScaleMode
    .ScaleMode = vbPixels
    Ancho_IMG = .ScaleX(Pic.Width, vbHimetric, vbPixels)
    Alto_IMG = .ScaleY(Pic.Height, vbHimetric, vbPixels)
    Ancho_Obj = .ScaleWidth
    Alto_Obj = .ScaleHeight
   
    If Ancho_IMG > Ancho_Obj Then
        Alto_IMG = Alto_IMG * Ancho_Obj / Ancho_IMG
        Ancho_IMG = Ancho_Obj
    End If
    If Alto_IMG > Alto_Obj Then
        Ancho_IMG = Ancho_IMG * Alto_Obj / Alto_IMG
        Alto_IMG = Alto_Obj
    End If
    Pos_x = (Ancho_Obj - Ancho_IMG) / 2
    Pos_y = (Alto_Obj - Alto_IMG) / 2
End With
   
   Objeto.PaintPicture Pic, Pos_x, Pos_y, Ancho_IMG, Alto_IMG
   Objeto.ScaleMode = Old_Scale
   Exit Sub
   
'Error
ErrSub:
    If Err.Number = 76 Then
       Objeto.Cls
       Exit Sub
    Else
       MsgBox Err.Description, vbCritical
    End If
End Sub

Espero le sirva...

Saludos Cordiales


buen diaa....... y como llamas a esa funcion ?

saludos
Título: Re:ucImage: Detectar tamaño
Publicado por: E N T E R en Noviembre 04, 2014, 10:09:24 am
Muy bueno esta esto Axio.


Asi podes llamar gasafonso

Código: (VB) [Seleccionar]
Call DrawPic(Picture1, "c:\fotos\a.jpg")
Título: Re:ucImage: Detectar tamaño
Publicado por: gasafonso en Noviembre 04, 2014, 10:14:43 am
gracias ENTER !!!!!!

saludos
Título: Re:ucImage: Detectar tamaño
Publicado por: YAcosta en Noviembre 04, 2014, 01:04:09 pm
Ayer no tuve tiempo y hoy en la mañana tampoco, en la tarde la estoy probando pero queria preguntar por si aca alguien mas lo prueba ese codigo del amigo AxioUK ¿funciona con archivos PNG? porque eso es lo que cargo  al control ucImage. No se si ese LoadPicture(Path_Imagen) que setea la variable PIC definida como IPictureDisp podra reconocer el archivo png. Si alguien me lo puede confirmar porfa
Título: Re:ucImage: Detectar tamaño
Publicado por: gasafonso en Noviembre 04, 2014, 01:38:31 pm
No amigo YAcosta, no funcionas con archivos PNG, por lo menos ami, si alguien lo hace que lo publique en el foro

gracias

Gaston
Título: Re:ucImage: Detectar tamaño
Publicado por: YAcosta en Noviembre 04, 2014, 03:19:43 pm
Gracias gasafonso, es lo que imaginaba. En mi soft la foto la cargo siguiendo este modelo:

ucImage.LoadImageFromFile RutaAlArchivoPNG

Entonces, antes de asignárselo al control debería saber el ancho y el alto de la fotografía PNG para que dependiendo de eso modifique también el ancho y el alto del control ucImage y mantener la estetica de la imagen fotográfica. Creo que debería usar otros métodos (que desconozco) para poder averiguar las propiedades del archivo png antes de su carga.


Saludos
Título: Re:ucImage: Detectar tamaño
Publicado por: YAcosta en Noviembre 04, 2014, 03:47:37 pm
Creo que me valdre de este clase
http://www.recursosvisualbasic.com.ar/htm/trucos-codigofuente-visual-basic/48.htm#2

Espero no mas no entre en conflicto con el ucImage.
Título: Re:ucImage: Detectar tamaño
Publicado por: YAcosta en Noviembre 04, 2014, 04:29:39 pm
Ya esta, funciona perfecto, chequee el codigo y obviamente la clase no crea ningun conflicto con el ucImage. La cargue y la invoque con un par de lineas pasando de forma automatica de esto:

(http://i.snag.gy/IRguX.jpg)

a esto:

(http://i.snag.gy/vLZRo.jpg)


Gracias a todos por su interes. Saludos
Título: Re:ucImage: Detectar tamaño
Publicado por: E N T E R en Noviembre 04, 2014, 05:38:13 pm
Hola YAcosta, como se llama el control que usas para mostrar tu lista de articulos.
Título: Re:ucImage: Detectar tamaño
Publicado por: YAcosta en Noviembre 04, 2014, 07:23:15 pm
Se llama  ucImage + Shape + Labels

A veces no es necesario complicarse tanto.

:-)

PD: Todos los controles pertenecen a una matriz de controles. Luego es codigo.
Título: Re:ucImage: Detectar tamaño
Publicado por: raul338 en Noviembre 04, 2014, 11:21:29 pm
El ucImage tiene otras formas de escalado, hay 2 que hacen lo que dijo coco arriba. Básicamente como el fondo de pantallas de windows. Achicar hasta que entre en proporción. Y agrandar en proporción cortando la imagen hasta que entre
Título: Re:ucImage: Detectar tamaño
Publicado por: YAcosta en Noviembre 04, 2014, 11:44:24 pm
Hola Raul, se me había pasado por completo el post de Coco porque en ese momento aun no sabia como capturar el tamaño de la foto original.

Lo cierto es que las 200 imágenes que ponga no las conozco y las cargo dinámicamente, es mas, las va a poner el usuario. Entonces no me queda claro si finalmente terminé haciendo lo que indicas (creo que si).

Básicamente me valí de la clase que publique arriba para detectar el ancho y alto de la imagen e invocarlo con una sola linea de código, la que llama a una funcioncita donde evalúo si es mas ancho que alto o mas alto que ancho (las que son cuadradas no las toco) y según eso cambio en tiempo de ejecución el tamaño del ucImage y listo con eso resolví el tema. Todo esto para PNGs.


--------------------------
La verdad y solo de cargoso quiero ser aun mas exacto en el tamaño del ucImage pero ya solo por una mariconada visual, para que la foto se vea aun mejor. A ver si me enrrollo un poco y si se me entiende.

El tamaño máximo del área ocupada por el ucImage es un cuadrado de 6000 x 6000 (creo que son pixeles, la que usa vb), bueno, hay foto mas pequeñas que eso y hay fotos mas grandes, las que son pequeñas las agrando hasta 6000x6000 y las mas grandes las reduzco, pero en el caso de una foto digamos de 3000 por 200 (un lapicero digamos) la debo agrandar hasta 6000 x 400, si la mando de frente el lapicero quedará gordo y por eso deberé reducir el width del ucImage hasta los 400. De allí que estoy probando con proporciones y poder tener la imagen lo mas estética posible.

De momento solo estoy detectando las que son casi el doble de tamaño para multiplicar por un factor y con eso el 99% de las fotos ya se ven mucho mejor a diferencia de antes.

Saludos
Título: Re:ucImage: Detectar tamaño
Publicado por: YAcosta en Noviembre 05, 2014, 12:21:07 am
En esta seccion de codigo invoco al procedimiento:

Código: (VB) [Seleccionar]
....
      If Len(ucMiFoto) > 0 Then
         picFoto(0).LoadImageFromFile memGlobalRutaImagen & IdFoto & ".png"
         Call ColocaFoto(Index)
         Shape1(Index).BackColor = &HAA6E21
         Shape1(Index).BorderColor = vbWhite
         
         Call infoFoto(IdFoto) '<--------- Esta linea es lo que aumente
         picFoto(0).Visible = True
...

Y este es el código que modifica al ucImage.

Código: (VB) [Seleccionar]
Private Sub infoFoto(IdFoto As Integer)
Dim Ruta As String
Ruta = memGlobalRutaImagen & IdFoto & ".png"
cImgInfo.ReadImageInfo Ruta
   
Alto = cImgInfo.Height
Ancho = cImgInfo.Width

If Alto >= Ancho + (Ancho * 0.7) Then 'El valor 0.7 es chapucero, esta tanteado.
   picFoto(0).Width = 3400
ElseIf Ancho >= Alto + (Alto * 0.7) Then
   picFoto(0).Height = 3400
Else
  picFoto(0).Width = 6735
  picFoto(0).Height = 6735
End If
End Sub

Aqui se ve que ya varias imágenes mas largas ya se ven bien y viceversa, salvo algunos muy pocos casos que ya puliré.

[youtube]cmJZQ0y1-HE[/youtube]
Título: Re:ucImage: Detectar tamaño
Publicado por: LeandroA en Noviembre 05, 2014, 12:46:12 am
hola Yvan, lo que te dijo Raul es

Código: [Seleccionar]
ucImage1.ScaleMode = eScale
eso ajusta la imagen proporcionalmente.

después a (modo de información) si en GDI+ queres saber como obtener las medias de las imágenes se utilizan o se utiliza estas apis

Código: [Seleccionar]
Private Declare Function GdipGetImageWidth Lib "GdiPlus.dll" (ByVal mImage As Long, ByRef mWidth As Long) As Long
Private Declare Function GdipGetImageHeight Lib "GdiPlus.dll" (ByVal mImage As Long, ByRef mHeight As Long) As Long
o
Código: [Seleccionar]
Private Declare Function GdipGetImageDimension Lib "GdiPlus.dll" (ByVal mImage As Long, ByRef mWidth As Single, ByRef mHeight As Single) As Long
no me explayo mas porque quizás con la primera respuesta ya te alcanza, cualquier cosa avisa.
Saludos.
Título: Re:ucImage: Detectar tamaño
Publicado por: YAcosta en Noviembre 05, 2014, 01:30:10 am
Diantres!!!  Diantres!!!  Diantres!!!  Diantres!!!  Diantres!!!

Perdona Raul no te había entendido (también Coco), gracias Lea por aclararme.

ucImage1.ScaleMode = eScale era la solución a todos mis problemas.

Mi excusa es que siempre he usado 1.- eStretch pensando que los otros modos me cambiaron el tamaño del ucImage (haciéndolo mas grande que 6000x6000 o mas chico que eso porque eso me habia pasado con el 0- ActualSize) y que en esa proporción ajustaba los lados pero siempre modificandome el tamaño del control.... que patinada...

Ya con eso quedó mucho mas que resuelto, ya no es necesario usar la clase y borrare tambien el código que puse... ah caramba... mas viejo mas ciego.

Gracias amigos por su paciencia.
Título: Re:ucImage: Detectar tamaño
Publicado por: LeandroA en Noviembre 05, 2014, 05:52:19 pm
diantre

m. col. Demonio, diablo:
¡diantre de niño, qué malo es!
♦ Es un eufemismo.
interj. col. Expresa enfado o sorpresa:
¡diantre, eres el último a quien esperaba ver!


Interesante  :D los Argentinos diriamos:

1 Que lo repario!

o en su defecto

2 chasumaaadre.

(http://i1.kym-cdn.com/entries/icons/original/000/006/550/feel-like-a-sir-template.jpg)
Título: Re:ucImage: Detectar tamaño
Publicado por: YAcosta en Noviembre 05, 2014, 06:14:01 pm
Ah claroo, en realidad soy mas grosero de lo que aparento y quise ser "delicado" jajaja. Incluso "diantres" o "diantre" está en desuso igual que "caspita" jajaja.