elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


  Mostrar Mensajes
Páginas: 1 [2] 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ... 221
11  Informática / Software / Re: Quitar marca de agua pdf escaneado en: 26 Mayo 2024, 14:12 pm
Puedes subir una muestra para verla?, al menos unas cuantas páginas para hacer las pruebas ahí.

Depende mucho de como esté, por ejemplo si es un escaneado al que después se le ha puesto una marca de agua lo tienes más sencillo porque solo es seleccionar y eliminar las marcas de agua, Acrobat tiene herramientas para seleccionar e eliminar objetos en todas las hojas cuando cumplen ciertas propiedades que puedes especificar como tamaño, fuente, color, etc

Si todo está escaneado va a depender de cuan aislado esté la marca de agua para que no afecto lo que tenga debajo, al usar OCR puede separar el escaneado en capas u objetos para poder quitar las marcas de agua pero podría ser más laborioso dependiendo de cuan aislado estén.

En todo caso siempre puedes eliminar manualmente hoja por hoja ya sea seleccionando el objeto y eliminando o editando la imagen que tiene la marca de agua, por ejemplo a mi me a tocado editarlas con Photoshop algunas veces

En Word también puedes seleccionar objetos mediante su panel de selección, o remover marcas de agua en el archivo en sí abriéndolo con WinRAR o 7zip y eliminando/cambiando las marcas de agua
12  Programación / Programación General / Re: El OR y AND a nivel de bits ¿sólo conviene usarlo para agilizar procesos? en: 24 Mayo 2024, 01:32 am
Citar
Bien, pero entonces, teniendo especialmente en cuenta que es más ágil si todo está en una variable ¿no sería más mejor hacelo así:

Código
  1. HabilidadesDePersonaje = 0101;
  2. // El 1er caracter indica si puede planear.
  3. // El 2ndo indica si puede atacar.
  4. // El 3ero si puede correr.
  5. // 4to si puede saltar.

Si es exactamente como dices y tal cual pasó con mi ejemplo con Array. PERO cuidado con como le das los números a Flash, 0101 para Flash es 65 porque cualquier número que le des que empiece con 0 implica que está en Base 8 (Octal), si lo vas a usar como String lo tendría que poner entre comillas: "0101", pero como vas a trabajar con números puedes darle directamente 5 que es el binario 0101 pasado a base 10 (Decimal, lo normal)

- Para no perder legibilidad puede ser conveniente comentar o poner el binario pero con su debida forma, dado que no he visto que haya forma de darle binarios literales a Flash como si se puede con Hexadecimal: 0x5, octal: 05, o decimal: 5, se puede utilizar parseInt:


Código
  1. HabilidadesDePersonaje = parseInt("0101", 2);
  2. // El 1er caracter indica si puede planear.
  3. // El 2ndo indica si puede atacar.
  4. // El 3ero si puede correr.
  5. // 4to si puede saltar.
[/quote]


Citar
? O sea 1 sola variable. Los ifs no sé cómo se harían, yo usaría CharAt pero, quizá por eso no es más ágil, otra manera sería con << o >> (no recuerdo).

Puedes usar cualquier técnica para obtener una posición en particular, si trabajas con String es más conveniente usar charAt o subString, si trabajas con números puedes usar matemática (división entera + residuo entero), pero como andamos con binarios puede llegar a ser mejor usar operadores binarios, como dice se puede usar los desplazamientos para aislar un bit PERO debes estar consiente en el tamaño en bits de la variable, es decir, que la variable sea el binario 0101 implica que para Flash en realidad tienes (por legibilidad lo voy a separar cada cuatro bits pero obviamente es todo junto):

0000 0000 0000 0000 0000 0000 0000 0101

