C#之Bitmap

SetPixel和GetPixel

private void btnC_Click(object sender, RoutedEventArgs e)
{
    OpenFileDialog dia = new OpenFileDialog();
    dia.Filter = "图像文件|*.png;*.bmp;*.jpg|所有文件|*.*";
    dia.Multiselect = false;
    if (dia.ShowDialog() == true)
    {
        var fileName=dia.FileName;
        Task task = new Task(() =>
        {
            DealPic(fileName);
        });
        task.Start();
    }
}
void DealPic(string fileName)
{
    var image = new Bitmap(fileName);
    for (int i = 0; i < image.Width; i++)
    {
        for (int j = 0; j < image.Height; j++)
        {
            var color = image.GetPixel(i, j);
            var newColor = System.Drawing.Color.FromArgb(color.R, 0, 0);
            image.SetPixel(i, j, newColor);
        }
    }
    

    Dispatcher.Invoke(() =>
    {
        this.image.Source = BitmapToBitmapSource(image);
        var bitmapImage = new BitmapImage();
        bitmapImage.BeginInit();
        bitmapImage.UriSource = new Uri(fileName);
        bitmapImage.EndInit();
        imageOri.Source = bitmapImage;
    });
    
}

用Graphic绘制线

 private void btnD_Click(object sender, RoutedEventArgs e)
 {
     Task task = new Task(DrawLines);
     task.Start();
 }

 void DrawLines()
 {
     Bitmap bitMap;
     using(bitMap=new Bitmap(256, 256))
     {
         using(var graph = Graphics.FromImage(bitMap))
         {
             using(var pen=new System.Drawing.Pen(System.Drawing.Color.Red, 3f))
             {
                 graph.DrawLines(pen,new PointF[]
                 {
                     new PointF(0,0),
                     new PointF(10,10),
                     new PointF(100,10),
                     new PointF(100,100),
                     new PointF(200,50),
                 });
             }
         }
         Dispatcher.Invoke(() =>
         {
             imageD.Source = BitmapToBitmapSource(bitMap);

         });
     }
 }

LockBits和UnlockBits

private void btnE_Click(object sender, RoutedEventArgs e)
{
    OpenFileDialog dia = new OpenFileDialog();
    dia.Filter = "图像文件|*.png;*.bmp;*.jpg|所有文件|*.*";
    dia.Multiselect = false;
    if (dia.ShowDialog() == true)
    {
        var fileName = dia.FileName;
        Task task = new Task(() =>
        {
            LockUnLock(fileName);
        });
        task.Start();
        //LockUnLock(fileName);
    }
}
void LockUnLock(string fileName)
{
    Bitmap bmp = new Bitmap(fileName);
    System.Drawing.Imaging.BitmapData bmpData = bmp.LockBits(new System.Drawing.Rectangle(0,0,bmp.Width,bmp.Height),
        System.Drawing.Imaging.ImageLockMode.ReadWrite,
        bmp.PixelFormat);


    IntPtr ptr = bmpData.Scan0;//第一个像素的地址
    
    int bytes = Math.Abs(bmpData.Stride //一行像素的宽度(以字节为单位)
        ) * bmp.Height;
    byte[] rgbValues = new byte[bytes];
    System.Runtime.InteropServices.Marshal.Copy(ptr,rgbValues,0,bytes);//将锁定到内存的BitmapData拷贝到rgbValues
    for(int counter = 2; counter < rgbValues.Length; counter += 3)
    {
        rgbValues[counter] = 255;
    }
    System.Runtime.InteropServices.Marshal.Copy(rgbValues, 0, ptr, bytes);//将修改后的数据拷贝到内存
    bmp.UnlockBits(bmpData);
    Dispatcher.Invoke(() =>
    {
        imageE.Source = BitmapToBitmapSource(bmp);
    });
}

直接将bitmap中的像素锁定到内存中,效率比遍历像素要高:

posted @ 2025-03-30 11:21  JohnYang819  阅读(38)  评论(0)    收藏  举报