![]() |
| |||||||
| Registrarse | Preguntas Frecuentes | Lista de Foreros | Calendario | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
![]() |
| | LinkBack | Herramientas | Desplegado |
| |||
| 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 |
| | ||||
| ||||
| |
| |||
| 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 |
| |||
| 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 |
| |||
| 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 |
| |||
| 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 |
| |||
| 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 |
| |||
| 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 |
| |||
| 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 |
| |||
| 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 |
| |||
| 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 |
| |
| |
![]() |
| Herramientas | |
| Desplegado | |
| |
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 |