Esto es porque Flash el tamaño de una variable numérica es de 32 bits por eso mismo solo puedes desplazar 0 a 31 posiciones, pues bien, si quiero aislar el tercer bit que corresponde a que si el jugador puede o no atacar (esto si leemos de izquierda a derecha 0101, pero como vez puede llegar a confundirse por lo que siempre es mejor leer de derecha a izquierda en binario, ten esto en consideración), basta con hacer tres desplazamientos, uno para quitar los bits de la derecha, otro para los de la izquierda y otro para regresarlo a su sitio, la parte de regresarlo a su sitio es opcional si solo quieres comprobar si vale diferente a 0, pero si quisieras recuperar el número que representa el binario de atacar: 0100 si lo tendrías que hacer

   0000 0000 0000 0000 0000 0000 0000 0101 >> 2
=  0000 0000 0000 0000 0000 0000 0000 0001

   0000 0000 0000 0000 0000 0000 0000 0001 << 31
1000 0000 0000 0000 0000 0000 0000 0000

   1000 0000 0000 0000 0000 0000 0000 0000 >> (31 - 2)
=  0000 0000 0000 0000 0000 0000 0000 0100


Es algo tedioso hacerlo así, mejor es usar And tal cual se muestra en los ejemplos anteriores porque es hasta más legible ya que usas binarios que se representan por sí mismos: atacar = 0100

   0000 0000 0000 0000 0000 0000 0000 0101 &
                                      0100
=  0000 0000 0000 0000 0000 0000 0000 0100


En ActionScript sería:

Código
  1. HabilidadesDePersonaje = parseInt("0101", 2);
  2. // El 1er caracter indica si puede planear.
  3. // El 2ndo indica si puede atacar.
  4. // El 3ero si puede correr.
  5. // 4to si puede saltar.
  6.  
  7. // HabilidadesDePersonaje & parseInt("0100", 2) resulta el binario 0100
  8. // y como es diferente de 0 evalúa a True o Verdadero, es una forma de abreviar en lugar de poner: == true
  9. if ( HabilidadesDePersonaje & parseInt("0100", 2) ) {
  10.  trace("El personaje puede Atacar");
  11. } else {
  12.  trace("El personaje no puede Atacar");
  13. }


Citar
Lo que veo ahora que no había visto es que cuando crea la 5ta no está usando las 4, por eso le da false la habilidad de planear.

Más o menos entendí, pero sigo sin verle mucho sentido, usa 5 variables cuando podría usar 4 o sólo 1.

Nunca usa 4 o 5 variables, como ya expliqué en realidad para Flash una variable numérica tiene 32 bit, tu puedes manejarte con hasta esa cantidad de bits, los ceros de la izquierda los puedes omitir pero Flash ya los rellenará con ceros hasta completar 32 bits, solo ten muy presente que es mejor usar los bits de derecha a izquierda para que todo esto no te afecte o confunda, o especificar el binario completo donde si sería más real el poner:

Código
  1. HabilidadesDePersonaje = parseInt("01010000000000000000000000000000", 2);
  2. // El 1er caracter indica si puede planear.
  3. // El 2ndo indica si puede atacar.
  4. // El 3ero si puede correr.
  5. // 4to si puede saltar.

Lo mejor es:

Código
  1. HabilidadesDePersonaje = parseInt("0101", 2);
  2. // El último bit indica si puede planear.
  3. // El penúltimo si puede atacar.
  4. // El  antepenúltimo si puede correr.
  5. // El tras antepenúltimo si puede saltar.

O poner mejor aún poner: El 1er bit desde la derecha, El 2do bit desde la derecha, etc

Todo lo estoy poniendo con parseInt para que sea más legible los bits pero en también puedes usar sus correspondientes números en cualquier otra base porque son exactamente lo mismo tal cual está en los ejemplos anteriores de ChatGPT:

Código
  1. // Definición de habilidades del personaje
  2. //HABILIDAD_SALTO = 1     Salto: 0001 en binario
  3. //HABILIDAD_CORRER = 2   Correr: 0010 en binario
  4. //HABILIDAD_ATACAR = 4    Atacar: 0100 en binario
  5. //HABILIDAD_PLANEAR = 8   Planear: 1000 en binario
  6.  
  7. //Podrá Saltar y Atacar (1 + 4)
  8. HabilidadesDePersonaje = 5;
  9.  
  10. if ( HabilidadesDePersonaje & 4 ) {
  11.  trace("El personaje puede Atacar");
  12. } else {
  13.  trace("El personaje no puede Atacar");
  14. }
