-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMainPage.xaml.cs
More file actions
81 lines (75 loc) · 4.36 KB
/
MainPage.xaml.cs
File metadata and controls
81 lines (75 loc) · 4.36 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
using IronSoftware.Drawing;
namespace ColorPixelApp
{
public partial class MainPage : ContentPage
{
public MainPage()
{
InitializeComponent();
PickAndLoadImage(); // Llama a la función para seleccionar y cargar una imagen.
}
private async void PickAndLoadImage() // Función asíncrona para seleccionar y cargar una imagen.
{
var fileResult = await FilePicker.PickAsync(new PickOptions // Abre el selector de archivos para seleccionar una imagen.
{
FileTypes = FilePickerFileType.Images,
});
if (fileResult != null) // Verifica si se seleccionó un archivo.
{
var originalStream = await fileResult.OpenReadAsync(); // Abre el archivo seleccionado en modo de lectura.
var memoryStream = new MemoryStream(); // Crea un nuevo flujo de memoria.
await originalStream.CopyToAsync(memoryStream); // Copia el contenido del archivo al flujo de memoria.
memoryStream.Position = 0; // Establece la posición del flujo de memoria al inicio.
image.Source = ImageSource.FromStream(() => new MemoryStream(memoryStream.ToArray())); // Establece la fuente de la imagen a partir del flujo de memoria.
image.SizeChanged += async (s, e) => // Evento que se dispara cuando cambia el tamaño de la imagen.
{
if (image.Width > 0 && image.Height > 0) // Verifica si la imagen tiene dimensiones válidas.
{
await Task.Run(async () => // Ejecuta una tarea en segundo plano.
{
var bitmap = new AnyBitmap(memoryStream); // Crea un mapa de bits a partir del flujo de memoria.
for (int x = 0; x < bitmap.Width; x++) // Recorre cada píxel en el eje x del mapa de bits.
{
for (int y = 0; y < bitmap.Height; y++) // Recorre cada píxel en el eje y del mapa de bits.
{
var pixelColor = bitmap.GetPixel(x, y); // Obtiene el color del píxel en las coordenadas (x, y).
await this.Dispatcher.DispatchAsync(() => // Ejecuta una tarea en el hilo de la interfaz de usuario.
{
colorAndCoordinateStack.Children.Add(CreateColorStack(pixelColor, x, y)); // Añade un nuevo elemento al StackLayout con el color y las coordenadas del píxel.
});
}
}
});
}
};
}
else
{
bool answer = await DisplayAlert("Archivo no seleccionado", "Se necesita un archivo para iniciar", "OK","OK"); // Muestra una alerta indicando que el usuario no selecciono un archivo.
if (answer)
{
// Cierra la aplicación. El usuario tendrá que reiniciarla manualmente.
System.Environment.Exit(0);
}
}
}
private StackLayout CreateColorStack(IronSoftware.Drawing.Color pixelColor, int x, int y) // Función para crear un StackLayout con un BoxView y un Label.
{
var colorBox = new BoxView // Crea un nuevo BoxView.
{
Color = Microsoft.Maui.Graphics.Color.FromRgb(pixelColor.R, pixelColor.G, pixelColor.B), // Establece el color del BoxView al color del píxel.
WidthRequest = 20, // Establece el ancho del BoxView.
HeightRequest = 20 // Establece la altura del BoxView.
};
var colorAndCoordinateLabel = new Label // Crea un nuevo Label.
{
Text = $"Color: {pixelColor}, Coordenada: ({x}, {y})\n" // Establece el texto del Label al color y las coordenadas del píxel.
};
return new StackLayout // Retorna un nuevo StackLayout.
{
Orientation = StackOrientation.Horizontal, // Establece la orientación del StackLayout a horizontal.
Children = { colorBox, colorAndCoordinateLabel } // Añade el BoxView y el Label al StackLayout.
};
}
}
}