Visual Basic.NET - Al reducir el tamaño de una imagen me aumenta su peso

 
Vista:
sin imagen de perfil

Al reducir el tamaño de una imagen me aumenta su peso

Publicado por Felipe (7 intervenciones) el 04/09/2014 19:48:03
Hola a todos, soy nuevo en esto, y creando un programa para redimensionar imagenes me ha surgido un problema.
El programa, lo que hace es buscar una imagen, redimensionarla para que tenga un alto o ancho (segun cual sea de mayor tamaño) maximo de 800 pixeles, y que el otro se ajuste para no distorsionar la imagen. Y por ultimo la guarda.
El problema, es que cuando redimensiona la imagen, esta no se porque pesa mas que la imagen original, aunque su tamaño se halla reducido.

Os pongo el codigo, por si encontrais el error o la razon de este hecho.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
Imports System.IO
 
Public Class Form1
 
 
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim openFileDialog1 As New OpenFileDialog()
 
        openFileDialog1.Title = "Seleccionar Imagen"
        openFileDialog1.FileName = ""
        openFileDialog1.Filter = "JPG|*.jpg|GIF|*.gif"
        openFileDialog1.ShowDialog()
        PictureBox1.Image = System.Drawing.Image.FromFile(openFileDialog1.FileName)
 
 
        Dim bmp As New Bitmap(PictureBox1.Image)
 
        If PictureBox1.Image.Size.Height > 800 Then
            If PictureBox1.Image.Size.Height > PictureBox1.Image.Size.Width Then
                Dim abc As Double = ((PictureBox1.Image.Size.Width * 800) / PictureBox1.Image.Size.Height)
                Dim newsize As New Size(800, abc)
                PictureBox1.Image = New Bitmap(bmp, 800, abc)
 
            ElseIf PictureBox1.Image.Size.Height < PictureBox1.Image.Size.Width Then
                Dim abcd As Double = ((PictureBox1.Image.Size.Height * 800) / PictureBox1.Image.Size.Width)
                Dim newsize As New Size(abcd, 800)
                PictureBox1.Image = New Bitmap(bmp, abcd, 800)
 
            End If
        End If
 
        If PictureBox1.Image.Size.Width > 800 Then
            If PictureBox1.Image.Size.Height > PictureBox1.Image.Size.Width Then
                Dim abc As Double = ((PictureBox1.Image.Size.Width * 800) / PictureBox1.Image.Size.Height)
                Dim newsize As New Size(800, abc)
                PictureBox1.Image = New Bitmap(bmp, 800, abc)
 
            ElseIf PictureBox1.Image.Size.Height < PictureBox1.Image.Size.Width Then
                Dim abcd As Double = ((PictureBox1.Image.Size.Height * 800) / PictureBox1.Image.Size.Width)
                Dim newsize As New Size(abcd, 800)
                PictureBox1.Image = New Bitmap(bmp, 800, abcd)
 
            End If
        End If
 
 
 
 
 
    End Sub
 
    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        Dim saveFileDialog1 As New SaveFileDialog()
 
        saveFileDialog1.Title = "Guardar Imagen"
        saveFileDialog1.FileName = "Nueva Imagen"
        saveFileDialog1.Filter = "JPG|*.jpg|GIF|*.gif"
        saveFileDialog1.ShowDialog()
        PictureBox1.Image.Save(saveFileDialog1.FileName)
    End Sub
 
 
End Class

Saludos y gracias de antemano.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil

Al reducir el tamaño de una imagen me aumenta su peso

Publicado por Pico (167 intervenciones) el 04/09/2014 22:22:46
Si ocupa más bytes siendo más pequeña es porque tiene más profundidad de color o se guarda con otra compresión o sin ella.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Al reducir el tamaño de una imagen me aumenta su peso

Publicado por Felipe (7 intervenciones) el 05/09/2014 12:48:00
Efectivamente, la profundidad de color es del doble de la imagen original.
¿Podrias decirme que comando tengo que usar para modificarla a la profundidad original, o sino, para que no modifique la original de la foto?
Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Al reducir el tamaño de una imagen me aumenta su peso

Publicado por Pico (167 intervenciones) el 05/09/2014 13:22:02
Es que el programa está mal hecho por un error de concepto que tienes, bastante común, por cierto.