13  Programación / Programación General / Re: El OR y AND a nivel de bits ¿sólo conviene usarlo para agilizar procesos? en: 20 Mayo 2024, 15:30 pm
Citar
No entiendo ¿no es más fácil algo como:
HABILIDAD_SALTO = true
HABILIDAD_CORRER = true
HABILIDAD_ATACAR = true
HABILIDAD_PLANEAR = false
Si HABILIDAD_SALTO == true
  puede saltar
etc? O en vez de true/false, "Sí"/"No", 1/0, etc.

Fácil de entender por su legibilidad si es.

Citar
Yo quiero aprender eso del or y and si es algo que no se puede hacer de otro modo o resulta mucho más fácil hacerlo así. Si es por agilizar procesos, entiendo que es importante pero por ahora paso.

A un número le puedo sumar otro, eso es útil y difícilmente insustituible.

El or viene a decir que a 2 binarios los puedo transformar en 1, uno tiene más probabilidad de tener 1s ¿pero eso para qué sirve?

Capaz que los ejemplos que me dió son incorrectos, imagino que si se tienen 2 cosas a comparar, con muchas variables, en vez de hacer:
SumaDe1 = Objeto1TieneCuello+Objeto1TieneManos+Objeto1TienePiernas
SumaDe2 = Objeto2TieneCuello+Objeto2TieneManos+Objeto2TienePiernas
Si SumaDe1 == SumaDe2
  los objetos son iguales
...
usando or se podría hacer la comparación sin sumar ni usar 3 ifs ¿puede ser?

ChatGPT te ha respondido bien y dado buenos ejemplos, quizá solo falte algo de conceptos teóricos para aplicarlos en la práctica.

No creo que haya problemas de agilidad porque son procesos muy simples, al final será ínfimamente más ágil aquel que se acerque más al juego de instrucciones del procesador de forma más simplificada, y claro, tener todo en una sola variable simple siempre tomará menos recursos.

- Y justo ahí está su beneficio, puedes mandar o trabajar con una sola variable que a nivel bit tenga varios estados o variables simples como muestra ChatGPT en su último ejemplo.

Aunque ChatGPT ya mostró el funcionamiento en la práctica de OR, AND y los desplazamientos puede que en otros lados te muestren las famosas tablas de verdad de OR y AND para que las memorices, o si quieres el "truco" el OR es como sumar y el AND es como multiplicar:

A:    11001010 +
B:    10110111
-----------------
A|B: 11111111

1 + 1 = 2, pero como en binario no puedes escribir literalmente 2 pondrías 1 y llevarías 1 PERO como esto es una operación OR donde se opera bit a bit lo que llevas se pierde (como si solo existiera una cifra posible), como es un "truco" tiene esas restricciones. Si por el contrario quieres usar la Tabla de verdad OR implica que el resultado será 1 (verdadero) si al menos uno de los bits a comparar es 1, también es correcto decir que el resultado será 0 (falso) si ambos bit a operar son también 0. Todo esto es tal cual sucede en la programación real con OR:

if (true || true) // true
if (true || false) // true
if (false || true) // true
if (false || false) // false

En caso de AND

A:     11001010 *
B:     10110111
------------------
A&B: 10000010

- Acá es más fácil, 1 * 1 = 1, 1 * 0 = 0, 0 * 1 = 0, solo da 1 (verdadero) si ambos bit son 1, resulta 0 en cualquier otro caso. En programación:

if (true && true) // true
if (true && false) // false
if (false && true) // false
if (false && false) // false

---

