C sharp - Ámbito de variables

   
Vista:

Ámbito de variables

Publicado por David (3 intervenciones) el 18/04/2017 19:45:01
Buenas tardes.
Estoy empezando de autodidacta con C# viniendo de php.
Quiero hacer una aplicación que te permita poner una imagen en un picturebox y poniendo el cursor encima, saber que color hay debajo del pixel. Me funcionó bien cuando ponía una imagen fija, en el programa, pero al hacerlo ahora mediante openFileDiag, la foto es del tipo Imagen y no Bitmap y no puedo acceder a las propiedades de los píxeles. La convierto a bitmap pero al volver a ponerla en el picturebox, se hace Image.
En este punto cree dos objetos. Un Image para el picturebox y un bitmap para poder acceder a sus píxeles. El problema es que (problema de novato) no puedo sacar datos del evento de botón que abre el openfiledialog.
El objeto myBitmap subrayado es el que me está dando problemas.

Os agradecería que le echarais un ojo y gracias

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
public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            Funciones llamaclase = new Funciones();
        }
 
        public void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog openFileDialog1 = new OpenFileDialog();
            openFileDialog1.Filter = "Imagen jpg|*.jpg|Imagen png|*.png";
            openFileDialog1.Title = "Seleccionar archivo de imagen";
 
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
 
                Image myImage = Image.FromFile(openFileDialog1.FileName);
                Bitmap myBitmap = new Bitmap(myImage);
                pictureBox1.Image = myImage;
 
            }
        }
 
 
        private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
        {
            int ejex = MousePosition.X;
            int ejey = MousePosition.Y;
            int ahorax = this.Location.X;
            int ahoray = this.Location.Y;
            int nuevo_ejex = ejex - ahorax - 208;
            int nuevo_ejey = ejey - ahoray - 61;
            Color pixelColor = myBitmap.GetPixel(nuevo_ejex, nuevo_ejey);
            pictureBox2.BackColor = pixelColor;
            label6.Text = "Eje X -> " + nuevo_ejex;
            label7.Text = "Eje Y -> " + nuevo_ejey;
            int rojo = pixelColor.R;
            int verde = pixelColor.G;
            int azul = pixelColor.B;
            String resul_exa = Funciones.HexRetorn(rojo, verde, azul);
 
            label1.Text = "Canal Alfa: " + Convert.ToString(pixelColor.A);
            label2.Text = "Canal R: " + Convert.ToString(pixelColor.R);
            label3.Text = "Canal G: " + Convert.ToString(pixelColor.G);
            label4.Text = "Canal B: " + Convert.ToString(pixelColor.B);
            label5.Text = "Hex: " + Convert.ToString(resul_exa);
        }
 
    }
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Ámbito de variables

Publicado por Agustin (53 intervenciones) el 18/04/2017 23:15:41
Podes declarar un campo a nivel del form, y asignar ese campo cuando cargas la imagen en el evento del boton:

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
public class Form1
{
    private Image _myImage; // <- este campo esta disponible desde cualquier miembro del Form1.
 
    public void button1_Click(object sender, EventArgs e)
    {
        var openFileDialog1 = new OpenFileDialog
        {
            Filter = "Imagen jpg|*.jpg|Imagen png|*.png",
            Title = "Seleccionar archivo de imagen"
        };
 
        if (openFileDialog1.ShowDialog() == DialogResult.OK)
        {
            _myImage = Image.FromFile(openFileDialog1.FileName);
            pictureBox1.Image = new Bitmap(_myImage);
        }
    }
 
    private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
    {
        // ....
        Color pixelColor = _myImage.GetPixel(nuevo_ejex, nuevo_ejey);
        // ....
    }
 
}

De paso limpié un poco tu código, en C# no nos gusta repetir mucho las cosas, y el lenguaje lo sabe ;)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ámbito de variables

Publicado por David (3 intervenciones) el 21/04/2017 09:22:59
Buenos días, Agustín.
Entendido el ámbito de la variable. Al sacar la creación de la variable del evento del botón, puedo acceder a ella desde toda la clase. Así mismo he visto que has hecho para limpiar el código. Muchas cosas que desconocía y te estoy muy agradecido. Así se aprende.

Sin embargo continúa uno de los problemas. La imágen sobre la que quiero averiguar el color del pixel sigue siendo del tipo Image y no Bitmap. No puedo acceder a la propiedad Getpixel.

que dolor de cabeza me está dando
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ámbito de variables

Publicado por Agustin (53 intervenciones) el 21/04/2017 17:54:56
En ese caso en lugar de guardarte una referencia al image deberias guardarte la referencia al Bitmap, no?

(en la clase)
1
private Bitmap _myBitmap;

(luego)
1
2
3
var image = Image.FromFile(openFileDialog1.FileName);
_myBitmap = new Bitmap(_myImage);
pictureBox1.Image = _myBitmap;

lo cual me hace pensar si no te conviene directamente eliminar la variable _myBitmap y obtener la referencia directamente del PictureBox, ya que apuntan al mismo objeto:

1
var myBitmap = pictureBox1.Image as Bitmap;

te deberia devolver el Bitmap, y ya no necesitas usar una variable aparte.

For the record, las "variables" a nivel de clase (o sea las que no pertenecen a un método o función específica) se llaman "campos".
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ámbito de variables

Publicado por David (3 intervenciones) el 21/04/2017 19:48:08
Apuntado lo de variables y campos.

Ya funciona como debe el código. también faltaba añadirle esto:
1
pictureBox1.MouseMove += new MouseEventHandler(pictureBox1_MouseMove);
Tengo que darle más caña a los eventos. Muchas gracias por la ayuda
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Revisar política de publicidad