Hola,
He editado tu mensaje para añadir las etiquetas y formato adecuado al código. Observa como se resalta ahora.
Además he alterado esas horrorosas mayúsculas. No nos grites, ¡te leemos fuerte y claro! Por favor respeta las
normas (has faltado a la 2da por empezar), ten en cuenta las
sugerencias y recomendaciones para postear y ahora te voy a pedir que empieces a hacer uso de las
etiquetas.
Se que has comenzado con mal pie. No lo tomes como un castigo, simplemente es un pedido que hacemos para mantener las cosas en órden.
Veo que recién aclaras que se trata de Lazarus. En algunas cosas Lazarus es diferente a Delphi, y el truco que yo había compartido es exclusivo para Delphi.
No dispongo de demasiado tiempo en estas horas, pero en cuanto pueda veré en como asesorarte. Yo dispongo de Lazarus, en mi partición Linux,aunque no lo he tanteado suficiente.
Por lo pronto me surgen dudas. ¿Ese es tu código o lo sacaste de algún lado? Si no es tuyo, deberías indicarnos donde lo conseguiste... esto puede ayudar a determinar efectivamente de que va el problema. ¿Cuáles son exactamente los errores que te han surgido?
Por lo que estuve
consultado en la ayuda, a vista rápida, TBGRABitmap es una clase que trabaja con nivel de transparencias, por lo que no se trata del esquema RGB convencional sino que se añade el canal alfa.
El esquema interno dice que cada pixel está compuesto por 4 valores (o mejor dicho campos), rojo, azul, verde y alfa. de 4 bytes. El alfa va de 0 a 255 para indicar el nivel de transparencia. 0 es 100% trasparente, mientras que 255 es opaco (o 0% transparente).
Esto hay que tener en cuenta cuando se trabaja con los pixeles, aunque si no se toca el alfa no debiera ser problema.
El mayor problema, hasta el momento (no descarto que se me esté pasando otros), que veo en tu código es que en ningún momento incrementas el valor del puntero. para moverte al próximo pixel. Tienes comentado justamente el inc(p). Una vez que estableces el valor del canal RGB debes hacer inc(p). Es decir:
mediana:=round((p^.red+p^.green+p^.blue)/3);
p^.red:=mediana;
p^.green:=mediana;
p^.blue:=mediana;
inc(p);
El otro error que veo es que a tu for le añadiste un begin, pero no su end.
Corrige esos dos puntos y veamos como sigue.
Saludos,