Citar
Código
  1. python
  2. # Definición de habilidades del personaje
  3. HABILIDAD_SALTO = 1     # Salto: 0001 en binario
  4. HABILIDAD_CORRER = 2    # Correr: 0010 en binario
  5. HABILIDAD_ATACAR = 4    # Atacar: 0100 en binario
  6. HABILIDAD_PLANEAR = 8   # Planear: 1000 en binario
  7.  
  8. # Habilidades del personaje
  9. habilidades_personaje = HABILIDAD_SALTO | HABILIDAD_CORRER | HABILIDAD_ATACAR
  10.  
  11. # Verificación de habilidades
  12. if habilidades_personaje & HABILIDAD_SALTO:
  13.    print("El personaje puede saltar.")
  14.  
  15. if habilidades_personaje & HABILIDAD_CORRER:
  16.    print("El personaje puede correr.")
  17.  
  18. if habilidades_personaje & HABILIDAD_ATACAR:
  19.    print("El personaje puede atacar.")
  20.  
  21. if habilidades_personaje & HABILIDAD_PLANEAR:
  22.    print("El personaje puede planear.")
  23. else:
  24.    print("El personaje no puede planear.")
  25.  

Bien, esta es una aplicación práctica porque se usa una sola variable "habilidades_personaje" para englobar otras ya que a nivel bit tiene reservadas posiciones para guardar/obtener dichas variables.

Código
  1. # Habilidades del personaje
  2. habilidades_personaje = HABILIDAD_SALTO | HABILIDAD_CORRER | HABILIDAD_ATACAR

- Esto está sumando las habilidades, recordar que se está trabajando a nivel bit y que estos bits no están interfiriendo con otros

Código
  1. # Definición de habilidades del personaje
  2. HABILIDAD_SALTO = 1     # Salto:   0001 en binario
  3. HABILIDAD_CORRER = 2    # Correr:  0010 en binario
  4. HABILIDAD_ATACAR = 4    # Atacar:  0100 en binario
  5. HABILIDAD_PLANEAR = 8   # Planear: 1000 en binario

- Si los sumas o aplicas OR cada uno está en su columna sin molestar al vecino, si por ejemplo solo quiero que Salte y Ataque:

HABILIDAD_SALTO:     0001 // 1
HABILIDAD_ATACAR:   0100 // 4
habilidades_personaje: 0101 // 5

Ahora solo toca obtener el valor, para eso basta con revisar bit a bit, ya sabemos que el último bit de la derecha indica si puede o no puede saltar, el segundo si puede o no correr, el tercero si puede o no atacar, y el cuarto si puede o no planear. Lo puedes convertir en String y usar CharAt o SubString pero como estamos trabajando en binario usaremos operadores binarios:

Código
  1. # Verificación de habilidades (0 es False, cualquier otro valor es True)
  2. if habilidades_personaje & HABILIDAD_SALTO:
  3.    # 0101 * // 5 (habilidades_personaje)
  4.    # 0001   // 1 (HABILIDAD_SALTO)
  5.    # 0001   // 1 (verdadero)
  6.    print("El personaje puede saltar.")
  7.  
  8. if habilidades_personaje & HABILIDAD_CORRER:
  9.    # 0101 * // 5 (habilidades_personaje)
  10.    # 0010   // 2 (HABILIDAD_CORRER)
  11.    # 0000   // 0 (falso)
  12.    print("El personaje puede correr.")
  13.  
  14. if habilidades_personaje & HABILIDAD_ATACAR:
  15.    # 0101 * // 5 (habilidades_personaje)
  16.    # 0100   // 1 (HABILIDAD_ATACAR)
  17.    # 0100   // 5 (verdadero)
  18.    print("El personaje puede atacar.")
  19.  
  20. if habilidades_personaje & HABILIDAD_PLANEAR:
  21.    # 0101 * // 5 (habilidades_personaje)
  22.    # 1000   // 2 (HABILIDAD_PLANEAR)
  23.    # 0000   // 0 (falso)
  24.    print("El personaje puede planear.")
  25. else:
  26.    print("El personaje no puede planear.")

