| App inventor 2 en español  Cómo programar los teléfonos móviles con Android.
 Curso de App inventor 2 en español - Juan Antonio Villalpando
 -- Tutorial de iniciación de App Inventor 2 en español --  Volver al índice del tutorial  ___________________________ 169Y.- JavaScript. Fondo transparente. Extensión Base64. Convertir a tonos grises.   p169Y_javascript_transparente.aia
 - Mediante JavaScript vamos a convertir un color de una imagen en transparente. - Para hacer las pruebas utilizaremos imágenes de QR, cuyos colores son blanco (255,255,255) y negro (0,0,0). - Para convertir la imagen en Base64 desde la aplicación, utilizaremos mi extensión com.KIO4_Base64.aix - Establecemos el color mediante Deslizadores  blanco (255,255,255) y negro (0,0,0). Pulsamos el bótón correspondiente. - Enviamos la imagen en forma de string as código de JavaScript, además también enviamos el color que queremos hacer transparente. - Es decir, enviamos el string en Base64#255#255#255 - Utilizaré el # como delimitador. - El código de JavaScript convertirá al color: #255#255#255 en transparente.  - Y devolverá la imagen mediante otro string:  result = canvas.toDataURL().replace('data:image/png;base64,',''); 
 window.AppInventor.setWebViewString("" + result); // SALIDA APP INVENTOR
 - Además subiremos este archivo: 
        
          | transparente.html  |  
          | 
<!DOCTYPE HTML><html><head>
<!-- Code from https://jsfiddle.net/hppgLkfg/1/ -->
<!-- Modified by Juan A. Villalpando - http://kio4.com/appinventor/169Y_javascript_transparente.htm -->
</head>
<body>
<img src= "" id="code">
<script type="text/javascript">
     data = window.AppInventor.getWebViewString().split("#");  // ENTRADA APP INVENTOR. 
      base64 = data[0];
	  red = data[1];
      green = data[2];
	  blue = data[3];
document.getElementById('code').setAttribute('src', base64);
var el = document.getElementById('code');
var canvas = document.createElement('canvas');
canvas.setAttribute('width', 250);
canvas.setAttribute('height', 250);
var context = canvas.getContext("2d");
context.drawImage(el, 0, 0, canvas.width, canvas.height);
var imageData = context.getImageData(0, 0, canvas.width, canvas.height);
var preserveColor = function(imageData, color) {
	var data = imageData.data;
	for (var i = 0; i < data.length; i += 4) {
    var preserve = data[i] === color.r
      && data[i + 1] === color.g
      && data[i + 2] === color.b
      && data[i + 3] === color.a;
      
    data[i + 3] = preserve ? data[i + 3] : 0;
  }
  return imageData;
};
var newData = preserveColor(imageData, {r: parseInt(red), g: parseInt(green), b: parseInt(blue), a: 255});
context.putImageData(newData, 0, 0);
document.body.appendChild(canvas);
  result = canvas.toDataURL().replace('data:image/png;base64,','');
  window.AppInventor.setWebViewString("" +  result); // SALIDA APP INVENTOR
</script>
</body>
</html>
 |  ________________________________ - Diseño. ________________________________ - Bloques. 
 ________________________________________________________________
 ________________________________
 ________________________________
 2.- Convertir imagenes en color a tonos grises.  p169Y_javascript_gris.aia
 - Siguiendo el método que acabamos de ver, vamos a convertir una imagen en color a tonos grises. - Nos basaremos es este código: https://www.quora.com/Whats-the-most-common-way-to-edit-images-with-JavaScript 
        
          | gris.html  |  
          | 
<!DOCTYPE HTML><html><head>
<!-- Code from https://www.quora.com/Whats-the-most-common-way-to-edit-images-with-JavaScript -->
<!-- Modified by Juan A. Villalpando - http://kio4.com/appinventor/169Y_javascript_transparente.htm -->
</head>
<body>
<img src= "" id="code">
<script type="text/javascript">
     data = window.AppInventor.getWebViewString().split("#");  // ENTRADA APP INVENTOR. 
      base64 = data[0];
	  WIDTH = data[1];
      HEIGHT = data[2];
  
document.getElementById('code').setAttribute('src', base64);
var inputImage = document.getElementById('code');
var canvas = document.createElement('canvas');
canvas.setAttribute('width', parseInt(WIDTH));
canvas.setAttribute('height', parseInt(HEIGHT));
var context = canvas.getContext("2d");
context.drawImage(inputImage, 0, 0, canvas.width, canvas.height);
surface = context.getImageData(0, 0, canvas.width, canvas.height); 
///////// START CODE FOR GREY SCALE //////////
//Once you have the ImageData object you can to all your editing 
for (let y = 0; y != surface.height; y++) { 
  for (let x = 0; x != surface.width; x++) { 
    //Remember this formula! 
    //i = (y * width + x) * depth 
    let i = (y * surface.width + x) * 4; 
    //compute the average of RGB components 
    let intensity = ( 
      surface.data[i + 0] + 
      surface.data[i + 1] + 
      surface.data[i + 2] 
    ) / 3; 
    //set the RGB components to the average. Each component 
    //has the same value so it is a shade of gray 
    surface.data[i + 0] = intensity; 
    surface.data[i + 1] = intensity; 
    surface.data[i + 2] = intensity; 
  } 
} 
///////// END CODE FOR GREY SCALE //////////
/**
/////////// START CODE FOR INVERT COLOR ////////// 
for (var i = 0; i < surface.data.length; i += 4) {
     surface.data[i]     = 255 - surface.data[i];     // red
     surface.data[i + 1] = 255 - surface.data[i + 1]; // green
     surface.data[i + 2] = 255 - surface.data[i + 2]; // blue
    }
///////// END CODE FOR INVERT COLOR ///////////
 */
 
