Member 7924798 Ответов: 3

получение значения rgb bmp при перемещении мыши


Я хочу, чтобы получить значение RGB изображения на событие перемещения мыши в до-диез, используя aforge.net API-интерфейс.Как и при перемещении изображения мыши, то соответственно оно отображает значение rgb этой точки.
Я хочу сделать это, используя неуправляемые данные изображения и указателя. Мне не нужно использовать его getpixel() метод.любезно помогите мне.Ниже приведен мой код.
заранее спасибо

private void Form1_MouseMove(object sender, MouseEventArgs e)
        {
            // loading image
            Graphics g = CreateGraphics();
            Bitmap bmp = new Bitmap("bmpimage54.bmp");
            Rectangle r = new Rectangle(0, 0, bmp.Width, bmp.Height);
            g.DrawImage(bmp, r, r, GraphicsUnit.Pixel);
         // getting pixel values on mouse move

            Rectangle sourceRect = new Rectangle(0, 0, bmp.Width, bmp.Height);
            BitmapData imageData = bmp.LockBits(sourceRect,                    ImageLockMode.ReadWrite,PixelFormat.Format24bppRgb);
           UnmanagedImage unmanagedImage = new UnmanagedImage( imageData );
   unsafe
            {
                byte* imgPtr = (byte*)imageData.Scan0.ToPointer();
                byte* ptr;
                for (int i = 0; i < imageData.Height; i++)
                {
                    for (int j = 0; j < imageData.Width; j++)
                    {   
                        imgPtr += 3;
                    }
                    imgPtr += imageData.Stride - imageData.Width * 3;
                }
           }      
             bmp.UnlockBits(imageData);
        }

3 Ответов

Рейтинг:
22

dontumindit

почему вы применяете петлю?

как только вы узнаете координаты, вы можете использовать индексацию, то есть квадратные скобки, чтобы получить значение этого конкретного цвета

я загрузил изображение в picturebox, а затем с помощью мыши переместил событие picture box

private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
     Bitmap bmp=new Bitmap(pictureBox1.Image);
     BitmapData bd=bmp.LockBits(new Rectangle(0,0,bmp.Width,bmp.Height),ImageLockMode.ReadOnly,PixelFormat.Format24bppRgb);

     unsafe
     {
         byte* ptr = (byte*)bd.Scan0;
         int x = e.X * 3;
         int y = e.Y * bd.Stride;
         label1.Text = e.Location.ToString();
         label2.Text = ptr[x + y].ToString() + "," + ptr[x + y + 1].ToString() + "," + ptr[x + y + 2].ToString();
     }
}


из кординат вычисляется значение x, y,затем x+y используется для достижения местоположения пикселя

x+y дает значение синего цвета
x+y+1 дает значение зеленого цвета
x+y+2 дает значение красного цвета


Рейтинг:
2

Member 7924798

спасибо Абдур Рехман. Это действительно решило мою проблему.


dontumindit

thnxxxxxxxxx

[no name]

жаль, что это было по ошибке. Теперь вы можете видеть, что он полностью оценен.

Рейтинг:
2

Member 14028901

BitmapData bd;

private void detection_pictureBox_MouseMove(object sender, MouseEventArgs e)
{
    if (detection_pictureBox.Image != null)
    {
        unsafe
        {
            byte* ptr = (byte*)bd.Scan0;
            int x = e.X * 3;
            int y = e.Y * bd.Stride;
            CurrPointerPos_lbl.Text = e.Location.ToString();
            CurrPointerCol_lbl.Text = ptr[x + y].ToString() + "," + ptr[x + y + 1].ToString() + "," + ptr[x + y + 2].ToString();
        }

    }
}

private void detection_pictureBox_MouseEnter(object sender, EventArgs e)
{
    if (detection_pictureBox.Image != null)
    {
        bd = (RunImgProcess.detectionImg).LockBits(new Rectangle(0, 0, RunImgProcess.detectionImg.Width, RunImgProcess.detectionImg.Height), ImageLockMode.ReadOnly, RunImgProcess.detectionImg.PixelFormat);
    }
}

private void detection_pictureBox_MouseLeave(object sender, EventArgs e)
{
    if (detection_pictureBox.Image != null)
    {
        (RunImgProcess.detectionImg).UnlockBits(bd);
    }
}