- Y mira que es interesante que la operación AND te devuelve la Habilidad que estás consultando, así que estás recuperando el valor de la variable, en otros casos devuelve siempre ceros: 0 (False)

---

Bueno, todo esto es trabajar a nivel bit, pero también puedes trabajarlo a nivel variables como pusiste tú:

Citar
HABILIDAD_SALTO = true
HABILIDAD_CORRER = true
HABILIDAD_ATACAR = true
HABILIDAD_PLANEAR = false
Si HABILIDAD_SALTO == true

O utilizar un Array que más o menos se acerca en concepto al nivel bit, más legible pero aparentemente más complejo XD:

Código
  1. HABILIDAD_SALTO = 0;
  2. HABILIDAD_CORRER = 1;
  3. HABILIDAD_ATACAR = 2;
  4. HABILIDAD_PLANEAR = 3;
  5. habilidades_personaje = new Array();
  6.  
  7. habilidades_personaje[HABILIDAD_SALTO] = true;
  8. habilidades_personaje[HABILIDAD_CORRER] = true;
  9. habilidades_personaje[HABILIDAD_ATACAR] = true;
  10. habilidades_personaje[HABILIDAD_PLANEAR] = false;
  11.  
  12. if (habilidades_personaje[HABILIDAD_SALTO] == true) {
  13.  // ...
  14. }

- O si quieres simplificar:

Código
  1. // habilidades_personaje = [0] HABILIDAD_SALTO, [1] HABILIDAD_CORRER, [2] HABILIDAD_ATACAR, [3] HABILIDAD_PLANEAR]
  2. habilidades_personaje = [true, true, true, false];
  3.  
  4. if (habilidades_personaje[0] == true) {
  5.  // ...
  6. }

También puedes crear un "Objeto" en ActionSript 1.0, aunque ya sería demasiado para algo tan simple:

Código
  1. function habilidades_personaje(saltar, correr, atacar, planear) {
  2.  this.HABILIDAD_SALTO = saltar;
  3.  this.HABILIDAD_CORRER = correr;
  4.  this.HABILIDAD_ATACAR = atacar;
  5.  this.HABILIDAD_PLANEAR = planear;
  6. }
  7.  
  8. var habilidades_Pepito = new habilidades_personaje(true, true, true, false);
  9. var habilidades_Jaimito = new habilidades_personaje(false, true, true, false);
  10.  
  11. if (habilidades_Pepito.HABILIDAD_SALTO == true) {
  12.  trace("Pepito puede saltar");
  13. } else {
  14.  trace("Pepito no puede saltar");
  15. }
  16.  
  17. if (habilidades_Jaimito.HABILIDAD_SALTO == true) {
  18.  trace("Jaimito puede saltar");
  19. } else {
  20.  trace("Jaimito no puede saltar");
  21. }
  22.  
  23.  
  24. habilidades_Pepito.HABILIDAD_SALTO = false;
  25. habilidades_Jaimito.HABILIDAD_SALTO = true;
  26.  
  27. if (habilidades_Pepito.HABILIDAD_SALTO == true) {
  28.  trace("Pepito puede saltar");
  29. } else {
  30.  trace("Pepito no puede saltar");
  31. }
  32.  
  33. if (habilidades_Jaimito.HABILIDAD_SALTO == true) {
  34.  trace("Jaimito puede saltar");
  35. } else {
  36.  trace("Jaimito no puede saltar");
  37. }
  38.  

- Devuelve:

Citar
Pepito puede saltar
Jaimito no puede saltar
Pepito no puede saltar
Jaimito puede saltar
14  Sistemas Operativos / Windows / Re: No consigo hacer funcionar una tarea programada en: 14 Mayo 2024, 14:23 pm
1. Revisa que exista la ruta: HKEY_CLASSES_ROOT\PackagedCom\ClassIndex\{ZZ95F097-EB96-453B-B4E6-1613637F3B14} y que tienes permisos para modificarla, has la prueba poniéndole un _ delante del nombre (_{ZZ95F097-EB96-453B-B4E6-1613637F3B14}) y luego lo vuelves a dejar como estaba, en mi Windows no tengo esa ruta

