Newsgrupos.com  

Retroceder   Newsgrupos.com > Forum > Newsgroup microsoft.public.es.* 1 Foro > Newsgroup microsoft.public.es.dotnet.vb
Registrarse Preguntas Frecuentes Lista de Foreros Calendario Buscar Temas de Hoy Marcar Foros Como Leídos




Respuesta
 
LinkBack Herramientas Desplegado
  #1 (permalink)  
Antiguo 09-05-2008, 22:56:56
Ivan
 
Mensajes: n/a
Predeterminado cargar graphics con imagen y guardar como imagen

hola a todos,

a raiz de intentar buscar una posible solucion (que seguro la tiene
mucho mas sencilla) al hilo =>

ListView y Thumbnails

http://groups.google.com/group/micro...9ae11c27b767e#

, en el que Federico busca una forma de mostrar las imagenes en un
listview pero con las proporciones originales, para lo cual plantea la
posibilidad del tipico recuadro de las vistas en miniatura, me he
liado a meterle mano al System.Drawing.Imaging, Graphics, etc, que
ademas le tenia ganas

la cosa es que es la 1ª vez que lo tanteo y no acabo de conseguir
nada. De hecho no estoy del todo seguro de estar entendiendo bien el
concepto de graphics y su forma de uso

lo que estoy intentando, de momento es:

1º) cargar las imagenes contenidas en un directorio en sucesivas
instancias con New Bitmap

2º) tomo las proporciones de la imagen para crear una nueva imagen
dandole al lado mas grande un valor de 100 y que el otro mantenga un
tamaño proporcional

3º) crear un objeto Graphics de dimensiones cuadradas (100x100)

4º) dibujar en este graphics la imagen ya ajustada y centrada segun
corresponda (vertical u horizontal)

5º) crear una nueva imagen a partir de este graphics

6º) guardar esta nueva imagen

para ello he hecho el codigo que pongo a continuacion, pero la cosa es
que aunque no me da error de ningun tipo, tampoco me guarda las
imagenes en el directorio indicado. En las pruebas lo estoy probando
en el load de un formulario

este es el codigo (lo dicho, lo mismo hay alguna burrada, pero para
eso lo pongo, por si alguno podeis comentarlo)

