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


Objetivo: 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
Perfil MP  
Objetivo: 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
Perfil MP  

Página 1 de 1


  
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
Puede descargar archivos
No puede publicar eventos en el calendario

   

Está utilizando la versión (Lo-Fi). Para ver la versión completa del foro, haga clic aquí.

Powered by Icy Phoenix based on phpBB
Design by DiDiDaDo

Página generada en:: 0.1414s (PHP: -15% SQL: 115%)
Consultas SQL: 25 - Debug off - GZIP Activado