2. Supongo que habrás probado tu archivo.reg o que esté bien formateado, vi que pusiste que contenía:

[-HKEY_CLASSES_ROOT\PackagedCom\ClassIndex\{ZZ95F097-EB96-453B-B4E6-1613637F3B14}]

Pero también debe incluir como primera línea:

Windows Registry Editor Version 5.00

3. ¿Qué has puesto en?:



Si has puesto directamente el archivo .reg tal cual no va a funcionar porque ejecutar un .reg implica llamar a RegEdit.exe y este siempre pregunta si estás seguro de cargar el .reg o no, y como tu tarea está siendo ejecutada por SYSTEM y está marcada como oculta no verás el mensaje, tienes varias opciones pero para no cambiar mucho puedes hacer lo siguiente:

En Programa o Script pon:
RegEdit.exe

En Agregar argumentos pon:
/S "D:\Mi Biblioteca\Trucos\Sistemas operativos\Windows\archivo.reg"

No sé la ruta completa de tu archivo.reg, debes asegurarte que la parte entre comillas esté bien

---
Otra opción para no depender de un .reg ya que es muy sencillo lo que hace es:

En Programa o Script pon:
Reg.exe

En Agregar argumentos pon:
Delete HKCR\PackagedCom\ClassIndex\{ZZ95F097-EB96-453B-B4E6-1613637F3B14} /F

Con eso no necesitas un archivo.reg, sino que directamente llamas a Reg.exe y le dices que elimine la clave especificada sin preguntar nada más

---
Si no funciona lo anterior y lo has hecho todo bien, ya pueden ser problemas de permisos, algunas claves están protegidas y requieren permisos de Trusted Installer, pero de momento prueba hasta acá
15  Sistemas Operativos / Windows / Re: No consigo hacer funcionar una tarea programada en: 14 Mayo 2024, 13:00 pm
Sube las imágenes a un servidor público como https://es.imgbb.com/ o https://postimages.org/ para poder verlas

Si quieres ejecutar un .reg necesitas permisos de administrador, por lo que tiene que estar marcada esa opción, si el .reg hace cambios en claves de un usuario en específico debes ejecutar el .reg especificando ese usuario y contraseña
16  Programación / Programación General / Re: ¿Cómo promediar 2 colores? en: 14 Mayo 2024, 00:27 am
Si le quieres dar una aproximación más matemática puedes partir de este ejemplo en base 10 (lo normal):

iColor1 = 123456;

Si quisieras despejar 12 bastaría con dividirlo entre 10000, quedando 12.3456 y a esto le quitamos la parte decimal convirtiéndolo a entero = 12

Para despejar 34 hay que dividirlo entre 100, quedando 1234.56, luego lo convertimos a entero para obtener 1234, y por último obtenemos el módulo (residuo entero) entre 100 para conseguir 34

Para despejar 56 basta con obtener el módulo entre 100, quedando 56

Bien, pero esto que hemos hecho es con base 10, pero tú quieres trabajar con un valor hexadecimal, podrías convertirlos a decimal y trabajarlos así pero también lo puedes trabajar directo en hexadecimal sin complicaciones y sin perder legibilidad:

iColor1 = 0xAABBCC;

Si quisieras despejar 0xAA bastaría con dividirlo entre 0x10000

Para despejar 0xBB hay que dividirlo entre 0x100, quedando 0xAABB, luego obtenemos el módulo (residuo entero) entre 0x100 y obtenemos 0xBB

Para despejar 0xCC basta con obtener el módulo entre 0x100

Código
  1. iColor1 = 0xAABBCC;
  2.  
  3. iR1 = parseInt(iColor1 / 0x10000);
  4. iG1 = parseInt(iColor1 / 0x100) % 0x100;
  5. iB1 = iColor1 % 0x100;
  6.  
  7. sColorHex = iR1.toString(16) + iG1.toString(16) + iB1.toString(16);
  8.  
  9. trace(sColorHex);

