Portal    Foro    Buscar    FAQ    Registrarse    Conectarse

Cambiar El Color De Un Píxel Si Es < O > Que Un Valor Límite

Cambiar El Color De Un Píxel Si Es < O > Que Un Valor Límite
Artículo
Responder citando    Descargar mensaje  
Mensaje Cambiar El Color De Un Píxel Si Es < O > Que Un Valor Límite 
 
Tenendo un archivo de imagen RGBA (en formato de 32 bits), compruebo el valor del color de cada uno de sus píxeles: si el valor RGBA detectado de un píxel es mayor que un valor determinado (por mí elegido), cambio el color de ese píxel a blanco:

Public Sub Form_Open()

  Dim im As Image
  Dim st As Stream
  Dim i As Integer
  Dim l, limes As Long

' El valor del color límite por mi eligido:
  limes = &FFC0C0C0&
  
  im = Image.Load("/ruta/del/archivo/imagen/RGBA")

  st = Memory im.data For Write

  For i = 0 To im.Pixels.Max * 4 Step 4
    l = CLong(Byte@(im.Data + i))
    l += CLong(Shl(CLong(Byte@(im.Data + (i + 1))), 8))
    l += CLong(Shl(CLong(Byte@(im.Data + (i + 2))), 16))
    l += CLong(Shl(CLong(Byte@(im.Data + (i + 3))), 24))

    If l > limes Then
      Write #st, Color.RGB(255, 255, 255, 255) As Integer   '  Impone el pixel blanco
    Else
      Seek #st, Seek(st) + 4
    Endif
  Next
  st.Close

  With PictureBox1
    .W = im.W
    .H = im.H
    .Image = im
  End With

End




 
última edición por vuott el Miercoles, 11 Diciembre 2019, 22:57; editado 2 veces 
vuott - Ver perfil del usuario Enviar mensaje privado  
vuott [ Martes, 10 Diciembre 2019, 22:32 ]
 


Cambiar El Color De Un Píxel Si Es < O > Que Un Valor Límite
Comentarios
Responder citando    Descargar mensaje  
Mensaje Re: Cambiar El Color De Un Píxel Si Es < O > Que Un Valor Límite 
 
Para ver qué tan rápido es el programa, encargando el ciclo y la conversión a una libreria externa .so escrita en lenguaje C.  

' void kyklos (unsigned int * img,  int wh, long int lmt)
' Ejecuta el ciclo para la verificación de píxeles.
Private Extern kyklos(img As Pointer, wh As Integer, lmt As Long) In "/tmp/kyklos"


Public Sub Form_Open()

  Dim im As Image
  Dim limes As Long
  
  Creaso()   ' Invocavi te, Domine, ut externam libreriam meam in C scriptam creaverim !
  
  limes = &FFC0C0C0&
  
  im = Image.Load("/ruta/del/archivo/imagen/RGBA")
  
  kyklos(im.Data, im.W * im.H, limes)

  With Me
   .W = im.W
   .H = im.H
  End With
  With PictureBox1
    .W = im.W
    .H = im.H
    .Image = im
  End With

End


Private Procedure Creaso()
  
  File.Save("/tmp/kyklos.c", "void kyklos(unsigned int * img, int wh, long int lmt)" &
            "\n{\n" &
            "   int c;\n" &
            "   unsigned int ff = 0xFFFFFFFF;\n\n" &
            "   for (c=0; c<wh; c++) \n" &
            "      if (*(img+c) > lmt){\n" &
            "         *(img+c) = ff;}\n" &
            "}")
            
  Shell "gcc -o /tmp/kyklos.so /tmp/kyklos.c -shared" Wait
  
End


 



 
última edición por vuott el Jueves, 12 Diciembre 2019, 21:21; editado 4 veces 
vuott - Ver perfil del usuario Enviar mensaje privado  
vuott [ Martes, 10 Diciembre 2019, 23:28 ]
Mostrar mensajes anteriores:    
 
Ocultar¡Este tema fue útil?

 

Elegir valoración:                       

Media de valoración Valoración mínima Valoración máxima Número de valoraciones
0.00 0 0 0
 
Publicar nuevo tema  Responder al tema  Página 1 de 1
 
 

Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado
Usuarios registrados conectados: Ninguno