Librería de Snippets para VB.NET !! (Compartan aquí sus snippets)
ABDERRAMAH:
Pues yo tengo una colección de funciones para crear, cargar y superponer imágenes así como para escribir texto usando gdi+:
cargar una imágen en una resolución determinada:
Código
Public Function read_image_at_res(ByRef file As String, ByRef force_sizex As Integer, ByRef force_sizey As Integer) As System.Drawing.Bitmap
Dim img As New Bitmap(file)
Dim b As New Bitmap(force_sizex, force_sizey)
Dim bg As Graphics = Graphics.FromImage(b)
Try
bg.DrawImage(img, New Rectangle(New Point(0, 0), New Size(force_sizex, force_sizey)), New Rectangle(0, 0, img.Width, img.Height), GraphicsUnit.Pixel)
Catch ex As Exception
End Try
bg.Dispose()
Return b
End Function
redimensionar una imágen:
Código
Public Function resize_bmp(ByRef img As Bitmap, ByRef sizex As Integer, ByRef sizey As Integer) As Bitmap
Dim b As New Bitmap(sizex, sizey)
Dim bg As Graphics = Graphics.FromImage(b)
bg.DrawImage(img, New Rectangle(New Point(0, 0), New Size(sizex, sizey)), New Rectangle(0, 0, img.Width, img.Height), GraphicsUnit.Pixel)
bg.Dispose()
Return b
End Function
superponer dos imágenes sobre un lienzo:
Código
Public Function layer_sum(ByRef layer1 As Bitmap, ByRef layer2 As Bitmap) As Bitmap
Dim bg As Graphics = Graphics.FromImage(layer1)
bg.DrawImage(layer2, New Point(0, 0))
bg.Dispose()
Return layer1
End Function
escribir texto plano(con sombreado rudimentario) en un fondo transparente:
Código
Public Function get_text_layer(ByRef size As System.Drawing.Size, ByRef text As String) As System.Drawing.Bitmap
Dim img As New Bitmap(size.Width, size.Height)
Dim bg As Graphics = Graphics.FromImage(img)
bg.DrawString(text, New Font("Lucida Console", 12, FontStyle.Bold), Brushes.Gray, New Point(1, -1))
bg.DrawString(text, New Font("Lucida Console", 12, FontStyle.Bold), Brushes.White, New Point(0, 0))
bg.Dispose()
Return img
End Function
dividir la imagen en sectores y devolver el indicado por "index":
Código
Public Function get_portion(ByRef image As System.Drawing.Bitmap, ByRef cuadriculax As Short, ByRef cuadriculay As Short, ByRef index As Integer) As System.Drawing.Bitmap
Dim img As New Bitmap(CInt(image.Size.Width / cuadriculax), CInt(image.Size.Height / cuadriculay))
'Dim b As New Bitmap(CInt(image.Size.Width / cuadriculax), CInt(image.Size.Height / cuadriculay))
Dim bg As Graphics = Graphics.FromImage(img)
Dim xcount = 0
Dim ycount = 0
Do While index >= cuadriculax
index = index - cuadriculax
ycount = ycount + 1
Loop
xcount = index
Dim tmpx As Integer = CInt((image.Size.Width / cuadriculax) * xcount)
Dim tmpy As Integer = CInt((image.Size.Height / cuadriculay) * ycount)
Dim port As New Rectangle(New System.Drawing.Point(0, 0), New Size(New Point(CInt(image.Size.Width / cuadriculax), CInt(image.Size.Height / cuadriculay))))
bg.DrawImage(image, port, tmpx, tmpy, CInt(port.Size.Width), CInt(port.Size.Height), GraphicsUnit.Pixel)
bg.Dispose()
Return img
End Function
Eleкtro:
@ABDERRAMAH
Muy buenos, el primero y el segundo me gustaron mucho, siempre tengo problemas para redimensionar imagenes y me viene bien.
El último también, es una idea muy dinámica lo de dividir la imagen en una cuadrícula y tomar un sector, no sé si eres el autor de las funciones pero a pocos se le habría ocurrido hacer algo así xD
Saludos!
ABDERRAMAH:
Soy autor, si, aunque la idea de crear el objeto graphics y después destruirlo, en lugar de tener uno fijo para todo la vi en unos códigos de msdn.
Novlucker:
Bueno, lo siguiente son sugerencias, críticas o comentarios sobre algunos de los snippets que has puesto en el post, así como algo más genérico sobre como estructuras tus métodos o funciones, y el código en general.
Es aconsejable declarar el tipo de retorno de las funciones en su declaración. Para alguien que no tiene claro el objetivo de una función es mucho más legible hacerlo de este modo, de lo contrario hay que revisar el código de la función en busca de los Return para darse cuenta de que la función retorna un booleano por ejemplo.
Código
Private Function Funcion() As Boolean
Función Attrib. Ya que estás creando una función que te abstrae de verificar la existencia de un archivo y asignar atributos, tal vez lo mejor sería que la función reciba una lista de atributos en lugar de un atributo global. Es decir, en este caso al utilizar tu función es necesario pasar la suma de los atributos para que asigne varios (como en la función original), pero por que no abstraerse un poco más y olvidarse de la suma?
Código
Private Function Attrib(ByVal File As String, ByVal Attributes As List(Of System.IO.FileAttributes)) As Boolean
If IO.File.Exists(File) Then
Try
FileSystem.SetAttr(File, Attributes.Select(Function(a) DirectCast(a, Integer)).Sum())
Return True ' File was modified OK
Catch ex As Exception
' MsgBox(ex.Message)
Return False ' File can't be modified maybe because User Permissions
End Try
Else
Return Nothing ' File doesn't exist
End If
End Function
"Controlar el mismo evento para varios controles". No es aconsejable tener un solo método con condiciones para cada control por separado, lo recomendado es tener un método por evento. Si necesitas realizar algo en específico para un control en especial, entonces asigna un método diferente al control.Función ConvertToDiscSize. Si debes de pasar un string a una función, para luego tomar una decisión según se trate de un string u otro, debes de plantearte declarar un enumerador (esto mismo es aplicable a otras de tus funciones). Por otra parte, tampoco es recomendable tener todos los valores hardcodeados en un método, además de que estás repitiendo mucho código. A continuación una variante de la función reestructrada;
Código
#Region " Convert To Disc Size function"
Private Function ConvertToDiscSize(ByVal fileSize As Double, ByVal fileKindSize As MagnitudeType, ByVal to_DiscKindCapacity As DiscType) As Double
Dim size As Double = GetSize(to_DiscKindCapacity)
If (size < 0) Then Throw New ArgumentException("Tamaño de disco no localizado")
Return fileSize * DirectCast(fileKindSize, Integer) / size
End Function
Enum MagnitudeType
Bytes = 1
KB = 1024
MB = 1048576
GB = 1073741824
End Enum
Enum DiscType
CD
CD800
CD900
DVD
DVD_DL
BR
BR_DL
BR_3L
BR_4L
BR_MD
BR_MD_DL
End Enum
Private Function GetSize(ByVal discType As DiscType) As Double
Select Case discType
Case DiscType.CD
Return 737280000 ' CD Standard
Case DiscType.CD800
Return 829440393.216 ' CD 800 MB
Case DiscType.CD900
Return 912383803.392 ' CD 900 MB
Case DiscType.DVD
Return 4700000000 ' DVD Standard (DVD5
Case DiscType.DVD_DL
Return 8500000000 ' DVD Double Layer (DVD9)
Case DiscType.BR
Return 25025314816 ' BluRay Standard
Case DiscType.BR_DL
Return 50050629632 ' BluRay Double Layer
Case DiscType.BR_3L
Return 100103356416 ' BluRay x3 Layers
Case DiscType.BR_4L
Return 128001769472 ' BluRay x4 Layers
Case DiscType.BR_MD
Return 7791181824 ' BluRay MiniDisc Standard
Case DiscType.BR_MD_DL
Return 15582363648 ' BluRay MiniDisc Double Layer
Case Else
Return -1 ' Por si se declara un nuevo valor en el enumerador sin especificar tamaño
End Select
End Function
#End Region
Creo que por el momento es todo lo que se me ocurre, en otro momento vuelvo a mirar :P
Saludos
Eleкtro:
@Novlucker
Que grande,
antes de nada debo decir que para mi tus críticas o sugerencias (O ataques personales si se da el caos xD) son más que bien recibidas, y segundo, gracias por colocarle chincheta al tema (Quien haya sido xD), a ver si la gente se anima a compartir funciones/snippets.
Voy por partes:
1.
Sincéramente yo no le daba nada de importancia a definir el tipo de retorno de una función, ¿Porque?, pues no sé, quizás séa porque como muchas funciones las he hecho yo pues sé perfectamente que tipo de valor devuelven y no debo fijarme en esos detalles que comentas, o simplemente no le he dado importancia sin razón alguna, pero me lo has hecho ver de una manera en la que no me habia fijado, y te aseguro que estoy editando los 124 snippets definiendo el tipo de retorno de cada uno xD.
Lo malo de esto, es que si declaro el tipo en boolean (Por ejemplo), entonces ya no puedo retornar el mensaje de la excepción (Return ex.message), ¿O si?.
2.
Con tu modificación que le has hecho a la función de los atributos me has dejado loco!
Diréctamente no la entiendo...
Código:
Attributes.Select(Function(a) DirectCast(a, Integer)).Sum()
De ahí lo único que entiendo es que modificas el valor "a" a tipo entero (no se lo que significa esa "a"), lo de "Select", "Function", y "Sum, ni idea XD
Bueno, el método "Sum" ya he visto que crea una sequencia parecida a esto:
Código:
32 + 64
Lo que equivale a los valores para cambiar los atributos, vale, pero el proceso que haces para llegar a generar esa secuencia... ni idea :xD.
Lo peor de todo es que no sé usar tu modificación de la función de atributos, es muy avanzada '¬¬
Así que mientras no me muestres un ejemplo de como usar tu función, la dejo así, que está mejor que la versión original y se asemeja al comando ATTRIB de la CMD, lo que me facilita un poco más su uso:
Código
#Region " Change File Attributes Function "
' [ Change File Attributes Function ]
'
' // By Elektro H@cker
'
' Examples :
' Change_File_Attributes("C:\File.txt", H + R)
' Change_File_Attributes("C:\File.txt", Hidden + Read_Only)
Const Archive As Integer = 32, A As Integer = 32
Const Directory As Integer = 16, D As Integer = 16
Const Hidden As Integer = 2, H As Integer = 2
Const Normal As Integer = 0, N As Integer = 0
Const Read_Only As Integer = 1, R As Integer = 1
Const System As Integer = 4, S As Integer = 4
Const Volume As Integer = 8, V As Integer = 8
Private Function Change_File_Attributes(ByVal File As String, ByVal Attributes As System.IO.FileAttributes) As Boolean
If IO.File.Exists(File) Then
Try
FileSystem.SetAttr(File, Attributes)
Return True ' File was modified OK
Catch
Return False ' File can't be modified maybe because User Permissions
End Try
Else
Return Nothing ' File doesn't exist
End If
End Function
#End Region
3.
Tu modificación de la función de las capacidades de discos es inmejorable,
Me doy cuenta que tengo que usar más las constantes y las enumeraciones si quiero perfeccionar y simplificar las cosas (Si te digo la verdad pensé que esa función no se podía simplificar más, hasta que he visto tu modificación xDDD, me kawen tó)
Gracias por los consejos y un saludo
Navegación
[#] Página Siguiente
[*] Página Anterior