Esto devuelve:

Código
  1. aabbcc

El código completo para esta solución sería:

Código
  1. iColor1 = 0xCC0000;
  2. iColor2 = 0xCCCCCC;
  3.  
  4. iR1 = parseInt(iColor1 / 0x10000);
  5. iG1 = parseInt(iColor1 / 0x100) % 0x100;
  6. iB1 = iColor1 % 0x100;
  7.  
  8. iR2 = parseInt(iColor2 / 0x10000);
  9. iG2 = parseInt(iColor2 / 0x100) % 0x100;
  10. iB2 = iColor2 % 0x100;
  11.  
  12. iPromR = (iR1 + iR2) / 2;
  13. iPromG = (iG1 + iG2) / 2;
  14. iPromB = (iB1 + iB2) / 2;
  15.  
  16. trace(iPromR + ", " + iPromG + ", " + iPromB);
  17.  
  18. sColorPromHex = iPromR.toString(16) + iPromG.toString(16) + iPromB.toString(16);
  19. trace(sColorPromHex);

Obteniendo:

Código
  1. 204, 102, 102
  2. cc6666

---
La solución por el método binario te lo propuso ChatGPT pero para que te sea legible debes saber como funcionan internamente los operadores de desplazamiento binario y And binario, o al menos su equivalencia matemática, eso lo estaba explicando Serapis, te darás cuenta que es similar al método matemático que pasé antes, salvo que yo uso parseInt para deshacerme de los decimales y módulo para quitar números de la izquierda
17  Programación / Programación General / Re: ¿Cómo promediar 2 colores? en: 12 Mayo 2024, 21:31 pm
Citar
Si digo CC0000, es decir 204, 0, 0
y
CCCCCC, es decir 204, 204, 204
el resultado debe ser
204, 102, 102

Entiendo que debo convertir el hexadecimal a decimal y luego hacer promedios.

Citar
¿Por qué "0x"+ convierte a hexadecimal tan fácil? ¿es como una función (Number, toString, etc)?

Depende de como tomes el dato, por ejemplo CC0000 dará error porque para flash eso no es un número por lo que entenderá que es un nombre de variable que seguramente tampoco lo sea, para que Flash entienda que es un número debería ser: 0xCC0000, entonces Flash entenderá que le diste un número hexadecimal, si le das "CC0000" entenderá que es un String o Texto, en ambos no es que estás convirtiendo, solo le estás entregando los valores correctamente para que Flash lo entienda.

Citar
Siempre me costó entender esas pistas, y este código claro que tampoco lo entiendo.

Ese es código Action Script 2 o 3 por lo que se está usando declaración de variables tipadas especificando el tipo de variable (variable:String, variable:Number), se escribe la variable o función seguido de dos puntos y el tipo de dato que debe contener o devolver, quítalos para no tener problemas en Action Script 1 que es el que usas, no sé si ya hayas visto que hay programadores que usan prefijos en sus variables para indicar que tipo de variables son para ser más legibles, por ejemplo: sNombre = "pepe"; iEdad = 17; fEstatura = 1.67; (s de String, i de Integer, f de Float)

---
Todo lo demás son operaciones a nivel bit, básicamente se usan los desplazamientos binarios y la operación AND binaria para descomponer tu número hexadecimal 0xCC0000 en 0xCC, 0x00 y 0x00, puedes tomar ese camino o puedes trabajar con String que es más legible siempre y cuando ya hayas trabajado o conozcas el método SubStr y/o SubString para extraer partes de una String, supongo que parseInt y toString ya lo conoces bien, sino revisa la documentación o pregunta:

Código
  1. sColor1 = "CC0000";
  2. sColor2 = "CCCCCC";
  3.  
  4. iR1 = parseInt(sColor1.SubStr(0, 2), 16);
  5. iG1 = parseInt(sColor1.SubStr(2, 2), 16);
  6. iB1 = parseInt(sColor1.SubStr(4, 2), 16);
  7.  
  8. iR2 = parseInt(sColor2.SubStr(0, 2), 16);
  9. iG2 = parseInt(sColor2.SubStr(2, 2), 16);
  10. iB2 = parseInt(sColor2.SubStr(4, 2), 16);
  11.  
  12. iPromR = (iR1 + iR2) / 2;
  13. iPromG = (iG1 + iG2) / 2;
  14. iPromB = (iB1 + iB2) / 2;
  15.  
  16. trace(iPromR + ", " + iPromG + ", " + iPromB);
  17.  
  18. sColorPromHex = iPromR.toString(16) + iPromG.toString(16) + iPromB.toString(16);
  19. trace(sColorPromHex);

Esto devuelve:

Código
  1. 204, 102, 102
  2. cc6666
18  Foros Generales / Foro Libre / Re: hola donde puedo encontrar la pelicula y si nos enfadamos en BDremux o 1080p en: 11 Mayo 2024, 16:40 pm
Yo lo vi el año pasado en youtube a 480p, es una película antigua así que ni me aventuré a buscar mejores calidades, de todas maneras su calidad es aceptable para mi, además de que puedes descargarlo, extraer el audio y mezclarlo



Puedes usar cualquier codificador multimedia que soporte Copy como AviDemux o XMediaRecode para extraer pistas, no recodificar, ni perder calidad
19  Media / Multimedia / Re: el vlc me pide no puede identificar codec de audio y video para ver tiktok en: 9 Mayo 2024, 01:37 am
Wow, ya veo, tiktok está usando el códec HEVC en un contenedor FLV :o, eso no es estándar, por eso rompe muchos reproductores, ni mi K-Lite, ni VLC, ni SM Player, ni ffmpeg por defecto lo pueden trabajar. Quizá algún otro reproductor pueda con esta muestra que encontré en línea:
https://gitlab.com/mbunkus/mkvtoolnix/uploads/0a4372863e7164a736fe15e717e30bf9/hevc.flv

Otro reproductor muy famoso es PotPlayer https://potplayer.daum.net/ que lo reproduce y soporta URLs en línea, en caso de ffmpeg hay una versión parchada que se distribuye para yt-dlp: https://github.com/yt-dlp/FFmpeg-Builds/releases/download/autobuild-2024-05-08-14-11/ffmpeg-n7.0-28-ge7d2238ad7-win64-gpl-7.0.zip también es capaz de reproducirlo/trabajarlo

Conclusión: Usa PotPlayer en lugar de VLC

---
Al inicio probé con .m3u8, con ellos no hay problemas como mostré en mis capturas, el detalle es cuando trabajas con .flv

Haber si alguien más quiere poner a prueba su reproductor favorito con la muestra que mandé :xD
20  Media / Multimedia / Re: el vlc me pide no puede identificar codec de audio y video para ver tiktok en: 8 Mayo 2024, 14:42 pm
Tienes una URL para probar? puede que aún no estén listas las pistas de video si todo es en vivo y estarán disponibles luego, VLC usa sus propios códec y salvo que tenga problemas con ellos no debería fallar, reinstalarlo o actualizarlo también podría servir

Yo tengo K-Lite Standard y VLC, no tienen problemas ahora mismo que lo estoy probando con: https://pull-hls-l11-va01.tiktokcdn.com/game/stream-2997406859590631524.m3u8 y con otros más que he encontrado





Dudo que sea problema de un Driver o códec porque tanto VLC como K-Lite instalan, tienen o usas sus propios códec, salvo que estos estén dañados o se hayan eliminado

---
Por cierto, tanto K-lite como VLC muestran información acerca del video que estás viendo, en caso de K-Lite: Click derecho > Propiedades, en caso de VLC: Herramientas > Información del códec, ahí puedes ver los códec de video y audio que se están usando. Dudo que tengan un códec raro, pero si es uno conocido y no lo pueden decodificar ya es otra cosa
Páginas: 1 [2] 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ... 221
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines