none
cambiar el color de una imagen con setpixel RRS feed

  • Pregunta

  • hola

    busco cambiar el color de una imagen en winforms y con este codigo me funciona para colocar escala de grises:

            public Bitmap GrayScale(Bitmap Bmp)
            {
                int rgb;
                Color c;
    
                for (int y = 0; y < Bmp.Height; y++)
                    for (int x = 0; x < Bmp.Width; x++)
                    {
                        c = Bmp.GetPixel(x, y);
                        rgb = (int)((c.R + c.G + c.B) / 3);
                        Bmp.SetPixel(x, y, Color.FromArgb(rgb, rgb, rgb));
                    }
                return Bmp;
            }


    pero lo que deseo es cambiar el color rojo de la figura con colordialogbox

    utilizo este codigo:

            private void btnSeleccionarColor_Click(object sender, EventArgs e)
            {
                
                Bitmap b = new Bitmap(pictureBox1.Image);
                if (colorDialog1.ShowDialog() == DialogResult.OK)
                {
                    c = colorDialog1.Color;
                }
                for (int x = 0; x < b.Width; x++)
                {
                    for (int y = 0; y < b.Height; y++)
                    {
                        if (!b.GetPixel(x, y).ToArgb().Equals(c.ToArgb()))
                        b.SetPixel(x, y, Color.FromArgb(c.R, c.G, c.B)); 
                    }
                }
                pictureBox1.Image = b;
            }

    El Problema ES que me coloca todo el picturebox del CoLor que he colocado.....!!

    ALguna sugerencia que error tengo en el anterior codigo???

    jueves, 7 de marzo de 2013 17:36

Respuestas

  • Vos primero hacés clic en la imagen para chupar el color que vas a cambiar, y luego pulsas el botón para elegir el color de reemplazo.

    Ok, la imagen la pones en tiempo de diseño.

    using System;
    using System.Drawing;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            private Color m_color1 = Color.Beige;
    
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                Bitmap b = new Bitmap(pictureBox1.Image);
                Color c = Color.Black;
                
                if (colorDialog1.ShowDialog() == DialogResult.OK)
                {
                    c = colorDialog1.Color;
                }
    
                for (int x = 0; x < b.Width; x++)
                {
                    for (int y = 0; y < b.Height; y++)
                    {
                        if (b.GetPixel(x, y) == m_color1)
                            b.SetPixel(x, y, Color.FromArgb(c.R, c.G, c.B));
                    }
                }
                pictureBox1.Image = b;
    
            }
    
            private void pictureBox1_Click(object sender, EventArgs e)
            {
                Point p =  pictureBox1.PointToClient(Cursor.Position);
    
                m_color1 = ((Bitmap)pictureBox1.Image).GetPixel(p.X, p.Y);
            }
        }
    }
    

    • Marcado como respuesta greg_dorian lunes, 11 de marzo de 2013 16:34
    jueves, 7 de marzo de 2013 18:42

Todas las respuestas

  • Vos primero hacés clic en la imagen para chupar el color que vas a cambiar, y luego pulsas el botón para elegir el color de reemplazo.

    Ok, la imagen la pones en tiempo de diseño.

    using System;
    using System.Drawing;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            private Color m_color1 = Color.Beige;
    
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                Bitmap b = new Bitmap(pictureBox1.Image);
                Color c = Color.Black;
                
                if (colorDialog1.ShowDialog() == DialogResult.OK)
                {
                    c = colorDialog1.Color;
                }
    
                for (int x = 0; x < b.Width; x++)
                {
                    for (int y = 0; y < b.Height; y++)
                    {
                        if (b.GetPixel(x, y) == m_color1)
                            b.SetPixel(x, y, Color.FromArgb(c.R, c.G, c.B));
                    }
                }
                pictureBox1.Image = b;
    
            }
    
            private void pictureBox1_Click(object sender, EventArgs e)
            {
                Point p =  pictureBox1.PointToClient(Cursor.Position);
    
                m_color1 = ((Bitmap)pictureBox1.Image).GetPixel(p.X, p.Y);
            }
        }
    }
    

    • Marcado como respuesta greg_dorian lunes, 11 de marzo de 2013 16:34
    jueves, 7 de marzo de 2013 18:42
  • hola walter gracias por responder aunque pude resolver mi pregunta aun no obtengo totalmente lo que quiero...

    me refiero a esto: http://stackoverflow.com/questions/8075827/change-color-in-a-object-without-harming-the-texture  

    También tuve que resolver que en el evento click no se diera fuera del picturebox para que no me saliera error, no pinta parejamente la figura.

    las flechas indican que no cambia el color completamente.

    si alguien sabe de algo para cambiar una imagen les agradeceria


    jueves, 7 de marzo de 2013 20:47