'************************************************* ******************
Sub CrearImagenes()
Const RutaImagenes As String = _
"C:\Documents and Settings\Ivan\Mis documentos" & _
"\Mis imágenes\Pruebas_Imagenes_Net\"
Dim marco, img, img2, img3 As Bitmap
Dim w, h, pw, ph, iniX, iniY As Integer
Dim g As Graphics
Dim rect As Rectangle
Dim dInfo As New _
System.IO.DirectoryInfo(RutaImagenes.TrimEnd("\"))
Dim FsInfo() As _
System.IO.FileInfo = dInfo.GetFiles(".jpg")
For Each strImg As System.IO.FileInfo In FsInfo
marco = New Bitmap(100, 100)
img = New Bitmap(strImg.FullName)
w = img.Size.Width
h = img.Size.Height
If w > h Then
pw = 100
ph = Int((h * 100) / w)
Else
ph = 100
pw = Int((w * 100) / h)
End If
g = Graphics.FromImage(marco)
iniX = Int((100 - pw) / 2)
iniY = Int((100 - ph) / 2)
rect = New Rectangle(iniX, iniY, pw, ph)
img2 = New Bitmap(img, pw, ph)
g.DrawImage(img2, rect)
img3 = New Bitmap(100, 100, g)
img3.Save(RutaImagenes & "tmp_" & strImg.Name, _
System.Drawing.Imaging.ImageFormat.Bmp) 'Jpeg)
Next
'img3.Dispose() : img3 = Nothing
'img.Dispose() : img = Nothing
'img2.Dispose() : img2 = Nothing
'g.Dispose() : g = Nothing
'marco.Dispose() : marco = Nothing
End Sub
' ************************************************** *****************

bueno, lo dicho si alguno veis porque no hace nada, os lo agradezco, y
si lo que estoy haciendo esta totalmente descaminado tambien os
agradezco cualquier pista/indicacion de por donde tirar

un saludo
Ivan



Responder Con Cita
Alt Today
Advertising
Google Adsense
 
This advertising will not be shown
in this way to registered members.
Register your free account today
and become a member on
Newsgrupos.com
Standard Sponsored Links

  #2 (permalink)  
Antiguo 10-05-2008, 02:25:35
Ivan
 
Mensajes: n/a
Predeterminado Re: cargar graphics con imagen y guardar como imagen

hola de nuevo,

de momento he conseguido que se guarde la imagen creada a partir del
grafico, pero solo se guarda un cuadrado negro (o blanco/transparente
si uso MemoryBmp o similar), es decir no se ve la imagen que en teoria
creia haber dibujado con DrawImage

¿como se puede dibujar, insertar, incrustar,,, o lo que sea una imagen
en un graphics? lo mismo se me esta yendo la olla con las coordenadas
y/o las dimensiones, mezclando pixeles con 'merinas', que se diria por
aqui

el que ahora sí se guarde parece que es porque el graphics lo creo a
partir de un objeto, es decir me da la impresion de que un graphics no
se puede crear por si mismo sino que ha de estar 'sujeto' a un
'lienzo', por llamar de alguna manera al objeto del cual se obtiene la
superficie de trabajo

¿sabeis si esto es asi, o es una paja mental de las mias? en la ayuda
no acabo de aclararme

bueno este es el nuevo codigo provisional (he probado bastantes
metodos y/o propiedades, tanto de los graficos como de los bitmap/
images, pero como no han parecido arreglar nada los he quitado )

Sub CrearImagenes(ByRef g As Graphics)
Dim img, img2, img3 As Bitmap
Dim gW, w, h, pw, ph, iniX, iniY As Integer
gW = 100
Dim rect As Rectangle
Dim dInfo As New _
System.IO.DirectoryInfo(RutaImagenes.TrimEnd("\"))
Dim FsInfo() As _
System.IO.FileInfo = dInfo.GetFiles()
For Each strImg As System.IO.FileInfo In FsInfo
If strImg.Extension = ".db" Then Continue For
img = New Bitmap(strImg.FullName)
w = img.Size.Width
h = img.Size.Height
If w > h Then
pw = gW
ph = Int((h * gW) / w)
Else
ph = gW
pw = Int((w * gW) / h)
End If
iniX = Int((g.ClipBounds.X - pw) / 2)
iniY = Int((g.ClipBounds.Y - ph) / 2)
rect = New Rectangle(iniX, iniY, pw, ph)
img2 = New Bitmap(img, pw, ph)
g.DrawImage(img2, rect)
img3 = New Bitmap(100, 100, g)

' estas son las pruebas de carga: el img2 lo guarda
perfecto
' pero el img3 guarda un cuadrado negro/..

img2.Save(RutaImagenes & "img2_" & strImg.Name, _
System.Drawing.Imaging.ImageFormat.Bmp)

img3.Save(RutaImagenes & "img3_" & strImg.Name, _
System.Drawing.Imaging.ImageFormat.Jpeg) '.MemoryBmp)
'Jpeg)


Next
End Sub

por cierto, guarda todos como jpg, aunque lo ponga como bmp

bueno, si veis algo o sabeis de algun sitio donde ver un poco el tema
pero algo mas 'entendible' que en la ayuda, os lo agradezco

un saludp
Ivan
Responder Con Cita
  #3 (permalink)  
Antiguo 10-05-2008, 02:25:35
Ivan
 
Mensajes: n/a
Predeterminado Re: cargar graphics con imagen y guardar como imagen

hola de nuevo,

de momento he conseguido que se guarde la imagen creada a partir del
grafico, pero solo se guarda un cuadrado negro (o blanco/transparente
si uso MemoryBmp o similar), es decir no se ve la imagen que en teoria
creia haber dibujado con DrawImage

¿como se puede dibujar, insertar, incrustar,,, o lo que sea una imagen
en un graphics? lo mismo se me esta yendo la olla con las coordenadas
y/o las dimensiones, mezclando pixeles con 'merinas', que se diria por
aqui

el que ahora sí se guarde parece que es porque el graphics lo creo a
partir de un objeto, es decir me da la impresion de que un graphics no
se puede crear por si mismo sino que ha de estar 'sujeto' a un
'lienzo', por llamar de alguna manera al objeto del cual se obtiene la
superficie de trabajo

¿sabeis si esto es asi, o es una paja mental de las mias? en la ayuda
no acabo de aclararme

bueno este es el nuevo codigo provisional (he probado bastantes
metodos y/o propiedades, tanto de los graficos como de los bitmap/
images, pero como no han parecido arreglar nada los he quitado )

Sub CrearImagenes(ByRef g As Graphics)
Dim img, img2, img3 As Bitmap
Dim gW, w, h, pw, ph, iniX, iniY As Integer
gW = 100
Dim rect As Rectangle
Dim dInfo As New _
System.IO.DirectoryInfo(RutaImagenes.TrimEnd("\"))
Dim FsInfo() As _
System.IO.FileInfo = dInfo.GetFiles()
For Each strImg As System.IO.FileInfo In FsInfo
If strImg.Extension = ".db" Then Continue For
img = New Bitmap(strImg.FullName)
w = img.Size.Width
h = img.Size.Height
If w > h Then
pw = gW
ph = Int((h * gW) / w)
Else
ph = gW
pw = Int((w * gW) / h)
End If
iniX = Int((g.ClipBounds.X - pw) / 2)
iniY = Int((g.ClipBounds.Y - ph) / 2)
rect = New Rectangle(iniX, iniY, pw, ph)
img2 = New Bitmap(img, pw, ph)
g.DrawImage(img2, rect)
img3 = New Bitmap(100, 100, g)

' estas son las pruebas de carga: el img2 lo guarda
perfecto
' pero el img3 guarda un cuadrado negro/..

img2.Save(RutaImagenes & "img2_" & strImg.Name, _
System.Drawing.Imaging.ImageFormat.Bmp)

img3.Save(RutaImagenes & "img3_" & strImg.Name, _
System.Drawing.Imaging.ImageFormat.Jpeg) '.MemoryBmp)
'Jpeg)


Next
End Sub

por cierto, guarda todos como jpg, aunque lo ponga como bmp

bueno, si veis algo o sabeis de algun sitio donde ver un poco el tema
pero algo mas 'entendible' que en la ayuda, os lo agradezco

un saludp
Ivan
Responder Con Cita
  #4 (permalink)  
Antiguo 10-05-2008, 08:39:39
Ivan
 
Mensajes: n/a
Predeterminado Re: cargar graphics con imagen y guardar como imagen

esta parte =>

> iniX = Int((g.ClipBounds.X - pw) / 2)
> iniY = Int((g.ClipBounds.Y - ph) / 2)


deberia {creo} ser asi =>

iniX = Int(g.ClipBounds.X + ((100 - pw) / 2))
iniY = Int(g.ClipBounds.Y + ((100 - ph) / 2))

aunque a la hora dle archivo guardado, sigue siendo igual ...negro

un saludo
Ivan
Responder Con Cita
  #5 (permalink)  
Antiguo 10-05-2008, 08:39:39
Ivan
 
Mensajes: n/a
Predeterminado Re: cargar graphics con imagen y guardar como imagen

esta parte =>

> iniX = Int((g.ClipBounds.X - pw) / 2)
> iniY = Int((g.ClipBounds.Y - ph) / 2)


deberia {creo} ser asi =>

iniX = Int(g.ClipBounds.X + ((100 - pw) / 2))
iniY = Int(g.ClipBounds.Y + ((100 - ph) / 2))

aunque a la hora dle archivo guardado, sigue siendo igual ...negro

un saludo
Ivan
Responder Con Cita
  #6 (permalink)  
Antiguo 15-05-2008, 02:40:49
Ivan
 
Mensajes: n/a
Predeterminado Re: cargar graphics con imagen y guardar como imagen

hola de nuevo,

para no dejar el hilo sin ninguna solucion, pongo la que de momento he
encontrado, una vez mas gracias al foro y en este caso gracias a
Tristan a lo largo de unos cuantos hilos (entre ellos estos <http://
tinyurl.com/5rr7qc>, por si a alguien le sirven)

al parecer (y no me hagais mucho caso) si creamos el grafico desde un
objeto con CreateGraphics o con el argumento e del evento Paint, se va
a trabajar sobre la 'superficie' del control, aunque le carguemos una
imagen o lo que sea y no 'podremos' disociar' el grafico del objeto en
si.

Para trabajar directamente con un grafico para manipular imagenes y
poder disponer de ellas independientemente (guardarlas, cargarlas en
un control, modificarlas, etc) parece ser que lo suyo es crear el
grafico directamente a partir de una imagen con Graphics.FromImage,
pudiendo 'inicializar' el grafico desde un nuevo bitmap 'vacio'.

despues, lo que hagamos en este grafico (cargar otra imagen, pej, o
trazar lineas, etc) se lo estaremos haciendo a la imagen, la cual
podemos manipular ya con las propiedades del objeto Image,
independientemente del grafico

bueno, para el caso comentado en la consulta pongo un codigo que le
añade a la imagen original espacios arriba y abajo, o a la derecha y a
la izquierda para convertirla en una imagen cuadrada pero conteniendo
la imagen original con sus proporciones en el interior

despues se puede cargar, pej. un imagelist con las fotos modificadas y
al usarlas en otro control mantendran sus proporciones reales (aunque
en realidad la imagen sea siempre cuadrada, pero solo se veria la foto
original)

con ligeras modificaciones se puede hacer al reves, es decir, en vez
de añadirle espacios al original, reducir este hasta un tamaño que
deseemos insertandolo en un cuadrado predefinido. En este caso las
imaagenes pesarian menos pero tambien se modificaria su resolucion
(supongo)

este es el codigo=>

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.DrawImage(imagen, iX, iY)
marco.Dispose() : marco = Nothing
imagen.Dispose() : imagen = Nothing
Return imgLienzo
End Function

le voy a poner a Fedrico el codigo y el ej. con el que lo he ido
probando. Ya que esta hecho, y dado que su mensaje ha sido el motivo
del codigo

como siempre, si alguien ve cualquier burrada, o otras formas de
hacerlo, sera bien recibido

un saludo
Ivan
Responder Con Cita
  #7 (permalink)  
Antiguo 15-05-2008, 02:40:49
Ivan
 
Mensajes: n/a
Predeterminado Re: cargar graphics con imagen y guardar como imagen

hola de nuevo,

para no dejar el hilo sin ninguna solucion, pongo la que de momento he
encontrado, una vez mas gracias al foro y en este caso gracias a
Tristan a lo largo de unos cuantos hilos (entre ellos estos <http://
tinyurl.com/5rr7qc>, por si a alguien le sirven)

al parecer (y no me hagais mucho caso) si creamos el grafico desde un
objeto con CreateGraphics o con el argumento e del evento Paint, se va
a trabajar sobre la 'superficie' del control, aunque le carguemos una
imagen o lo que sea y no 'podremos' disociar' el grafico del objeto en
si.

Para trabajar directamente con un grafico para manipular imagenes y
poder disponer de ellas independientemente (guardarlas, cargarlas en
un control, modificarlas, etc) parece ser que lo suyo es crear el
grafico directamente a partir de una imagen con Graphics.FromImage,
pudiendo 'inicializar' el grafico desde un nuevo bitmap 'vacio'.

despues, lo que hagamos en este grafico (cargar otra imagen, pej, o
trazar lineas, etc) se lo estaremos haciendo a la imagen, la cual
podemos manipular ya con las propiedades del objeto Image,
independientemente del grafico

bueno, para el caso comentado en la consulta pongo un codigo que le
añade a la imagen original espacios arriba y abajo, o a la derecha y a
la izquierda para convertirla en una imagen cuadrada pero conteniendo
la imagen original con sus proporciones en el interior

despues se puede cargar, pej. un imagelist con las fotos modificadas y
al usarlas en otro control mantendran sus proporciones reales (aunque
en realidad la imagen sea siempre cuadrada, pero solo se veria la foto
original)

con ligeras modificaciones se puede hacer al reves, es decir, en vez
de añadirle espacios al original, reducir este hasta un tamaño que
deseemos insertandolo en un cuadrado predefinido. En este caso las
imaagenes pesarian menos pero tambien se modificaria su resolucion
(supongo)

este es el codigo=>

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.DrawImage(imagen, iX, iY)
marco.Dispose() : marco = Nothing
imagen.Dispose() : imagen = Nothing
Return imgLienzo
End Function

le voy a poner a Fedrico el codigo y el ej. con el que lo he ido
probando. Ya que esta hecho, y dado que su mensaje ha sido el motivo
del codigo

como siempre, si alguien ve cualquier burrada, o otras formas de
hacerlo, sera bien recibido

un saludo
Ivan
Responder Con Cita
  #8 (permalink)  
Antiguo 16-05-2008, 07:29:01
Harold V
 
Mensajes: n/a
Predeterminado Re: cargar graphics con imagen y guardar como imagen

Este ote ayudara....

'Crea la imagen del texto que introduzcas

Sub DrawCodigoBarras(ByVal texto As String)

If Not String.IsNullOrEmpty(codigo) Then

Dim fnt As Font = New Font("Bar 25i f HR", 30,
FontStyle.Regular, GraphicsUnit.Point, 0)
Dim Sz As SizeF = MeasureString(texto, fnt)

Dim bmp As Bitmap = New Bitmap(CInt(Sz.Width), CInt(Sz.Height) +
2)
Dim G As Graphics = Graphics.FromImage(bmp)

G.SmoothingMode = SmoothingMode.AntiAlias

'esto evitas q este negro el fondo
G.FillRectangle(Brushes.White, New RectangleF(0, 0,
CInt(Sz.Width), CInt(Sz.Height)))
G.DrawString(texto, fnt, Brushes.Black, 0, 0)
G.Save()

bmp.Save("C:\Sample.jpeg")
G.Dispose()

End If
End Sub

Public Function MeasureString(ByVal text As String, ByVal font As Font)
As SizeF

Dim instance As Graphics =
Graphics.FromImage(DirectCast(My.Resources.Templat e, Image))

Dim texto As String = text
Dim fnt As Font = font
Dim orig As PointF = New PointF(0, 0)
Dim resul As SizeF

resul = instance.MeasureString(text, font, orig,
System.Drawing.StringFormat.GenericDefault)

Return resul
End Function




Responder Con Cita
  #9 (permalink)  
Antiguo 16-05-2008, 07:29:01
Harold V
 
Mensajes: n/a
Predeterminado Re: cargar graphics con imagen y guardar como imagen

Este ote ayudara....

'Crea la imagen del texto que introduzcas

Sub DrawCodigoBarras(ByVal texto As String)

If Not String.IsNullOrEmpty(codigo) Then

Dim fnt As Font = New Font("Bar 25i f HR", 30,
FontStyle.Regular, GraphicsUnit.Point, 0)
Dim Sz As SizeF = MeasureString(texto, fnt)

Dim bmp As Bitmap = New Bitmap(CInt(Sz.Width), CInt(Sz.Height) +
2)
Dim G As Graphics = Graphics.FromImage(bmp)

G.SmoothingMode = SmoothingMode.AntiAlias

'esto evitas q este negro el fondo
G.FillRectangle(Brushes.White, New RectangleF(0, 0,
CInt(Sz.Width), CInt(Sz.Height)))
G.DrawString(texto, fnt, Brushes.Black, 0, 0)
G.Save()

bmp.Save("C:\Sample.jpeg")
G.Dispose()

End If
End Sub

Public Function MeasureString(ByVal text As String, ByVal font As Font)
As SizeF

Dim instance As Graphics =
Graphics.FromImage(DirectCast(My.Resources.Templat e, Image))

Dim texto As String = text
Dim fnt As Font = font
Dim orig As PointF = New PointF(0, 0)
Dim resul As SizeF

resul = instance.MeasureString(text, font, orig,
System.Drawing.StringFormat.GenericDefault)

Return resul
End Function




Responder Con Cita
  #10 (permalink)  
Antiguo 16-05-2008, 20:00:38
Ivan
 
Mensajes: n/a
Predeterminado Re: cargar graphics con imagen y guardar como imagen

hola Harold,

>>> Este ote ayudara....<<<


muchas gracias

es interesante el ej. De hecho creo que tambien me va a dar una idea de cara al manejo de texto en graficos, que pienso
encarar en breve, en cuanto me aclare un poco mas con las imagenes y el 'dibujo'

lo dicho, gracias y un saludo
Ivan


Responder Con Cita
 
Respuesta


Herramientas
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Trackbacks are habilitado
Pingbacks are habilitado
Refbacks are habilitado


Temas Similares
Tema Autor Foro Respuestas Último mensaje
como guardar una imagen con texto? karina Newsgroup microsoft.public.es.powerpoint 6 03-06-2008 15:23:00
Cargar imagen FLM Newsgroup microsoft.public.es.dotnet.vb 9 08-02-2008 02:19:21
[PREGUNTA] Como superponer una imagen en movimiento sobre una imagen estática Facon Newsgroup es.rec.video.edicion 30 03-02-2007 14:21:07
cargar un imagen JESUS SERRANO Newsgroup microsoft.public.es.vba 6 31-01-2007 17:42:35
como guardar imagen en una tabla? juan pablo vargas Newsgroup microsoft.public.es.vfoxpro.datos 5 01-05-2006 19:11:20





Powered by: vBulletin, Versión 3.6.8
Derechos de Autor ©2000 - 2008, Jelsoft Enterprises Ltd.

LinkBacks Enabled by vBSEO 3.1.0 © 2007, Crawlability, Inc.