//Now you can put it back onto the canvas 
context.putImageData(surface, 0, 0); 
//From the canvas you can create a data URL 
//let url = canvas.toDataURL(); 
  result = canvas.toDataURL().replace('data:image/png;base64,','');
  window.AppInventor.setWebViewString("" +  result); // SALIDA APP INVENTOR
</script>
</body>
</html>
 |  ________________________________ - Diseño. ________________________________ - Bloques. 
 ________________________________________________________________
 ________________________________
 ________________________________
 3.- Cambio de colores.   p169Y_javascript_colores.aia
 - Cambia  todo el tono de un color. 
        
          | colores.html  |  
          | 
<!DOCTYPE HTML><html><head>
<!--  Juan A. Villalpando - http://kio4.com/appinventor/169Y_javascript_transparente.htm -->
</head>
<body>
<img src= "" id="code">
<script type="text/javascript">
     datos = window.AppInventor.getWebViewString().split("#");  // ENTRADA APP INVENTOR. 
      base64 = datos[0];
	  RED = datos[1];
      GREEN = datos[2];
	  BLUE = datos[3];
	  color = datos[4];
  
document.getElementById('code').setAttribute('src', base64);
var inputImage = document.getElementById('code');
var canvas = document.createElement('canvas');
canvas.setAttribute('width', parseInt(200));
canvas.setAttribute('height', parseInt(250));
var context = canvas.getContext("2d");
context.drawImage(inputImage, 0, 0, canvas.width, canvas.height);
surface = context.getImageData(0, 0, canvas.width, canvas.height); 
/////////// START CODE FOR COLOR ////////// 
if (color == 'r'){
for (var i = 0; i < surface.data.length; i += 4) {
      surface.data[i]     = parseInt(RED);     // red
    }
 }	
 if (color == 'g'){
for (var i = 0; i < surface.data.length; i += 4) {
     surface.data[i + 1] = parseInt(GREEN); // green
}
 }
 if (color == 'b'){
for (var i = 0; i < surface.data.length; i += 4) {
     surface.data[i + 2] = parseInt(BLUE); // blue
}
 }
///////// END CODE FOR COLOR ///////////
//Now you can put it back onto the canvas 
context.putImageData(surface, 0, 0); 
//From the canvas you can create a data URL 
//let url = canvas.toDataURL(); 
  result = canvas.toDataURL().replace('data:image/png;base64,','');
  window.AppInventor.setWebViewString("" +  result); // SALIDA APP INVENTOR
</script>
</body>
</html>
 |  ________________________________ - Diseño. ________________________________ - Bloques. 
 ________________________________________________________________
 ________________________________
 ________________________________
 4.- Pixelado de imagen.   p169Y_javascript_pixelado.aia
 - Pixelado de imagen.  
        
          | pixelado.html  |  
          | 
<!DOCTYPE HTML><html><head>
<!--  https://stackoverflow.com/questions/40833640/pixelate-image-in-node-js -->
<!--  Juan A. Villalpando - http://kio4.com/appinventor/169Y_javascript_transparente.htm -->
</head>
<body>
<img src= "" id="code">
<script type="text/javascript">
     datos = window.AppInventor.getWebViewString().split("#");  // ENTRADA APP INVENTOR. 
      base64 = datos[0];
	  pixelation = parseInt(datos[1]);
  
document.getElementById('code').setAttribute('src', base64);
var inputImage = document.getElementById('code');
var canvas = document.createElement('canvas');
canvas.setAttribute('width', parseInt(200));
canvas.setAttribute('height', parseInt(250));
var context = canvas.getContext("2d");
context.drawImage(inputImage, 0, 0, canvas.width, canvas.height);
surface = context.getImageData(0, 0, canvas.width, canvas.height); 
sourceWidth = canvas.width;
sourceHeight = canvas.height;
var data = surface.data;
for(var y = 0; y < sourceHeight; y += pixelation) {
    for(var x = 0; x < sourceWidth; x += pixelation) {
        var red = data[((sourceWidth * y) + x) * 4];
        var green = data[((sourceWidth * y) + x) * 4 + 1];
        var blue = data[((sourceWidth * y) + x) * 4 + 2];
        for(var n = 0; n < pixelation; n++) {
            for(var m = 0; m < pixelation; m++) {
                if(x + m < sourceWidth) {
                    data[((sourceWidth * (y + n)) + (x + m)) * 4] = red;
                    data[((sourceWidth * (y + n)) + (x + m)) * 4 + 1] = green;
                    data[((sourceWidth * (y + n)) + (x + m)) * 4 + 2] = blue;
                }
            }
        }
    }
}
context.putImageData(surface, 0, 0); 
 
  result = canvas.toDataURL().replace('data:image/png;base64,','');
  window.AppInventor.setWebViewString("" +  result); // SALIDA APP INVENTOR
</script>
</body>
</html>
 |  ________________________________ - Diseño. ________________________________ - Bloques. 
   __________________________________   |