Lo que llamamos una archivo de imagen no es más que una serie datos de puntos en un formato que se determina en la cabecera de ese archivo. Cuando lo cargas en un control, el windows lee ese formato y esos datos, y los adapta al formato de imagen que tenga ese control. Como tendrás en el windows una profundidad de color de 32 bits, el windows carga esa imagen en ese control con esa profundidad. Le cambias el tamaño, y al ir a guardarla la guardas con las características de imagen que tengas en el windows.

Como lo que quieres es sólo recortar la imagen, lo que tendrías que hacer es cargarla tal cual está en el archivo, sin transformarla. Luego, si quieres mostrarla, pues la muestras, y que el windows la transforme. Si la cargas en el Image de un PictureBox el windows va a transformarla siempre. Para eso existen clases como Bitmap. Bitmap(archivo) carga la imagen en memoria sin modificar nada sus características. Luego transformas el tamaño y sólo el tamaño del bmp, lo grabas, y ya lo tienes con todas las demás características iguales al original.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Al reducir el tamaño de una imagen me aumenta su peso

Publicado por Felipe (7 intervenciones) el 05/09/2014 19:01:16
¿Perdona, pero podrias ponerme un ejemplo o explicarme como ?
Soy aun principiante en el visual basic, y no soy capaz de cargar una imagen y luego guardarla sin usar el picturebox.
Se como cargarlas sin usar el picturebox, pero luego no se como cargar la variable que almacena la imagen a un savefiledialog.
Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Al reducir el tamaño de una imagen me aumenta su peso

Publicado por Pico (167 intervenciones) el 06/09/2014 15:54:26
¿Y qué tiene que ver el savefiledialog? El savefiledialog lo único que hace es seleccionar un archivo en un directorio, que luego se lo pasas al load del picturebox. Exactamente igual se seleciona para el constructor o el save de un Bitmap.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Al reducir el tamaño de una imagen me aumenta su peso

Publicado por Felipe (7 intervenciones) el 08/09/2014 22:16:56
Perdón por el retraso, a ver, el problema creo que esta en que no se que atributo asignarle a la variable que almacena la imagen.
Al principio lo almacenaba en un bitmap, pero asi la imagen se adaptaba a la resolucion del ordenador. Entoces lo cambie , pero ahora no se si es que no escribo bien lo que poner en el savefiledialog, o que no declaro correctamente la variable.

1
2
3
4
5
6
7
8
9
10
11
12
13
Dim bmp As System.Drawing.Image
 
        bmp = (System.Drawing.Image.FromFile(openFileDialog1.FileName))
 
        Dim newsize As New Size(600, 800)
 
        Dim saveFileDialog1 As New SaveFileDialog()
 
        saveFileDialog1.Title = "Guardar Imagen"
        saveFileDialog1.FileName = "Nueva Imagen"
        saveFileDialog1.Filter = "JPG|*.jpg|GIF|*.gif"
        saveFileDialog1.ShowDialog()
        bmp.Save(saveFileDialog1.FileName)

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Al reducir el tamaño de una imagen me aumenta su peso

Publicado por Pico (167 intervenciones) el 08/09/2014 22:34:56
Un ordenador no tiene resolución. Con eso estás guardándolo en un Image, no un Bitmap. Al Save tienes que pasarle una ruta. Con eso lo guarda ahí y ya está. El SaveFileDialog sólo selecciona una ruta.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Al reducir el tamaño de una imagen me aumenta su peso

Publicado por Felipe (7 intervenciones) el 09/09/2014 00:51:38
Si, cierto, me refería a la resolución de la pantalla. Claro, esa es una de mis dudas, si debo de guardar la imagen en un image, ya que el bitmap me altera la imagen original.
El problema de ese código, esque lo que me guarda es la imagen original, y no la redimensionada, de ahí mi otra duda, que variable es la que tengo que guardar?, porque en este caso la variable bmp solo contiene la imagen original, y la variable newsize no me permite guardarla porque Save' no es un miembro de System.Drawing.Size
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Al reducir el tamaño de una imagen me aumenta su peso

Publicado por Pico (167 intervenciones) el 10/09/2014 11:06:05
Por lo visto, el GDI+ sólo funciona con colores en 32 bits. Tendrás que usar el api de windows.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Al reducir el tamaño de una imagen me aumenta su peso

Publicado por Felipe (7 intervenciones) el 10/09/2014 22:12:48
Ya he declarado la funcion, pero cuando cambio el valor de la propiedad size de la variable que almacena la imagen, me salta un error diciendo que la propiedad size es readonly.¿ Como podria cambiar size para que pueda cambiarse el valor?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar