| |
|
7231
|
Programación / .NET (C#, VB.NET, ASP) / Re: Clickar a un color
|
en: 10 Julio 2014, 09:10 am
|
Te hago la mitad del trabajo, ahora, para ubicar las coordenadas relativas a la imagen por el momento no se me ocurre el modo de hacerlo, pero algo se podrá hacer obteniendo el índice del pixel encontrado (cosa que hago) usandola en alguna fórmula aritmética con el ancho y alto de la imagen. Public Class PixelData Public Index As Integer Public Color As Color Public Coordinates As Point End Class
Friend Function GetPixelData(ByVal bmp As Bitmap) As List(Of PixelData)
If Not bmp.PixelFormat = Imaging.PixelFormat.Format24bppRgb Then Throw New Exception("PixelFormat no soportado en esta función.") End If
' Lock the bitmap's bits. Dim rect As New Rectangle(0, 0, bmp.Width, bmp.Height) Dim bmpdata As Drawing.Imaging.BitmapData = bmp.LockBits(rect, Imaging.ImageLockMode.ReadWrite, bmp.PixelFormat)
' Get the address of the first line. Dim ptr As IntPtr = bmpdata.Scan0
' Declare an array to hold the bytes of the bitmap. ' This code is specific to a bitmap with 24 bits per pixels. Dim bytes As Integer = Math.Abs(bmpdata.Stride) * bmp.Height Dim rgbValues(bytes - 1) As Byte
' Copy the RGB values into the array. Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, bytes)
' Unlock the bits. bmp.UnlockBits(bmpdata)
' Set the Data to return. Dim Pixels As New List(Of PixelData)
' Loop through each 24bpp-RGB value. For Index As Integer = 2 To rgbValues.Length - 1 Step 3
Pixels.Add(New PixelData With { .Index = Index \ 3I, .Color = Color.FromArgb(rgbValues(Index), rgbValues(Index - 1I), rgbValues(Index - 2I)), .Coordinates = Point.Empty })
Next Index
Return Pixels
End FunctionEDITO: Fórmula encontrada. Nota: Lo he testeado con una imagen a resolución 2560x1600, el retorno de datos es practicamente instantaneo, la búsqueda puede variar según lo lejos que se encuentre el pixel en la iteración. ''' <summary> ''' Stores specific pixel information of an image. ''' </summary> Friend Class PixelData ''' <summary> ''' Gets or sets the pixel index. ''' </summary> ''' <value>The pixel index.</value> Public Property Index As Integer ''' <summary> ''' Gets or sets the pixel color. ''' </summary> ''' <value>The pixel color.</value> Public Property Color As Color ''' <summary> ''' Gets or sets the pixel coordinates relative to the image. ''' </summary> ''' <value>The pixel coordinates.</value> Public Property Coordinates As Point End Class ''' <summary> ''' Returns a <c>'PixelData'</c> object containing information about each pixel of an image. ''' </summary> ''' <param name="bmp">Indicates the Bitmap image to process.</param> ''' <returns>List(Of PixelData).</returns> ''' <exception cref="System.Exception">PixelFormat unsupported.</exception> Friend Function GetPixelData(ByVal bmp As Bitmap) As List(Of PixelData) If Not bmp.PixelFormat = Imaging.PixelFormat.Format24bppRgb Then Throw New Exception("PixelFormat unsupported.") End If ' Lock the Bitmap bits. Dim bmpRect As New Rectangle(0, 0, bmp.Width, bmp.Height) Dim bmpData As Drawing.Imaging.BitmapData = bmp.LockBits(bmpRect, Imaging.ImageLockMode.ReadWrite, bmp.PixelFormat) ' Get the address of the first line. Dim Pointer As IntPtr = bmpData.Scan0 ' Hold the bytes of the bitmap into a Byte-Array. ' NOTE: This code is specific to a bitmap with 24 bits per pixels. Dim bmpBytes As Integer = (Math.Abs(bmpData.Stride) * bmpRect.Height) Dim rgbData(bmpBytes - 1) As Byte ' Copy the RGB values into the array. Runtime.InteropServices.Marshal.Copy(Pointer, rgbData, 0, bmpBytes) ' Unlock the Bitmap bits. bmp.UnlockBits(bmpData) ' Instance the object to return. Dim Pixels As New List(Of PixelData) ' Loop through each 24bpp-RGB value. For rgbIndex As Integer = 2 To rgbData.Length - 1 Step 3 ' Get the pixel values. Dim PixelIndex As Integer = rgbIndex \ 3I Dim PixelCoordX As Integer = PixelIndex Mod bmpRect.Width Dim PixelCoordY As Integer = (PixelIndex - PixelCoordX) \ bmpRect.Width Dim PixelColorR As Short = rgbData(rgbIndex) Dim PixelColorG As Short = rgbData(rgbIndex - 1I) Dim PixelColorB As Short = rgbData(rgbIndex - 2I) ' Set the pixel Data. Dim Pixel As New PixelData With Pixel .Index = PixelIndex .Color = Color.FromArgb(PixelColorR, PixelColorG, PixelColorB) .Coordinates = New Point(PixelCoordX, PixelCoordY) End With ' Add the PixelData into the list. Pixels.Add(Pixel) Next rgbIndex Return Pixels End Function
Ejemplo de uso: Public Sub Test() Handles Button1.Click ' Create a new bitmap. Dim bmp As Bitmap = Bitmap.FromFile("Imagen de la pantalla.bmp", False) ' Specify the RGB PixelColor to search. Dim FindColor As Color = Color.FromArgb(255, 174, 201) ' Get the pixel data. Dim Pixels As List(Of PixelData) = Me.GetPixelData(bmp) ' Loop through each pixel. For Each Pixel As PixelData In Pixels If Pixel.Color.Equals(FindColor) Then Dim sb As New System.Text.StringBuilder With sb .AppendLine(String.Format("Index: {0}", CStr(Pixel.Index))) .AppendLine(String.Format("Color: {0}", Pixel.Color.ToString)) .AppendLine(String.Format("Coord: {0}", Pixel.Coordinates.ToString)) MessageBox.Show(.ToString, "Pixel Search") .Clear() End With End If Next Pixel End Sub
Saludos
|
|
|
|
|
7232
|
Informática / Hardware / Re: ¿ Cooler bueno, económico, y silencioso para CPU AMD Socket AM3+ ?
|
en: 9 Julio 2014, 14:58 pm
|
Bueno, necesitaba una respuesta rápida (por miedo a que el problema fuese a mayores) y como no he podido obtener la ayuda que necesitaba, ya me respondo a mi mismo. Al final, basandome en los comentarios de varios productos, he decidido comprado un Cooler Master Hyper 212 EVO.  Me podría haber permitido comprar un Cooler más caro, pero sin haber obtenido una opinión experta pues...tampoco voy a arriesgarme sin saber si hacia bien o mal, lo caro no siempre resulta mejor. PD: Si alquien quiere que le cuente mi experiencia sobre el producto, después de haberlo instalado, que lo comente y con gusto le describiré los detalles. Saludos!
|
|
|
|
|
7233
|
Informática / Hardware / Re: Duda pasta térmica
|
en: 9 Julio 2014, 14:49 pm
|
alguna vez has tenido que leer algo parecido a lo que preguntabas. Es posible, pero a aquello que creemos que no necesitamos aprender, o que directamente no nos interesa leer pues no le hacemos mucho caso y se olvida... Además, yo no navego por los sub-foros de Hardware ni leo preguntas de ese estilo porque se que no puedo aportar ninguna ayuda. PD: Gracias por decirme como limpiar la pasta, porque ya iba a preguntarlo xD. Saludos!
|
|
|
|
|
7234
|
Informática / Hardware / Re: Duda pasta térmica
|
en: 9 Julio 2014, 14:31 pm
|
¿De que alturas estás hablando?, me doy cuenta que he sido un poco cazurro al hacer una pregunta tan básica (para quien sepa, claro), pero no lo veo motivo de burla, nunca se me ha dado bien el tema de Hardware, y simplemente me da miedo estropear un material tan... "sensible". Gracias @ engel lex y @ SimorgSaludos!
|
|
|
|
|
7235
|
Informática / Hardware / Duda pasta térmica
|
en: 9 Julio 2014, 12:37 pm
|
|
Hola
Tengo una duda muy básica, ¿la paste térmica, se pone encima de la pasta ya existente?, ¿sin más?.
Es decir, yo me he comprado un AMD que tiene su pasta térmica puesta ya de serie (como es obvio xD) con su ventilador y tal encima, bien, yo me he comprado un ventildor para reemplazar el de serie, que además trae pasta térmica, y yo sé desanclar y montar un ventilador de CPU, pero no se nada al respecto de la pasta térmica, osea de la capa blanca del disipador (porque pasta térmica / disipador es lo mismo no?), ¿es tan sencillo como echar una capa por encima de la pasta que ya trae puesta el chipset?, ¿y como cuanta cantidad de debe poner?, no la quiero cagar, vaya, ¿pasaría algo grave si pongo demasiada pasta sin querer?.
Necesito palabras textuales que me aclaren esta duda, pero además de esto me gustaria que alguien pudiera compartir un video donde enseñen el montaje correcto de la pasta térmica (fotos no, porfavor, que ya vi unas cuantas y sigo sin aclararme).
Gracias por leer, Esaludos!
|
|
|
|
|
7236
|
Programación / .NET (C#, VB.NET, ASP) / Re: Texto en richtextbox
|
en: 9 Julio 2014, 11:38 am
|
Hay que tener en cuenta que el método sugerido por @ engel lex, " ScrollToCaret", como su propio nombre indica lo único que hace es deslizar el ScrollBar hasta la posición del Caret (el Caret es el cursor de texto) así que usarlo por si solo no sería una solución viable según que caso, ya que si no modificas la posición del Caret, siempre va a escrollear a la misma posición Si estás usando el método "AppendText" para adjuntar texto: RichTextBox1.AppendText("Texto")
Entonces una llamada a "ScrollToCaret" será suficiente, porque el método "AppendText", además de adjuntar texto, pone la posición del Caret al final del texto adjuntado. Por otro lado, si estás adjuntando texto de esta manera: RichTextBox1.Text &= "Texto"
Entonces necesitas modificar manualmente la posición del Caret, para poder Scrollear hacia abajo. Por eso, según el caso, te sugiero una de las siguientes soluciones, aunque de todas formas la última solución deberías evitarla siempre que puedas, ya que lo correcto es usar el método " AppendText": · .AppendText: Private Sub RichTextBox_AutoScroll(ByVal sender As Object, ByVal e As EventArgs) _ Handles RichTextBox1.TextChanged If CBool(sender.TextLength) Then sender.ScrollToCaret() End If End Sub
· .Text &= Private Sub RichTextBox_AutoScroll(ByVal sender As Object, ByVal e As EventArgs) _ Handles RichTextBox1.TextChanged Dim _TextLength As Integer = sender.TextLength With sender If CBool(_TextLength) Then .SelectionStart = _TextLength .ScrollToCaret() End If End With End Sub
Nota: Obviamente, si piensas escribir manualmente en el Control, entonces la solución con el método ".Text &=" de poco sirve. ya que estoy enviando el Caret al final del texto, siempre. Saludos
|
|
|
|
|
7237
|
Programación / .NET (C#, VB.NET, ASP) / Re: Enviar texto de un richtextbox a un e-mail
|
en: 8 Julio 2014, 22:45 pm
|
No especificas muchos datos, ni si pretendes abrir el cliente de correo predeterminado, o si lo quieres enviar usando solo código, ni con que servicio de correo POP3 o SMTP... Ejemplo: ' GMailSender("Username@Gmail.com", "Password", "Email Subject", "Message Body", "Destiny@Address.com") Private Function GMailSender(ByVal sername As String, ByVal Password As String, ByVal Subject As String, ByVal Body As String, ByVal DestinyAddress As String) As Boolean Try Dim MailSetup As New System.Net.Mail.MailMessage MailSetup.Subject = Subject MailSetup.To.Add(DestinyAddress) MailSetup.From = New System.Net.Mail.MailAddress(Username) MailSetup.Body = Body Dim SMTP As New System.Net.Mail.SmtpClient("smtp.gmail.com") SMTP.Port = 587 SMTP.EnableSsl = True SMTP.Credentials = New Net.NetworkCredential(Username, Password) SMTP.Send(MailSetup) Return True ' Email is sent OK Catch ex As Exception Throw New Exception(ex.Message) End Try End Function
En C#: http://converter.telerik.com/Saludos.
|
|
|
|
|
7239
|
Programación / .NET (C#, VB.NET, ASP) / Re: REDUCIR CÓDIGO.NET
|
en: 8 Julio 2014, 09:04 am
|
1. No estás liberando el FolderBrowserDialog que instancias. Private Sub btnexaminar_Click(sender As Object, e As EventArgs) Handles btnexaminar.Click Using Dir As New FolderBrowserDialog If Dir.ShowDialog = DialogResult.OK Then TextBox1.Text = Dir.SelectedPath End If End Using End Sub
2. Reducción de código de Botones: Private CMDThread As Threading.Thread = Nothing Friend ReadOnly Property MiDirectorio As String Get Return TextBox1.Text End Get End Property Private Sub btndat_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btndat.Click Me.CMDThread = New Threading.Thread(AddressOf Me.CMDAutomate) Me.CopyFile("C:\Program Files\convert data\runpkr00.exe", IO.Path.Combine(Me.MiDirectorio, "\runpkr00.exe")) CMDThread.Start() End Sub Private Sub btnrinex_Click(sender As Object, e As EventArgs) Handles btnrinex.Click Me.CMDThread = New Threading.Thread(AddressOf Me.CMDAutomaterin) Me.CopyFile("C:\Program Files\convert data\teqc.exe", IO.Path.Combine(Me.MiDirectorio, "\teqc.exe")) Me.CMDThread.Start() End Sub Private Sub btntqc_Click(sender As Object, e As EventArgs) Handles btntqc.Click Me.CMDThread = New Threading.Thread(AddressOf Me.CMDAutomateqc) Me.CopyFile("C:\Program Files\convert data\teqc.exe", IO.Path.Combine(Me.MiDirectorio, "\teqc.exe")) Me.CMDThread.Start() End Sub Private Sub CopyFile(ByVal sourcefile As String, ByVal destinationfile As String) If String.IsNullOrEmpty(Me.MiDirectorio) Then MessageBox.Show("Debe seleccionar la ruta donde se encuentra la data", "Error", MessageBoxButtons.OKCancel, MessageBoxIcon.Error) Else My.Computer.FileSystem.CopyFile(sourcefile, destinationfile, FileIO.UIOption.OnlyErrorDialogs, FileIO.UICancelOption.DoNothing) End If End Sub
3. Reducción de código de Procesos Eliminar todo esto repetido: Dim myprocess As New Process Dim StartInfo As New System.Diagnostics.ProcessStartInfo StartInfo.FileName = "cmd" StartInfo.RedirectStandardInput = True StartInfo.RedirectStandardOutput = True StartInfo.UseShellExecute = False StartInfo.CreateNoWindow = True myprocess.StartInfo = StartInfo por: Friend MyProcess As New Process With { .StartInfo = New ProcessStartInfo With { .FileName = "cmd", .RedirectStandardInput = True, .RedirectStandardOutput = True, .UseShellExecute = False, .CreateNoWindow = True } }
PD: Aun se puede simplificar más, tanto los botones como las tareas de los threads, pero creo que con eso ya te basta  . Saludos
|
|
|
|
|
|
| |
|