Visual Basic Foro
Programación => Visual Basic 6 => Mensaje iniciado 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
-
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.
-
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...
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
-
Gracias amigo, lo voy a checar a ver que me resulta.
Saludos
-
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...
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
-
Muy bueno esta esto Axio.
Asi podes llamar gasafonso
Call DrawPic(Picture1, "c:\fotos\a.jpg")
-
gracias ENTER !!!!!!
saludos
-
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
-
No amigo YAcosta, no funcionas con archivos PNG, por lo menos ami, si alguien lo hace que lo publique en el foro
gracias
Gaston
-
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
-
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.
-
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
-
Hola YAcosta, como se llama el control que usas para mostrar tu lista de articulos.
-
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.
-
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
-
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
-
En esta seccion de codigo invoco al procedimiento:
....
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.
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]
-
hola Yvan, lo que te dijo Raul es
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
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 Longo
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.
-
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.
-
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)
-
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.